ニャン吉EAの設定と注意点

あくまでニャン吉が自分用として使う前提で制作しています。まだ練習作です。
ご利用は自己責任のうえLive口座での本稼働は避けるようにお願いします。

凄く大雑把な設定となってしまいますが、前回の記事で公開したニャン吉EA100万円ごとに0.1ロットを1~2ポジションずつ通貨ペアを分散させながら持つ事を想定しています。
そのため安全圏を確保するにはEAのパラメーターにある「売り下限」「買い上限」を適切に設定する必要があります。

こちらも大雑把な感じですが、過去30年の値幅(EURについては1999年から正式導入なので1999年以降)から安全圏を設定し、ロスカットラインから4000pips以内に上限下限を設置します。
取引量の多い通貨ペア上位5つは優先して扱うべきですが、GBPJPYは上限下限の間があまりにも開きすぎるので代わりにNZDJPYと入れ替えるかもしれません。

マイナススワップのあるポジションは建値より有利な決済をしたとしてもポジション保有期間によっては損失が出てしまいます。
そのためマイナススワップ方向への上限下限設定を狭くして損失を抑えようと思います。

それぞれ大まかな過去30年(ユーロ系は20年)の値幅と、先程の条件で一応ニャン吉が安全圏と想定する「売り下限」「買い上限」の一例を以下に挙げてみます(スワップポイントを+ーで示します):
USDJPY  75ー150  売り下限・115(ー) 買い上限・110(+)
GBPJPY 115ー250  売り下限・220(ー) 買い上限・145(+)
GBPUSD 1.14ー2.1 売り下限・1.8(ー) 買い上限・1.45(ー)
EURJPY  85ー170  売り下限・130(+) 買い上限・115(ー)
EURUSD 0.8ー1.6  売り下限・1.2(+) 買い上限・1.1(ー)
NZDJPY  40ー100  売り下限・80(ー) 買い上限・75(+)

安全性重視でマイナススワップによる損失を抑えたい方は、マイナススワップ側の限度額を更に絞ってみても構いません。
但しあまり限度を絞り過ぎて対象の通貨ペアが上限と下限の間での値動きに収まると、エントリーをしないので全く儲からなくなります(例えばGBPJPYのように売り買い限度額に開きがある場合、全くエントリー出来ない間はGBPJPYでのEA稼働を止めて、その間はNZDJPYを稼働させる等の対策が可能です)。
また、くれぐれも「売り下限」と「買い上限」の数値入替が無いようにご注意ください。
間違えて売りと買いに逆の数値を入れると破滅が待っています・・・

ニャン吉EAは決して大儲けができるEAではありませんが、長期に渡っての安心感が他のEAとは違います。
バックテストでの成績を信用していないので、商用EAのようなカーブフィッティングもしてありません。
ロスカットラインを過去30年の値幅(ユーロは過去20年の値幅)の外に置くことによって、エントリーに失敗したとしても負けない事を目的としたEAです。
その為ロスカットラインは自己責任で計算して、ご自身の納得できる場所に置く必要があります。
肝心のロジックも上限下限の設定内で日足200SMAの上でRSIが70に達すれば売り、SMA下でRSIが30になれば買い、決済はトレールのみというシンプルなものです。

但し残念ながらマイナススワップ対応の利確トレールの設置には失敗しています。
そのためマイナススワップポジションの保有期間によっては個々の取引では損失がでることもあります。
また未だバックテストでは見受けられないものの、トレールが建値近くの決済になることもあり得るため、決済のスリップによっては僅かながらも損失のでる可能性があります。
(後日トレール開始値とトレールストップ幅とを別設定にしたので、設定次第ではスリップによる損失は防げるようになりました。但しマイナススワップには未だ手動対応が必要です・・・)

長期口座では全戦全勝を維持してきたニャン吉としては勝率100%のEAを作りたかったのですが、トレール機能の設定が上手くいかずこれらの点では失敗しています。
まだまだ練習作です。
これから改善して完成させていきたいと思います。
ロジックの内容もニャン吉の資金管理に反しない限り、将来的にはより稼げるロジックにしていきたいです。
本当の意味でEAが完成したら、FXはEAに任せてゲームクリアかなぁ・・・なんて夢も見ています^^;

