現在、リピート系注文は最も人気のある投資手法です。
その証拠に、”トラリピ”、”ループイフダン”、”トライオートFX”、”iサイクル2取引”など多くのFX業者がリピート系注文のサービスを提供しています。
今回は、MQL4言語入門として、人気のリピート系注文をEA化する方法を解説します。
もちろん、いつもどおりの超簡単な自作方法です。すでに出来上がっているサンプルEAのソースコードの一部を書き換えるだけですから。
最後あたりでEAの完成品を無料ダウンロードできるので、ぜひ読んで行ってください。
リピート系注文とは?
実は、昔から知られている手法です。例えば、ポンド円を1円刻みで仕掛け1円利益が取れたら手仕舞いする、これを繰り返すだけです。
最近になって人気が出たのは、昔は手動で繰り返し行っていた注文作業が、自動化され、システムトレードができるようになったことが大きな理由です。
例えば、ドル円が110円のときに、取引ロット数は0.1(10000通貨)、利益確定は+1円、刻み幅は1円、と設定すれば、トレーディングソフトが以下のように自動売買をしてくれます。
まず110円で0.1ロット買います。
相場が上昇していけば、111円で決済し、新たに111円で0.1ロット買います。
相場が下落していけば、109円で0.1ロット買い足します。
このような取引を繰り返します。
予想レンジ内で上下動を繰り返すような相場状況では、取引を何度も繰り返して利益を積み上げることができるそうです。
ネット上では、「トラリピで合計○○円稼いだ」とか「毎月○○円儲かる」とか、誰でも簡単に儲かる、そんな話であふれています。
リピート系注文とMT4
MT4は、リピート系注文といろんな意味で相性がいいです。
そのため、多くの個人トレーダーが、リピート系注文のサービスを提供しているFX業者ではなく、MT4でリピート系注文をしています。
- ルールがシンプルなので簡単にEAが作れる。
- ルールに独自のアレンジを加えることも簡単。
- リピート系注文のサービスを提供しているFX業者のほとんどが高い取引手数料をとるのに対し、MT4対応のFX業者のほとんどが手数料無料。
- 取引効率を上げるためにレバレッジ規制のない海外FX業者を使いたい。海外FX業者はリピート系注文のサービスを提供していないので、MT4を使うしかない。
リピート系EA『Repeat-If-Done-Buy.mq4』の内容
今回自作するリピート系EAは、”買いのみ”の最もシンプルな形です。
まずは、一番シンプルな形でEAを作って、その後でいろいろな機能を追加していきましょう。
実際、これだけで十分シストレできるのですが、一応、次回は応用編(売りルール)も解説します。
EAの内容は、以下のとおりです。
- 保有ポジションがなく、現在値が予想レンジの上限値~下限値にあれば、成行で買い注文(リピート注文の1本目)をオーダーします。損切り設定はなし、利益確定は刻み幅(TakeProfit)と同額です。
- リピート注文の2本目以降は、現在値が、保有ポジションの建値から刻み幅だけ下がれば、成行で買い注文をオーダーします。損切り設定はなし、利益確定は刻み幅と同額です。
MetaEditor の起動
それでは、サンプルコード「MACD Sample.mq4」のソースコードを書き換えて、リピート系EAを作っていきます。
MT4の「メタクォーツ言語エディタ」をクリックします。
MeTaEditorが立ち上がったら、画面左側の「Navigater」内のツリーから「Experts」をダブルクリックします。
「Experts」のツリーから「MACD Sample.mq4」をダブルクリックすると、ソースコードが開きます。
リピート系EA『Repeat-If-Done-Buy.mq4』の自作
まず最初に、名前をつけてファイルを保存します。
「MACD Sample.mq4」が開いている状態で、「File」→「Save As…」 をクリックします。
ファイル名を「Repeat-If-Done-Buy.mq4」と打ち込んで保存します。
外部パラメーターの変更
カーソルを9行目に移動します。
ここでは、inputで始まる変数(input変数)の宣言が記述されています。
input変数では、ユーザーが変更できるパラメーターを設定しています。
【変更前】
input double TakeProfit =50; input double Lots =0.1; input double TrailingStop =30; input double MACDOpenLevel =3; input double MACDCloseLevel=2; input int MATrendPeriod =26;
【変更後】
input double TakeProfit =1000; input double Lots =0.1; input double UpperPrice =125; input double LowerPrice =75; double FirstBuyPrice;
「TakeProfit」と「Lots」を除いてすべて入れ替えます。
『TakeProfit』は利益確定だけでなく、刻み幅としても使います。値を、1000Point(ドル円なら1円)刻みに変更しました。
『リピート系EA』ではテクニカルインジケーターは一切使わないので、MACDや移動平均線(MA)のパラメーターをすべて削除しました。
代わりに、予想レンジの上限値「UpperPrice」と下限値「LowerPrice」を追加しました。
また、リピート注文1本目の建値を保存するための変数「FirstBuyPrice」を追加しました。
テクニカルインジケーター変数の宣言の削除
カーソルを下に移動させます。
ここでは、テクニカルインジケーター変数の宣言を記述しています。
double MacdCurrent,MacdPrevious;
double SignalCurrent,SignalPrevious;
double MaCurrent,MaPrevious;
int cnt,ticket,total;
MACDやMAの計算結果を入れる変数はもう不要なので、すべて削除しました。
テクニカルインジケーター関数の削除
カーソルを下に移動させます。
ここでは、テクニカルインジケーターを計算し、各変数に代入しています。
//--- to simplify the coding and speed up access data are put into internal variables
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
すべて不要なので削除しました。
リピート注文1本目を記述
カーソルを下に移動させます。
ここでは、買いエントリーのサインと注文命令、次に売りエントリーのサインと注文命令が記述されています。
【変更前】
//--- check for long position (BUY) possibility if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,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; } //--- check for short position (SELL) possibility if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,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()); }
【変更後】
//--- check for long position (BUY) possibility if(Ask < UpperPrice && Ask > LowerPrice) { ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"Repeat-If-Done",16384,0,Blue); if(ticket>0) { FirstBuyPrice = Ask; if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return; }
買い関係の記述(//— check for long position (BUY) possibility)について、以下のとおり、リピート注文の1本目に関する記述に変更しました。
サイン(if文のカッコ内)を、現在値(Ask)が予想レンジの上限値と下限値の間にあることに変更しました。
注文命令(ticket=OrderSend())は基本的にそのままです。成行で買い注文(OP_BUY)、損切り設定なし、利益確定は刻み幅(TakeProfit)と同額です。注文コメントだけ変更しました。
売り関係の記述(//— check for short position (SELL) possibility)については、今回は不要なのですべて削除しました。
リピート注文2本目以降を記述
カーソルを下に移動させます。
ここでは、買いポジションの決済サインと決済注文命令、次に売りポジションの決済サインと決済注文命令が記述されています。
【変更前】
//--- it is important to enter the market correctly, but it is more important to exit it correctly... 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) { //--- should it be closed? if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { //--- close order and exit if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError()); return; } //--- check for trailing stop if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { //--- modify order and exit if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green)) Print("OrderModify error ",GetLastError()); return; } } } } else // go to short position { //--- should it be closed? if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) { //--- close order and exit if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("OrderClose error ",GetLastError()); return; } //--- check for trailing stop if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { //--- modify order and exit if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red)) Print("OrderModify error ",GetLastError()); return; }
【変更後】
//--- it is important to enter the market correctly, but it is more important to exit it correctly... 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(Ask < FirstBuyPrice-TakeProfit*total*Point) { ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"",16384,0,Blue); if(ticket > 1) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened :",OrderOpenPrice()); else Print("Error opening BUY order :",GetLastError()); return;
保有ポジションの有無を確認する記述まで残し、その下の記述(//— class=”strike”>should it be closed? 以下)をすべて削除しました。
代わりに、以下のとおり、リピート注文の2本目以降に関する記述に変更しました。
サイン(if文のカッコ内)は、現在値(Ask)が保有ポジションの建値から刻み幅(TakeProfit)を引いた値より小さいこと。
注文命令(ticket=OrderSend())は、先に記述したリピート注文の1本目とまったく同じです。
ソースコードの書き換えは以上です。
一応、記事の最後あたりに、完成品をダウンロードできるよう置いておきます。
ソースコードをコンパイルする
記述し終わったら、「Compile」をクリックします。
記述ミスがなければ、Destrictionに、「0 error(s), 0 warning(s)」と表示されます。
コンパイルとは、プログラムのソースコードをコンピューターが実行可能な機械語に翻訳することです。
ソースコードに記述ミスがあった場合は、エラーとなります。
エラーがでた場合は、記述を修正して再びコンパイルしましょう。
以下は、よくあるエラーの例です。気を付けましょう。
- 全角で記述している(ソースコードはすべて半角で記述します)
- 変数の型(”int”や”double”など)が違う
- カッコ(” { ” や ” } “)が足りない(多い)
- ” ; ” が抜けている
バックテスト
せっかくオリジナルEAが完成したのですから、バックテストしてみましょう。
バックテストのやり方は別記事にまとめています。
以下は、USD/JPYで2017.1~2018.12の2年間のヒストリカルデータでバックテストした結果です。
プログラムは問題なく動いています。
最後を除けば、きれいな右肩上がりのグラフです。
最後の部分で負けているのはバックテストだからです。テストの最後で保有ポジションをすべて決済するためであり、実運用であれば保有し続けるポジションです。
まとめ|自作EA無料配布
今回は、MQL4言語入門として、リピート系注文をEA化する方法を解説しました。
もちろん、すでに出来上がっているサンプルEAのソースコードの一部を書き換えるだけの、いつもどおりの超簡単な自作方法です。
ぜひあなたの勝てるEA作りに役立ててください。
完成品(Repeat-If-Done-Buy.zip)はこちらからダウンロードできます。
・本EAは、あくまでMQL4言語の学習用に無料配布するものです。なので、再配布はやめてください。
・もし、当サイトを宣伝して頂けたり、下のバナーから『XMTrading』の口座を開設していただけると、みなさんに役立つサイト作りをもっともっと頑張れます(*^▽^*)
次回以降も、リピート系注文をEA化する方法を解説します。