MQL言語入門|カスタムインジケーターをEA化する超簡単な方法|BO戦略

ブレークアウト

 

今回は、MQL言語入門として、前回作ったカスタムインジケーター「HiLoBand.mq4」を使って、ブレイクアウト(BO)戦略をEA化する方法を解説します。

前回の記事はこちらです。

MQL言語入門|カスタムインジケーターの超簡単な自作方法
カスタムインジケーター「HiLoBand.mq4」の超簡単な自作方法を解説します。完成品のダウンロードもできます。MT4をこれから始めようとする初心者を対象にしています。なぜ超簡単なのかというと、既存のソースコードの一部を書き換えるだけだからです。

 

もちろん、すでに出来上がっているサンプルEAのソースコードの一部を書き換えるだけの、いつもどおりの超簡単な自作方法です。

この記事を通じて、カスタムインジケーターをEA化する方法を理解してください。

ホントに超簡単ですので、ぜひ挑戦してみましょう。

 

MetaEditor の起動

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

メタエディター起動

 

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

「Experts」のツリーから「MACD Sample.mq4」をダブルクリックすると、ソースコードが開きます。

MACDサンプル起動

 

ブレイクアウト戦略とは

ブレイクアウト戦略とは、過去一定期間の高値または安値を突破した(ブレイクアウト)ことをシグナルとする投資手法で、昔から知られている順張り系の手法です。

相場では、過去一定期間の間、超えられなかった高値または安値を一旦ブレイクすれば、超えた方向にさらに大きく伸びていくことがよくあり、これを狙った戦略です。

しかし、ブレイクアウトは「だまし」に終わることも多いため、この手法を使う場合は、どのようなフィルターでだましを減らすかがポイントになります。

伝説のトレーダー集団「タートルズ」が大成功した投資手法「タートルズ・ブレイクアウト・システム」が有名です。

 

ソースコードの変更内容

「MACD Sample.mq4」のソースコードを、ブレイクアウト戦略にあわせて変更します。

  • 前回作ったカスタムインジケーター「HiLoBand.mq4」を用いて売買タイミングを判断する。
  • 利益は伸ばせるだけ伸ばしたいので、利食いポイントは設定しない。
  • 日足を使ったスイングトレードを想定しているので、損切り幅を大きくする。
  • 同じ足でエントリーと決済が永遠に繰り返されることのないよう、時間足1本につきエントリーを1回だけに制限する。

 

オリジナルEA「BreakOut.mq4」の自作

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

「MACD Sample.mq4」が開いている状態で、「File」→「Save As…」 をクリックします。

MAC-STOC保存

 

ファイル名を「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で動かすために両方とも必要です。

MQL言語入門|カスタムインジケーターの超簡単な自作方法
カスタムインジケーター「HiLoBand.mq4」の超簡単な自作方法を解説します。完成品のダウンロードもできます。MT4をこれから始めようとする初心者を対象にしています。なぜ超簡単なのかというと、既存のソースコードの一部を書き換えるだけだからです。

 

ソースコードをコンパイルする

記述し終わったら、「Compile」をクリックします。

記述ミスがなければ、Destrictionに、「0 error(s), 0 warning(s)」と表示されます。

MAC-STOCのコンパイル

 

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

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

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

 

以下は、よくあるエラーの例です。

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

 

バックテスト

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

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

MT4のはじめ方~ヒストリカルデータ取得からバックテストのやり方~
サンプルEAを使ったバックテストのやり方を解説します。「最大バー数の設定」と「ヒストリカルデータの取得」を行ってから「バックテスト」をする、という流れです。難しそうに見えるかもしれませんが、ほんとに簡単ですから、ぜひ挑戦してみましょう。

 

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

ブレークアウトのグラフ

ブレークアウトのレポート

 

何の調整もしていないわりには、案外よさげです。

ドローダウンが大きめですが、良いフィルターがあれば実用可能かもしれません。

 

まとめ

MQL言語入門として、前回作ったカスタムインジケーター「HiLoBand.mq4」を使って、ブレイクアウト戦略のEA「BreakOut.mq4」を自作して、コンパイルし、バックテストするまでを解説しました。

思ったより簡単だったでしょ。

 

また、これまでの記事の内容を応用すれば、さまざまなテクニカルインジケーターを自由自在に組み合わせて、オリジナルのEAを作ることができます。

アイディア次第では、ものすごいEAが自作できるかもしれませんよ。

 

MQL言語入門まとめ

これまでにMQL言語入門として書いた記事がたまってきましたのでまとめました。

【保存版】MQL言語入門まとめ|EA・インジケーターの作り方
せっかくMT4を使うなら、あなたオリジナルのEAやインジケーターを自作してみませんか。「プログラミングなんて自分にはとても無理だ」と思うかもしれませんが、そんなことありません。最低限知っておくべきことさえ押さえておけば、簡単にできます。

 

おすすめ書籍

もっと本格的にMQL言語を使いこなしたいなら、以下の書籍がおすすめです。

私もこの本で勉強しました。

FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ)


おすすめFX業者

もしあなたがリアル口座でMT4の稼働をお考えなら「XMTrading」がおすすめです。 XMは、豊富な入出金方法、24時間日本語サポート、レバレッジ888倍など有利な取引条件、お得なボーナスなどにより、海外FX業者の中で日本人の口座開設数No.1です。

XMの口座開設はこちらから

MT4でシストレ

●免責及び注意事項●
当サイトの全てのコンテンツは管理人自身による情報の提供を目的としており、決して投資行動を勧誘・助言するものではありません。
投資商品、売買価格決定等の投資行動につきましては、ご自身の判断と責任に基づいて行われるようお願いいたします。
また、個々の取引において生じたいかなる損失についても、本ブログサイトおよびその管理者は一切の責任を負いかねます。

Startup!

コメント