Historical exchange rates from 1953 with graph and charts (fxtop.com)より引用
ポンド/円の長期チャート
ポンド円(GBP/JPY)の長期チャート推移と見通し (yuttari-fx.com)より引用
Click to enlarge
Historical exchange rates from 1953 with graph and charts (fxtop.com)より引用
Click to enlarge
Historical exchange rates from 1953 with graph and charts (fxtop.com)より引用
Click to enlarge
Historical exchange rates from 1953 with graph and charts (fxtop.com)より引用
NZDJPYの長期チャート
NZドル円の長期チャートとスワップポイントの特徴 (repeatfx.com)より引用

(EAコード無料公開)自分用FXMT4EAを作っていました

4月の中旬には「反省・・・OTZ」と言っていたのにもかかわらず、再度ブログの更新をサボってしまいすみませんでした(ノ_く。)
4月後半からGW連休にかけてMT4EA制作に夢中になってしまいました・・・OTZ

先程エラー無く動作したEAが完成して少し感動してしまいましたが、実はまだ思っていた通りのEAというわけではありません。
素人なので失敗ばかりしていて時間が掛かっていました。
かなりの数の失敗作を放棄して結局シンプルなものに戻ってしまったという感じです。
また時間が取れたら改訂版のEAを制作してみたいです。

ここまで話しておきながらMT4とは?EAとは?なんぞや?という方へ説明をしますと、MT4というのはメタトレーダーと呼ばれるFXの取引ツールのことで、恐らく未だにFX取引ツールとしてのシェアはNo.1なのではないかと思います。
そしてEAというのはMT4上で稼働する自動売買プログラムのことです。
今回のEAはOandaJapanのMT4の設定で作っているので、細かい設定が異なる場合にはご自身での調整が必要です。

他人の作るEAを信用せずにご自身で納得できるEAを作る事をお勧めしますが、自分用の記録あるいは改良の進捗状況の参考程度にコードをこの記事の下に貼ります。
まだ練習作一号なので内容を何一つ保証できません。自己責任でご利用ください。
特にLive口座での稼働はお勧めできません。
逆にこう書くべきみたいなのがあれば教えて貰えると嬉しいです。

MT4の画面ですと「自動売買」ボタンの左3つ隣に「メタクウォーツ言語エディタ」ボタンがあり、それを押してMetaEditorを開いてから「新規作成」ボタンを押してコードをコピペしてから任意の名前を付けて保存して「コンパイル」ボタンを押せば、MT4再起動後「ナビゲーター」から個別のチャートへEAを貼る事でお試しのEA稼働ができるはずです。

「FX勝率100%の方法」「FX全戦全勝の方法計算例 」の記事でも説明しましたように、ニャン吉は損切りの必要のない資金管理を重視しています。
今回制作したEAはこの考えを実行することを意図していて、設定次第では損切りの必要がありません
逆にいうと設定次第では全戦全勝どころかひたすら負ける可能性もあるので、今回のEAを真似する場合には設定内容には充分に注意してください。
また、大まかに言うと100万円で0.1ロットを1~2ポジション(1通貨ペア1ポジション)の割合で利用するように作りました。相変わらずの安全優先です。

本当は全戦全勝、勝率100%と言いたいところですが、今回のEAはほぼ建値決済の可能性もあり約定のスリップ次第では理論上個々の取引でスリップ分負ける可能性があります。
またスワップ次第では損益がマイナスになってしまうこともあるので注意が必要です。
マイナススワップの方向でのエントリーには上限下限の設定を用いて大きめに制限を掛けるようにしてください。

今回のEAは上限下限の設定内で日足200SMAの上でRSIが70に達すれば売り、SMA下でRSIが30になれば買いというシンプルなものです。
一応RSIの折り返しでエントリーするように条件を追加してありますが、細かい上下にも反応してしまうので、結局あまりエントリーポイントに差はありませんでした。
決済はトレールストップのみの100pips幅設定にしてあります。
バックテストでは仕様上、含み損を期末に強制決済されてしまうので、バックテストを利用する場合には最終取引を無視してください
実際の取引では期間末に強制決済なんて行われず、含み損に耐える事を前提としたEAです。

バックテストで遊んだ後はMT4の「データフォルダーを開く」から「tester」の中にある「history」と「logs」にゴミファイルが貯まるので捨てた方がいいです。放置するとドライブディスク容量を占拠してしまいます。
間違っても「tester」の中ではない方の「history」と「logs」は触ってはいけません!
とんでもないことになりますよ(ノ_く。)

今回のEAは一旦USDJPY日足での使用を前提として設定をしてありますが、GBPJPYのように動きが激しい通貨ペアなら「買い上限」「売り下限」を調整して安全圏を確保することをお勧めします。

