これまでに、人気のリピート系注文を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」をソースコードの上にドラッグ&ドロップすると、ソースコードが開きます。
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)」と表示されます。
コンパイルとは、プログラムのソースコードをコンピューターが実行可能な機械語に翻訳することです。
ソースコードに記述ミスがあった場合は、エラーとなります。
エラーがでた場合は、記述を修正して再びコンパイルしましょう。
以下は、よくあるエラーの例です。気を付けましょう。
- 全角で記述している(ソースコードはすべて半角で記述します)
- 変数の型(”int”や”double”など)が違う
- カッコ(” { ” や ” } “)が足りない(多い)
- ” ; ” が抜けている
バックテスト
せっかくオリジナルEAが完成したのですから、バックテストしてみましょう。
バックテストのやり方は別記事にまとめています。
以下は、USD/JPYで2017.1~2018.12の2年間のヒストリカルデータでバックテストした結果です。
プログラムは問題なく動いています。
買いのみや売りのみのときと違い、最初から最後まできれいな右肩上がりのグラフです。
注目すべきは、ドローダウン(含み損)が非常に小さいことです。
実運用では、1本あたりのロットを増額したり、刻み幅を狭めたりして、もっと大きなリターンを狙えそうです。
まとめ|自作EA無料配布
今回は、リピート系注文の発展形として、買いと売りを織り交ぜたハーフ&ハーフをEA化する方法を解説しました。
もちろん、いつもどおり超簡単に自作できます。既にあるEAのソースコードをほんの少し書き換えるだけですから。
ぜひあなたの勝てるEA作りに役立ててください。
完成品(Repeat-If-Done-Half.zip)はこちらからダウンロードできます。
・本EAは、あくまでMQL4言語の学習用に無料配布するものです。なので、再配布はやめてください。
・もし、当サイトを宣伝して頂けたり、下のバナーから『XMTrading』の口座を開設していただけると、みなさんに役立つサイト作りをもっともっと頑張れます(*^▽^*)