MQL5ウィザードにOpenとCloseの条件が異なるロジックを組み込む|MQL5の世界(4回目)

0と1の世界

これまでのMQL5ウィザードの説明では、買い勢力と売り勢力の有利な方にエントリーし、勢力が反転するか特定条件(固定pipsやトレーリングストップ)を満たしたらエグジットする方法を説明してきました。

ただ、実戦でいくつかのパターンを検討していくと、以下のように従来通りの方法でプログラムしたいという要望が当然出てきます。

  • (買い勢力/売り勢力)ではなく固定の条件を満たしたらエントリーする。
  • MQL5ウィザードで準備されていない条件でエグジットする。

 

今回は、MQL5ウィザードに組み込む自作プログラムを従来通りの方法でプログラミングします。

 

これまでの内容を理解している前提で進めていきますので、まだ見ていない方は先にご確認いただければと思います。

新しいテクノロジーに触れよう|MQL5の世界(1回目)

MQL5ウィザードでできること|MQL5の世界(2回目)

MQL5ウィザードに自作プログラムを組み込む|MQL5の世界(3回目)

やりたいことをまとめる

[実現したいこと]

  • エントリー条件を満たしたら売買する
  • エグジット条件を満たしたら決済する
  • エグジット条件はエントリー条件とは異なるため、途転はしない(たまたま両方成立した場合は結果的に途転となる)

 

通常であれば簡単に実現できそうな機能なのですが、MQL5ウィザードのテンプレートに載せると若干やりづらかったので記録として残そうと思いました。

 

実現方法

プログラムの書き方は後述しますので、先に説明をします。

 

前提

MQL5ウィザードに組み込むために、作成するプログラムは「CExpertSignal」を継承します。

これはMQL5ウィザードの枠組みに新しく作成するプログラムを適合させるためです。

 

エントリー条件を組み込む方法

親クラスのCExpertSignalにCheckOpenLongが準備されています。

この関数(メソッド)の戻り値にtrueを返せば「買い」が実行されます。

同じくCheckOpenShortにtrueを返せば「売り」が実行されます。

 

ただ、このままでは親クラスが事前に定義している「買い勢力 – 売り勢力」で判定が行われますので、自身が作成する子クラスで再定義(オーバーライド)して今回用のシグナルに変更します。

 

エグジット条件を組み込む方法

親クラスのCExpertSignalにCheckCloseLongが準備されています。

この関数(メソッド)の戻り値にtrueを返せば「買いポジションのクローズ」が実行されます。

同じくCheckCloseShortにtrueを返せば「売りポジションのクローズ」が実行されます。

 

エントリーの時と同様に自身が作成する子クラスで再定義(オーバーライド)する必要があります。

 

プログラム

クラス定義部分

今回の説明に不要な部分は割愛していますが、クラス定義のpublicの中に再定義(オーバーライド)する関数(メソッド)を記載します。

「CheckOpenLong, CheckCloseLong, CheckOpenShort, CheckCloseShort」については説明済みです。

 

「CheckReverse, CheckReverseLong, CheckReverseShort」について説明します。

これは、「CheckCloseLong, CheckOpenShort」などを確認して両方成立していれば途転するものです。

そのまま動かしてもいいのですが今回は意図的には途転しないので、子クラスで再定義(オーバーライド)して、強制的にfalseを返しています。

 

また、今回のプログラムには前回利用した「LongCondition」と「ShortCondition」は不要です。

 

CheckOpenLongとCheckOpenShort

//—
price=0.0;
sl =0.0;
tp =0.0;
//—

この部分は親クラスの関係上必要なので記載してください。

あとは自分が利用したい条件に該当した場合にtrueを返せばOKです。

 

CheckCloseLongとCheckCloseShort

先ほどと同様に、エグジットしたい条件に該当した場合にtrueを返します。

 

プログラムの全体

念のため、プログラムの全体像を掲載します。

テクニカル指標を同じクラス内で2つ準備してしまったので、中身が汚くなっていますがご容赦ください。

このプログラムをコンパイルして、MetaEditorを再起動するとMQL5ウィザードで選択することが可能になります。

 

MQL5ウィザードで作成

MQL5ウィザードで作成したPullBackを選択してプログラムを作成します。

プログラムをコンパイルしてEAのバックテストをすると・・・1回もトレードされなかったのではないでしょうか。

実は、「CheckOpenLong, CheckCloseLong, CheckOpenShort, CheckCloseShort」はそのままでは利用できないのです。(ここで私はかなり嵌りました。。。)

動作するようにするには以下の通りプログラムを修正する必要があります。


[削除(1ヵ所目)]
CExpertSignal *signal=new CExpertSignal;

[代わりに追加(1ヵ所目)]
CSignalPullBack *signal=new CSignalPullBack;


[削除2ヵ所目]
CSignalPullBack *filter0=new CSignalPullBack;

if(filter0==NULL)
{
//— failed
printf(__FUNCTION__+”: error creating filter0″);
ExtExpert.Deinit();
return(INIT_FAILED);
}
signal.AddFilter(filter0);
//— Set filter parameters
filter0.PeriodMA(Signal_PB_PeriodMA);
filter0.Method(Signal_PB_Method);
filter0.LongRSI(Signal_PB_LongRSI);
filter0.ShortRSI(Signal_PB_ShortRSI);
filter0.Weight(Signal_PB_Weight);

[代わりに追加(2ヵ所目)]
signal.PeriodMA(Signal_PB_PeriodMA);
signal.Method(Signal_PB_Method);
signal.LongRSI(Signal_PB_LongRSI);
signal.ShortRSI(Signal_PB_ShortRSI);
signal.Weight(Signal_PB_Weight);


この状態で再度実行すると、今度は正常に売買されたかと思います。

※今回のプログラムは利益を出すために書いたプログラムではないので、結果が良いか悪いかについては確認しておりません。

 

最後に

実現したいことが単純であるにもかかわらず実装が面倒なのはMQL5ウィザードのデメリットだと感じました。

MQL5ウィザードは部品化と組合せがポイントなので、今回のように沢山のことを1つのプログラムとして書くのにはあまり向いていません。

ただ、ウィザードに組み込めば様々な組み合わせが可能になりますし、プログラムは苦手でも検証が得意という方に配布して組合せのテストをして頂くことも可能になります。

やり方を把握しておいて損は無いと思いました。