例えば買い上限109.0を150.0にしたり、売り下限111.0を215.0にするとGBPJPYの実効レバレッジ2倍程度でもなんとか耐えられるようになります。

今回のEAでは安全性を重視してレバレッジ2倍くらいになるように、ポジション数上限下限の設定でレバレッジ調整をすることを強くお勧めします。
レバレッジやポジション計算には「FX勝率100%の方法」で紹介した計算方法の他、証拠金・損益シミュレーション | OANDA FX計算ツール (hirose-fx.co.jp)を利用してみてください。

過去の記事から何度も繰り返しとなってしまいますが、まずはロスカットラインを過去30年の値幅の外に置いて安全圏を確保することを重視しましょう。
本人が納得できる長期的に見ても到達することのない価格にロスカットラインを設定することによって損切りそのものが不要となります。損切り貧乏にならなくて済むわけです。
このEAには損切りの機能がありません。
ロスカットラインは自己責任で計算して、ご自身の納得できる場所に置いてください。
通貨ペアによって異なりますがレバレッジ2倍のロットとポジションなら、ロスカットラインから4000pips以内に売り買いの上限下限を設定しておけば充分安全だと思います。

1通貨ペアにつき1ポジションの設定になっているので、資金に余裕があればロット数を増やすよりも、複数の通貨ペアにEAを設定するとリスク分散にもなり安全性が高まります。
ポジション数や設定についての細かい話はまた後日にしたいと思います。
特にトレーリング設定で改良の必要性はあるものの、とりあえず欲しかった内容のEAが完成してホッとしました^^

//+------------------------------------------------------------------+
//|                                                          ニャン吉EA |
//|                       商用利用及び再配布を禁じます,c2021.5.5,ニャン吉ちゃんねる|
//|                                          https://ニャン吉ちゃんねる.com |
//|                                      (OandaMT4を前提とした設定内容です) |
//+------------------------------------------------------------------+
#property copyright   "商用利用及び再配布を禁じます,c2021.5.5,ニャン吉ちゃんねる"
#property link        "https://ニャン吉ちゃんねる.com"
#property description "(OandaMT4を前提とした設定内容です)"
#property strict

input int    Magic =11;//通貨ペア毎に別ナンバー割り振る(0は避ける)
input double Lot =0.1;//ロット(ロット数よりも通貨ペアを追加してポジション数増を推奨)
input double Kagen =120;//売り下限(デフォルトはUSDJPYでの一例)
input double Jougen =108;//買い上限(デフォルトはUSDJPYでの一例)

input int MAPeriod =200;//SMA(日足チャート推奨・200を推奨)
input int TrailingStart =1000;//トレール開始幅(1000points=100pips)
input int TrailingStop  =300;//トレールストップ幅(500points=50pips)
input int MaxSpread  =30;//スプレッドによるエントリー制限(30points=3pips)
input int MaxSlippage =10;//スリッページによるエントリー制限(10points=1pip)

int      RSIPeriod  =9;
double   RSIUpper   =70;
double   RSILower   =30;
double   TakeProfit =0;

   //エントリーカウント
   int CurrentOrder()
    {
   int cnt=0; 
   for(int i=0;i<OrdersTotal();i++) {   
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;     
      if(OrderType()==OP_BUY) {
         cnt++;
      }
      if(OrderType()==OP_SELL){
         cnt++;
      }   
    }
    return(cnt);
    }   

