前回は、人気のリピート系注文をEA化する方法を解説しました。
ただし、”買いのみ”の最もシンプルな形でした。
今回は、前回の応用として、”売りのみ”のリピート系注文をEA化する方法を解説します。
買いのEAと売りのEAを揃えれば、戦略の幅が大きく広がります。
もちろん、いつもどおり超簡単に自作できます。前回作ったEAのソースコードをほんの少し書き換えるだけですから。
最後あたりでEAの完成品を無料ダウンロードできるので、ぜひ読んで行ってください。
リピート系EA『Repeat-If-Done-Sell.mq4』の内容
今回自作するリピート系EAは、”売りのみ”です。
EAの内容は、以下のとおりです。
- 保有ポジションがなく、現在値が予想レンジの上限値~下限値にあれば、成行で売り注文(リピート注文の1本目)をオーダーします。損切り設定はなし、利益確定は刻み幅(TakeProfit)と同額です。
- リピート注文の2本目以降は、現在値が、保有ポジションの建値から刻み幅だけ上がれば、成行で売り注文をオーダーします。損切り設定はなし、利益確定は刻み幅と同額です。
MetaEditor の起動
最初に、前回の記事から、EA「Repeat-If-Done-Buy.mq4」をダウンロードし、解凍しておきます(記事の最後あたりにダウンロードボタンがあります)。
それでは、ソースコードを書き換えていきます。
MT4の「メタクォーツ言語エディタ」をクリックします。
MeTaEditorが立ち上がったら、画面左側の「Navigater」内のツリーから「Experts」をダブルクリックします。
先ほど解凍した「Repeat-If-Done-Buy.mq4」をソースコードの上にドラッグ&ドロップすると、ソースコードが開きます。
リピート系EA『Repeat-If-Done-Short.mq4』の自作
次に、名前をつけてファイルを保存します。
「Repeat-If-Done-Buy.mq4」が開いている状態で、「File」→「Save As…」 をクリックします。
ファイル名を「Repeat-If-Done-Short.mq4」と打ち込んで保存します。
外部パラメーターの変更
カーソルを13行目に移動します。
ここでは、変数の宣言が記述されています。
inputで始まる変数(input変数)では、ユーザーが変更できるパラメーターを設定しています。
【変更前】
input double TakeProfit =1000;
input double Lots =0.1;
input double UpperPrice =148;
input double LowerPrice =75;
double FirstBuyPrice;
【変更後】
input double TakeProfit =1000;
input double Lots =0.1;
input double UpperPrice =148;
input double LowerPrice =75;
double FirstSellPrice;
リピート注文1本目の建値を保存するための変数「FirstBuyPrice」を「FirstSellPrice」に変更しました。
リピート注文1本目を記述
カーソルを下に移動させます。
ここでは、リピート注文の1本目に関して記述されています。
【変更前】
//--- 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 Short position (SELL) possibility if(Bid < UpperPrice && Bid > LowerPrice) { ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"Repeat-If-Done",16384,0,Red); if(ticket>0) { FirstSellPrice = Bid; if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return; }
以下のとおり、リピート注文の1本目に関する記述を”買い”から”売り”に変更しました。
サイン(if文のカッコ内)を、現在値(Bid)が予想レンジの上限値と下限値の間にあることに変更しました。
注文命令(ticket=OrderSend())は、成行で売り(OP_SELL)、損切り設定なし、利益確定は刻み幅(TakeProfit)と同額です。あと、グラフの記号の色を青から赤に変更しました。
「FirstSellPrice」に代入する値を Ask から Bid に変更しました。
オーダー成功時と失敗時に出すコメント文を BUY から SELL に変更しました。
リピート注文2本目以降を記述
カーソルを下に移動させます。
ここでは、リピート注文の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) { //--- 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;
【変更後】
//--- 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_SELL) { //--- if(Bid > FirstSellPrice+TakeProfit*total*Point) { ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"Repeat-If-Done",16384,0,Red); if(ticket > 1) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened :",OrderOpenPrice()); else Print("Error opening SELL order :",GetLastError()); return;
以下のとおり、リピート注文の2本目以降に関する記述を”買い”から”売り”に変更しました。
保有ポジションの確認(OrderType())を、成行買い(OP_BUY)から成行売り(OP_SELL)に変更しました。
サイン(if文のカッコ内)を、現在値(Bid)が保有ポジションの建値に刻み幅(TakeProfit)を足した値より大きいことに変更しました。
注文命令(ticket=OrderSend())は、先に記述したリピート注文の1本目とまったく同じです。
オーダー成功時と失敗時に出すコメント文も、1本目と同じく BUY から SELL に変更しました。
ソースコードの書き換えは以上です。
一応、記事の最後あたりに、完成品をダウンロードできるよう置いておきます。
ソースコードをコンパイルする
記述し終わったら、「Compile」をクリックします。
記述ミスがなければ、Destrictionに、「0 error(s), 0 warning(s)」と表示されます。
コンパイルとは、プログラムのソースコードをコンピューターが実行可能な機械語に翻訳することです。
ソースコードに記述ミスがあった場合は、エラーとなります。
エラーがでた場合は、記述を修正して再びコンパイルしましょう。
以下は、よくあるエラーの例です。気を付けましょう。
- 全角で記述している(ソースコードはすべて半角で記述します)
- 変数の型(”int”や”double”など)が違う
- カッコ(” { ” や ” } “)が足りない(多い)
- ” ; ” が抜けている
バックテスト
せっかくオリジナルEAが完成したのですから、バックテストしてみましょう。
バックテストのやり方は別記事にまとめています。
以下は、USD/JPYで2017.1~2018.12の2年間のヒストリカルデータでバックテストした結果です。
プログラムは問題なく動いています。
一部を除けば、きれいな右肩上がりのグラフです。
最後の部分で負けているのはバックテストだからです。テストの最後で保有ポジションをすべて決済するためであり、実運用であれば保有し続けるポジションです。
まとめ|自作EA無料配布
今回は、前回の応用として、”売りのみ”のリピート系注文をEA化する方法を解説しました。


もちろん、いつもどおり超簡単に自作できます。前回作ったEAのソースコードをほんの少し書き換えるだけですから。
ぜひあなたの勝てるEA作りに役立ててください。
完成品(Repeat-If-Done-Sell.zip)はこちらからダウンロードできます。
・本EAは、あくまでMQL4言語の学習用に無料配布するものです。なので、再配布はやめてください。
・もし、当サイトを宣伝して頂けたり、下のバナーから『XMTrading』の口座を開設していただけると、みなさんに役立つサイト作りをもっともっと頑張れます(*^▽^*)