今回は、MQL4言語入門として、前回作ったカスタムインジケーター「HiLoBand.mq4」を使って、ブレイクアウト戦略をEA化する方法を解説します。
前回の記事はこちらです。
もちろん、すでに出来上がっているサンプルEAのソースコードの一部を書き換えるだけの、いつもどおりの超簡単な自作方法です。
この記事を通じて、カスタムインジケーターをEA化する方法を理解してください。
最後あたりでEAの完成品を無料ダウンロードできるので、ぜひ読んで行ってください。
MetaEditor の起動
MT4の「メタクォーツ言語エディタ」をクリックします。
MeTaEditorが立ち上がったら、画面左側の「Navigater」内のツリーから「Experts」をダブルクリックします。
「Experts」のツリーから「MACD Sample.mq4」をダブルクリックすると、ソースコードが開きます。
ブレイクアウト戦略とは
ブレイクアウト戦略とは、過去一定期間の高値または安値を突破した(ブレイクアウト)ことをシグナルとする投資手法で、昔から知られている順張り系の手法です。
相場では、過去一定期間の間、超えられなかった高値または安値を一旦ブレイクすれば、超えた方向にさらに大きく伸びていくことがよくあり、これを狙った戦略です。
しかし、ブレイクアウトは「だまし」に終わることも多いため、この手法を使う場合は、どのようなフィルターでだましを減らすかがポイントになります。
伝説のトレーダー集団「タートルズ」が大成功した投資手法「タートルズ・ブレイクアウト・システム」が有名です。
ソースコードの変更内容
「MACD Sample.mq4」のソースコードを、ブレイクアウト戦略にあわせて変更します。
- 前回作ったカスタムインジケーター「HiLoBand.mq4」を用いて売買タイミングを判断する。
- 利益は伸ばせるだけ伸ばしたいので、利食いポイントは設定しない。
- 日足を使ったスイングトレードを想定しているので、損切り幅を大きくする。
- 同じ足でエントリーと決済が永遠に繰り返されることのないよう、時間足1本につきエントリーを1回だけに制限する。
オリジナルEA「BreakOut.mq4」の自作
最初に、名前をつけてファイルを保存します。
「MACD Sample.mq4」が開いている状態で、「File」→「Save As…」 をクリックします。
ファイル名を「BreakOut.mq4」と打ち込んで保存します。
それでは、いよいよソースコードを書き換えていきます。
パラメーターの追加
カーソルを9行目に持っていきます。
ここでは、売買ロットやテクニカルインジケーターに関するパラメーターが記述されています。これらの数値は、MT4上でユーザーが自由に変更できます。
【変更前】
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 StopLoss =300; input double Lots =0.1; input double TrailingStop =300; input int EntryPeriod = 40; input int ExitPeriod = 20; double TradeBar;
利食いオーダー(TakeProfit)のパラメーターを削除しました。
新たにパラメーター「StopLoss」を宣言し、値を広く300ポイントとる旨を記述しました。
時間足1本につきエントリーを1回に制限するための変数「TradeBar」を宣言しました。
テクニカルインジケーター変数の宣言の変更
カーソルを下に移動させます。
ここでは、テクニカルインジケーター変数の宣言が記述されています。
【変更前】
double MacdCurrent,MacdPrevious; double SignalCurrent,SignalPrevious; double MaCurrent,MaPrevious; int cnt,ticket,total;
【変更後】
double EntryHighNew,EntryLowNew,EntryHighOld,EntryLowOld;
double ExitHigh,ExitLow;
int cnt,ticket,total;
MACDインジケーターと移動平均線インジケーターに関する変数の宣言をすべて削除し、代わりにHiLoバンドの変数の宣言を記述しました。
利食いポイントエラーの削除
カーソルを下に移動させます。
ここでは、利食いオーダー(TakeProfit)の設定が小さすぎるとエラーを吐き出す命令が記載されています。
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return;
}
利食いオーダーを削除するので、このエラー命令も削除しました。
テクニカルインジケーター関数の変更
カーソルを下に移動させます。
ここでは、先ほど宣言した変数に、テクニカルインジケーター関数の値を代入する式が記述されています。
【変更前】
//--- 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);
【変更後】
//--- to simplify the coding and speed up access data are put into internal variables
EntryHighNew = iCustom(NULL,0,"HiLoBand",EntryPeriod,0,1);
EntryLowNew = iCustom(NULL,0,"HiLoBand",EntryPeriod,1,1);
EntryHighOld = iCustom(NULL,0,"HiLoBand",EntryPeriod,0,2);
EntryLowOld = iCustom(NULL,0,"HiLoBand",EntryPeriod,1,2);
ExitHigh = iCustom(NULL,0,"HiLoBand",ExitPeriod,0,0);
ExitLow = iCustom(NULL,0,"HiLoBand",ExitPeriod,1,0);
MACDと移動平均線の式をすべて削除し、代わりにHiLoバンドの式を記述しました。
iCustom関数はインジケーターから値を取り出す関数で、EAを作るのに非常に便利な関数です。
ちなみに、一番上の変数「EntryHighNew」の式のカッコ内の数字や記号の意味は以下のとおりです。
EntryHighNew=iCustom(通貨ペアは無指定,現在の時間軸,カスタムインジケーター名,EntryPeriod=40,Hiバンドを指定,1本前のバーの値を取得);
トレード条件の変更
カーソルを下に移動させます。
ここでは、ポジションを持っていないことをトレード条件としています。
【変更前】
total=OrdersTotal(); if(total<1)
【変更後】
total=OrdersTotal();
if(total<1 && TradeBar!=Bars)
時間足1本につきエントリーを1回だけに制限するため、トレード条件に、今の時間足で構えたポジションがないことを追加しました。
ちなみに、「!=」は等しくないを意味する演算子です。
買い条件の変更
カーソルを下に移動させます。
ここでは、買い条件を満たしているか否かを判定しています。
【変更前】
//--- check for long position (BUY) possibility if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(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());
【変更後】
//--- check for long position (BUY) possibility if(Close[2]<EntryHighOld && Close[1]>EntryHighNew) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,0,"macd sample",16384,0,Green); if(ticket>0) { TradeBar = Bars; if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
Close[]はバーの終値が格納された配列です。現在のバーはClose[0]です。
買い条件(if文のカッコの中)をすべて削除し、新しい買い条件(2本前の足の終値が40日Hiバンドを下回り、かつ、1本前の足の終値が40日Hiバンドを上回っていること)を記述しました。
利食い設定を削除し、損切り設定を追加しました。
先ほど宣言した変数「TradeBar」に、現在の足の本数を表す変数「Bars」の値を代入する式を記述しました。
売り条件の変更
カーソルを下に移動させます。
ここでは、売り条件を満たしているか否かを判定しています。
【変更前】
//--- check for short position (SELL) possibility if(MacdCurrent>0 && MacdCurrentSignalPrevious && 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());
【変更後】
//--- check for short position (SELL) possibility if(Close[2]>EntryLowOld && Close[1]<EntryLowNew) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,0,"macd sample",16384,0,Red); if(ticket>0) { TradeBar = Bars; if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
売り条件(if文のカッコの中)をすべて削除し、新しい売り条件(2本前の足の終値が40日Loバンドを上回り、かつ、1本前の足の終値が40日Loバンドを下回っていること)を記述しました。
利食い設定を削除し、損切り設定を追加しました。
先ほど宣言した変数「TradeBar」に、現在の足の本数を表す変数「Bars」の値を代入する式を記述しました。
買いポジションの決済条件の変更
カーソルを下に移動させます。
ここでは、買いポジションの決済条件を満たしているか否かを判定しています。
【変更前】
//--- should it be closed?
if(MacdCurrent>0 && MacdCurrentSignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
【変更後】
//--- should it be closed?
if(Bid<ExitLow)
決済条件(if文のカッコの中)をすべて削除し、新しい決済条件(現在の売値(Bid)が20日Loバンドを下回っていること)を記述しました。
売りポジションの決済条件の変更
カーソルを下に移動させます。
ここでは、売りポジションの決済条件を満たしているか否かを判定しています。
【変更前】
else // go to short position
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious(MACDCloseLevel*Point))
【変更後】
else // go to short position
if(Ask>ExitHigh)
決済条件(if文のカッコの中)をすべて削除し、新しい決済条件(現在の買値(Ask)が20日Hiバンドを上回っていること)を記述しました。
ソースコードの書き換えは以上です。
一応、記事の最後あたりに、完成品をダウンロードできるよう置いておきます。
また、このブレイクアウトEAはカスタムインジケーター「HiLoバンド」のサインでトレードするので、MT4で動かすためには両方とも必要です。
ソースコードをコンパイルする
記述し終わったら、「Compile」をクリックします。
記述ミスがなければ、Destrictionに、「0 error(s), 0 warning(s)」と表示されます。
コンパイルとは、プログラムのソースコードをコンピューターが実行可能な機械語に翻訳することです。
ソースコードに記述ミスがあった場合は、エラーとなります。
エラーがでた場合は、記述を修正して再びコンパイルしましょう。
以下は、よくあるエラーの例です。気を付けましょう。
- 全角で記述している(ソースコードはすべて半角で記述します)
- 変数の型(”int“や”double“など)が違う
- カッコ(” { ” や ” } “)が足りない(多い)
- ” ; ” が抜けている
バックテスト
せっかくオリジナルEAが完成したのですから、バックテストしてみましょう。
バックテストのやり方は別記事にまとめています。
以下は、USD/JPYで過去10年間のヒストリカルデータでバックテストした結果です。
何の調整もしていないわりには、案外よさげです。
まとめ|自作EA無料配布
MQL4言語入門として、前回作ったカスタムインジケーター「HiLoBand.mq4」を使って、ブレイクアウト戦略のEA「BreakOut.mq4」を自作して、コンパイルし、バックテストするまでを解説しました。
思ったより簡単だったと思います。
また、これまでの記事の内容を応用すれば、さまざまなテクニカルインジケーターを自由自在に組み合わせて、オリジナルのEAを作ることができます。
アイディア次第では、ものすごいEAが自作できるかもしれませんよ。
完成品(BreakOut.zip)はこちらからダウンロードできます。
・本EAは、あくまでMQL4言語の学習用に無料配布するものです。なので再配布はやめてください。
・もし、当サイトの宣伝や、下のバナーから『XMTrading』の口座開設をしていただけると、みんなに役立つサイト作りをもっともっと頑張れます(*^▽^*)
なお、今回作ったブレイクアウトEAは、前回作ったカスタムインジケーター「HiLoバンド」のサインでトレードします。MT4で動かすためにはどちらも必要です。