void OnTick(void)
  {
   double MACurrent,RSICurrent;
   int    cnt,ticket,total;

   if(Bars<100)
     {
      Print("bars less than 100");
      return;
     }

   MACurrent=iMA(NULL,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE,0);
   RSICurrent=iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,0);
   total=OrdersTotal();   

   if(CurrentOrder()<1)
     {   
     
      if(AccountFreeMargin()<(1000*Lot))
        {
         Print("We have no money. Free Margin = ",AccountFreeMargin());
         return;
        }


    // 買エントリー処理
    if(Ask<Jougen && Ask<MACurrent && RSICurrent<RSILower && MarketInfo(Symbol(),MODE_SPREAD)<MaxSpread )
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,MaxSlippage,0,0,NULL,Magic,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("BUY order opened : ",OrderOpenPrice());
           }
         else
            Print("Error opening BUY order : ",GetLastError());
         return;
        }

    // 売エントリー処理
    if(Bid>Kagen && Bid>MACurrent && RSICurrent>RSIUpper && MarketInfo(Symbol(),MODE_SPREAD)<MaxSpread )
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,MaxSlippage,0,0,NULL,Magic,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("SELL order opened : ",OrderOpenPrice());
           }
         else
            Print("Error opening SELL order : ",GetLastError());
        }
        
      return;
     }

   // トレールストップ処理
   for(cnt=0;cnt<total;cnt++)
     {
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {

         if(OrderType()==OP_BUY)
           {
            if(TrailingStop>0)
              {
               if(Bid-OrderOpenPrice()>Point*TrailingStart)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
                        Print("OrderModify error ",GetLastError());
                     return;
                    }
                 }
              }
           }
         else 
           {
            if(TrailingStop>0)
              {
               if((OrderOpenPrice()-Ask)>(Point*TrailingStart))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
                        Print("OrderModify error ",GetLastError());
                     return;
                    }
                 }
              }
           }
        }
     }
  }

ETFの自動積立について

以前の記事「リアルライフのチート?君の人生には2つもあるよ!なんで使わないの?」でパフォーマンスや管理費用・信頼性の面で投資信託よりもメリットのあるETFクレジットカードでの自動積立は不可であることを言及しました。

しかしながらSBI証券なら証券口座あるいは住信SBIネット銀行からのETFの定期購入設定が可能です。
その際、SBI証券でETFの代金支払いを円貨決済で済ませることもできますが手数料が1ドルあたり0.25円掛かってしまいます。
その点、住信SBIネット銀行で外貨積立設定を行えば手数料も安くなり1ドルあたり0.04円とお得です。
SBI証券でこの方法を採る場合、住信SBIネット銀行外貨決済の両方を利用することをおすすめします。

こう見ると住信SBIネット銀行で外貨積立設定を行い、SBI証券でドル決済ETF定期購入の設定をすればお得にほったらかし投資ができることになります。
でも実はこの方法、ドルコスト平均法を採るためには少しばかり高額の積立が必要になってしまうので、あまりお手軽な投資とは言えなくなってしまいます。
もちろんETFのほうがパフォーマンスや管理費用・信頼性の面で投資信託よりもメリットがあるので、ある程度積立て投資をメインに考えているに方ならお勧めであることには変わりありません。

ただ毎月5万~10万程度の積立を考えているのなら、このETF自動購入では折角のドルコスト平均法のメリットを活かせない可能性があります。
なぜならETFの積立では実質的には定額購入ができないからです(ノ_く。)
SBI証券にかかわらずETF定期購入のデメリットとしては、唯一これだけなのですが、これこそが一番大きいデメリットなのです。

ドルコスト平均法定額購入をするからこそ単なる平均分散とは異なり、数量を等分するのではなく金額を等分することによって単なる平均よりもより安く有利に購入しています。
ドルコスト平均法は長期に渡って定額購入だからこそ価格が高い時は購入数量が少なく安い時にはより多くのETFを購入できるのです。

さて、今回のSBI証券ETF自動定期購入の話に戻ります。
先週末のVTIの価格は217.15ドルでした。そしてVOOは383.63ドルでした。
ETFは投資信託とは異なり一口が表示基準額と同額である為、基準額に満たない金額ではETFを購入することができません。投資信託なら表示基準額で1万口なので細かく端数まで対応できて定額での積立が可能です。
そのため例えば月5万円の積立ですと多少どころか、かなり大きな価格変動があってもVTIは2口、VOOは1口購入のままです。
値段が多少安くなってもおそらく購入数量は変わらず、定額購入ではなく実質定数購入となってしまう可能性が高いです。
そのため折角SBI証券ETF定期購入の設定で「金額指定」をしたとしても、少額積立だと「株数指定」と変わらないわけです。

ETFの自動積立を以前お勧めしなかったのにはこのような訳であって、表示基準額以下でも定額購入が可能な投資信託のクレジットカード払いをお勧めしていました。
しかしながら、毎月の積立金額を50万~100万と上げれば定額購入としてドルコスト平均法のメリットも活かせるため、もちろんETFの自動購入のほうがメリットも大きいです。
ただ本格的に投資はETF定期積立一本という方でもなければ毎月50~100という負担は大きいはずです。
特に定額積立では無理をしない事が大事なので、お手軽に月5万(クレジットカード積立の上限金額)の投資信託積立でも充分な投資なのではないでしょうか?