MQL4言語入門|リピート系注文をEA化する超簡単な方法③|ハーフ&ハーフ

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

MQL4言語入門|リピート系注文をEA化する超簡単な方法③|ハーフ&ハーフ

これまでに、人気のリピート系注文をEA化する方法を2回にわたって解説しました。

 

 

今回は、第3回目として、リピート系注文を進化させたハーフ&ハーフをEA化します。

売りと買いを織り交ぜたハーフ&ハーフを使えば、少ない資金で広い価格帯をカバーできます。

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

最後あたりでEAの完成品を無料ダウンロードできるので、ぜひ読んで行ってください。

 

スポンサーリンク

ハーフ&ハーフとは?

リピート系注文のハーフ&ハーフは、売りと買いの境界価格を定め、その価格より下の価格レンジでは買い注文を繰り返し、上の価格レンジでは売り注文を繰り返し行う投資手法です。

例えば、下図のように、境界価格を予想値幅の中間に設定し、境界価格~予想下値では買い注文を繰り返し、予想上値~境界価格では売り注文を繰り返します。

ハーフ&ハーフのイメージ

 

メリットは、売りのレンジと買いのレンジは重ならないので、カバーすべき値幅が実質的に半分になるところにあります。

つまり、ハーフ&ハーフを使えば、少ない資金で広い価格エリアをカバーできるというわけです。

 

スポンサーリンク

EA『Repeat-If-Done-Half.mq4』の内容

今回自作するEAの内容は、以下のとおりです。

現在値が境界価格~予想値幅の下限にある場合、

  • 保有ポジションがなければ、成行で買い注文(リピート注文の1本目)をオーダーします。損切り設定はなし、利益確定は刻み幅(TakeProfit)と同額です。
  • リピート注文の2本目以降は、現在値が、保有ポジションの建値から刻み幅だけ下がれば、成行で買い注文をオーダーします。損切り設定はなし、利益確定は刻み幅と同額です。

現在値が予想値幅の上限~境界価格にある場合、

  • 保有ポジションがなければ、成行で売り注文(リピート注文の1本目)をオーダーします。損切り設定はなし、利益確定は刻み幅(TakeProfit)と同額です。
  • リピート注文の2本目以降は、現在値が、保有ポジションの建値から刻み幅だけ上がれば、成行で売り注文をオーダーします。損切り設定はなし、利益確定は刻み幅と同額です。

 

スポンサーリンク

MetaEditor の起動

まず最初に、前回の記事から、EA「Repeat-If-Done-Buy.mq4」をダウンロードし、解凍しておきます(記事の最後あたりにダウンロードボタンがあります)。

 

 

それでは、ソースコードを書き換えていきます。

MT4の「メタクォーツ言語エディタ」をクリックします。

メタエディター起動

 

MeTaEditorが立ち上がったら、画面左側の「Navigater」内のツリーから「Experts」をダブルクリックします。

先ほど解凍した「Repeat-If-Done-Buy.mq4」をソースコードの上にドラッグ&ドロップすると、ソースコードが開きます。

MACDインジケーター起動

 

スポンサーリンク

EA『Repeat-If-Done-Half.mq4』の自作

次に、名前をつけてファイルを保存します。

「Repeat-If-Done-Buy.mq4」が開いている状態で、「File」→「Save As…」 をクリックしていきます。

ファイル名を「Repeat-If-Done-Half.mq4」と打ち込んで保存します。

メタエディター保存

 

外部パラメーターの変更

カーソルを13行目に移動します。

ここでは、変数の宣言が記述されています。

inputで始まる変数(input変数)では、ユーザーが変更できるパラメーターを設定しています。

input double TakeProfit    =1000;
input double Lots          =0.1;
input double UpperPrice    =148;
input double LowerPrice    =75;
input double HarfPrice     =110;
double FirstBuyPrice;
double FirstSellPrice;

売りと買いの境界価格を保存するためのinput変数「HarfPrice」を追加しました。

リピート注文1本目の建値を保存するための変数「FirstBuyPrice」の下に「FirstSellPrice」を追加しました。

 

売りのリピート注文1本目を追記

カーソルを下に移動させます。44行目です(上段の2行追加後)。

44行目から57行目までは、リピート注文1本目の買い注文が記述されています。

//--- check for long position (BUY) possibility
if(Ask < HarfPrice && 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 && Ask > HarfPrice)
{
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;
}
}

45行目で、買い注文するレンジの上限を、予想レンジの上限値(UpperPrice)から境界価格(HarfPrice)に変更しました。

58行目から、1本目の売り注文を追記しました。

以下のとおり、57行目までの記述を”買い”から”売り”に変えただけです。

サイン(if文のカッコ内)を、現在値(Bid)が予想レンジの上限値と境界価格(HarfPrice)の間にあることに変更しました。

注文命令(ticket=OrderSend())は、成行で売り(OP_SELL)、損切り設定なし、利益確定は刻み幅(TakeProfit)と同額です。あと、グラフの記号の色を青から赤に変更しました。

「FirstSellPrice」に代入する値を Ask から Bid に変更しました。

オーダー成功時と失敗時に出すコメント文を BUY から SELL に変更しました。

 

売りのリピート注文2本目以降を追記

カーソルを下に移動させます。80行目です(上段までの16行追加後)。

80行目から95行目まで、買いリピート注文の2本目以降の記述があります。

//--- long position is opened
if(OrderType()==OP_BUY)
{
//---
if(Ask < FirstBuyPrice-TakeProfit*total*Point)
{
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"Repeat-If-Done",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;
}
}
}
//--- Short position is opened
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;
}
}
}
}
}
//---

96行目から、売りリピート注文の2本目以降を追記しました。

以下のとおり、95行目までの記述を”買い”から”売り”に変えただけです。

保有ポジションの確認(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年間のヒストリカルデータでバックテストした結果です。

ハーフ&ハーフのバックテスト結果

 

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

買いのみや売りのみのときと違い、最初から最後まできれいな右肩上がりのグラフです。

注目すべきは、ドローダウン(含み損)が非常に小さいことです。

実運用では、1本あたりのロットを増額したり、刻み幅を狭めたりして、もっと大きなリターンを狙えそうです。

 

スポンサーリンク

まとめ|自作EA無料配布

今回は、リピート系注文の発展形として、買いと売りを織り交ぜたハーフ&ハーフをEA化する方法を解説しました。

 

 

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

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

 

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

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

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