MQL4言語入門|リピート系注文をEA化する超簡単な方法②|売りのみ

この記事は約10分で読めます。

MQL言語入門|リピート系注文をEA化する超簡単な方法[応用編]

前回は、人気のリピート系注文を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」をソースコードの上にドラッグ&ドロップすると、ソースコードが開きます。

MACDインジケーター起動

 

スポンサーリンク

リピート系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)」と表示されます。

MAC-STOCのコンパイル

 

コンパイルとは、プログラムのソースコードをコンピューターが実行可能な機械語に翻訳することです。

ソースコードに記述ミスがあった場合は、エラーとなります。

エラーがでた場合は、記述を修正して再びコンパイルしましょう。

 

以下は、よくあるエラーの例です。気を付けましょう。

 

  • 全角で記述している(ソースコードはすべて半角で記述します)
  • 変数の型(”int”や”double”など)が違う
  • カッコ(” { ” や ” } “)が足りない(多い)
  • ” ; ” が抜けている

 

スポンサーリンク

バックテスト

せっかくオリジナルEAが完成したのですから、バックテストしてみましょう。

バックテストのやり方は別記事にまとめています。

 

 

以下は、USD/JPYで2017.1~2018.12の2年間のヒストリカルデータでバックテストした結果です。

リピート系EAバックテスト(USDJPY売りのみ)

 

プログラムは問題なく動いています。

一部を除けば、きれいな右肩上がりのグラフです。

最後の部分で負けているのはバックテストだからです。テストの最後で保有ポジションをすべて決済するためであり、実運用であれば保有し続けるポジションです。

 

スポンサーリンク

まとめ|自作EA無料配布

今回は、前回の応用として、”売りのみ”のリピート系注文をEA化する方法を解説しました。

 

 

もちろん、いつもどおり超簡単に自作できます。前回作ったEAのソースコードをほんの少し書き換えるだけですから。

ぜひあなたの勝てるEA作りに役立ててください。

 

完成品(Repeat-If-Done-Sell.zip)はこちらからダウンロードできます。

・本EAは、あくまでMQL4言語の学習用に無料配布するものです。なので、再配布はやめてください。
・もし、当サイトを宣伝して頂けたり、下のバナーから『XMTrading』の口座を開設していただけると、みなさんに役立つサイト作りをもっともっと頑張れます(*^▽^*)

タイトルとURLをコピーしました