皆さん、こんにちは!今日はMQL5ウィザードを使って、強気包みと弱気包みのチャートパターンを基にしたトレードシグナルを作成する方法をお話しします。この手法は、MQL5ウィザードを利用して、MetaTrader 5で簡単に実装できます。
まず、トレードシグナルクラスを作成する必要があります。このクラスは、CExpertSignalを基にしていて、LongCondition()とShortCondition()メソッドをオーバーライドして独自のロジックを組み込みます。
トレードシグナルを確認するために、逆張りのキャンドルパターンに焦点を当てます。特に、強気包みと弱気包みのパターンを取り上げ、それにMFI(Market Facilitation Index)などのオシレーターを組み合わせてシグナルを確認します。
1. 強気包みと弱気包みのキャンドルパターン
1.1. 強気包み
強気包みは、下落トレンドの中で小さな黒いキャンドルの後に大きな白いキャンドルが続き、前日のキャンドルを完全に包み込む形で形成されます。小さなキャンドルの影(テール)は短く、大きなキャンドルのボディが前日のキャンドルを完全に覆うことが特徴です。

強気包みのキャンドルパターン
強気包みパターンの認識は、CCandlePatternクラスのCheckPatternBullishEngulfing()メソッドで実装されています。
//+------------------------------------------------------------------+ //| 強気包みのキャンドルパターンをチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishEngulfing() { //--- 強気包み if((Open(2)>Close(2)) && // 前のキャンドルが弱気 (Close(1)-Open(1)>AvgBody(1)) && // 強気キャンドルのボディが平均より大きい (Close(1)>Open(2)) && // 強気キャンドルの終値が弱気キャンドルの始値より高い (MidOpenClose(2)<CloseAvg(2)) && // 下落トレンド (Open(1)<Close(2))) // 強気キャンドルの始値が弱気キャンドルの終値より低い return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING)メソッドが強気包みパターンの形成をチェックします。
1.2. 弱気包み
弱気包みは、上昇トレンドの中で小さな白いキャンドルの後に大きな黒いキャンドルが続くパターンで、前日のキャンドルを完全に包み込みます。

弱気包みのキャンドルパターン
弱気包みパターンの認識は、CCandlePatternクラスのCheckPatternBearishEngulfing()メソッドで行われます。
//+------------------------------------------------------------------+ //| 弱気包みのキャンドルパターンをチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishEngulfing() { //--- 弱気包み if((Open(2)<Close(2)) && // 前のキャンドルが強気 (Open(1)-Close(1)>AvgBody(1)) && // キャンドルのボディが平均より大きい (Close(1)<Open(2)) && // 弱気キャンドルの終値が強気キャンドルの始値より低い (MidOpenClose(2)>CloseAvg(2)) && // 上昇トレンド (Open(1)>Close(2))) // 弱気キャンドルの始値が強気キャンドルの終値より高い return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING)メソッドが弱気包みパターンの形成をチェックします。
2. MFIインジケーターによるシグナルの確認
トレードシグナルを開くためには、MFIインジケーターでの確認が必要です。MFIの値が長期ポジションの場合は40未満、短期ポジションの場合は60を超える必要があります。
ポジションのクローズは、MFIの値によって決定されます。これには2つのケースがあります:
- MFIが反対のクリティカルレベル(長期ポジションの場合は70、短期ポジションの場合は30)に達した場合
- 逆シグナルが確認されない場合(MFIが次のレベルに達した場合:長期ポジションは30、短期ポジションは70)

MFIによるシグナルの確認
- int CBE_BE_MFI::LongCondition() - 長期ポジションを開く条件をチェックします(結果は80)および短期ポジションをクローズする条件(結果は40);
- int CBE_BE_MFI::ShortCondition() - 短期ポジションを開く条件をチェックします(結果は80)および長期ポジションをクローズする条件(結果は40)。
2.1. 長期ポジションのオープン/短期ポジションのクローズ
「強気包み」パターンは、MFIインジケーターで確認されなければなりません:MFi(1)<40(直近のバーのMFI値が40未満である必要があります)。
短期ポジションは、MFIインジケーターがクリティカルレベル(70または30)を上回った場合にクローズします。
//+------------------------------------------------------------------+ //| 市場へのエントリーとエグジットの条件をチェックします | //| 1) 市場へのエントリー(長期ポジションをオープン、結果=80) | //| 2) 市場からのエグジット(短期ポジションをクローズ、結果=40) | //+------------------------------------------------------------------+ int CBE_BE_MFI::LongCondition() { int result=0; //--- idxはEAの動作モードを決定するために使用できます int idx =StartIndex(); //--- 長期ポジションをオープンする条件をチェック //--- 強気包みパターンとMFI<40 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) && (MFI(1)<40)) result=80; //--- 短期ポジションをクローズする条件をチェック //--- シグナルラインがオーバーボート/オーバーソールドレベルを越えた場合(上向き30、上向き70) if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) result=40; //--- 結果を返す return(result); }
2.2. 短期ポジションのオープン/長期ポジションのクローズ
「弱気包み」パターンは、MFIインジケーターで確認されなければなりません:MFI(1)>60(直近のバーのMFI値が60より大きい必要があります)。
長期ポジションは、MFIインジケーターがクリティカルレベル(70または30)を上回った場合にクローズします。
//+------------------------------------------------------------------+ //| 市場へのエントリーとエグジットの条件をチェックします | //| 1) 市場へのエントリー(短期ポジションをオープン、結果=80) | //| 2) 市場からのエグジット(長期ポジションをクローズ、結果=40) | //+------------------------------------------------------------------+ int CBE_BE_MFI::ShortCondition() { int result=0; //--- idxはEAの動作モードを決定するために使用できます int idx =StartIndex(); //--- 短期ポジションをオープンする条件をチェック //--- 弱気包みパターンとMFI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) && (MFI(1)>60)) result=80; //--- 長期ポジションをクローズする条件をチェック //--- シグナルラインがオーバーボート/オーバーソールドレベルを越えた場合(上向き70、下向き30) if(((MFI(1)>70) && (MFI(2)<70)) || ((MFI(1)<30) && (MFI(2)>30))) result=40; //--- 結果を返す return(result); }
2.3. MQL5ウィザードを使ったEAの作成
CBE_BE_MFIクラスは標準ライブラリクラスには含まれていないため、abe_be_mfi.mqhファイルをダウンロードし(添付ファイル参照)、client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignalsに保存する必要があります。同様にacandlepatterns.mqhファイルも保存してください。MetaEditorを再起動後、MQL5ウィザードで使用できます。
EAを作成するには、MQL5ウィザードを起動します:

EA作成ステップ1
EAの名前を指定します:

EAの一般属性
次に、使用するトレードシグナルのモジュールを選択します。

EAのシグナルプロパティ
この場合、トレードシグナルモジュールは1つだけ使用します。
「強気包み/弱気包みに基づくシグナル(MFIで確認済み)」モジュールを追加します:

EAのシグナルプロパティ2
トレードシグナルモジュールが追加されました:

EAのシグナルプロパティ3
任意のトレーリングプロパティを選択できますが、「トレーリングストップは使用しない」を選択します:

EAのトレーリングプロパティ
マネーマネジメントプロパティについては、「固定取引量での取引」を選択します:

EAのマネーマネジメントプロパティ
「完了」ボタンを押すと、生成されたEAのコードがExpert_ABE_BE_MFI.mq5に保存され、terminal_data_folder\MQL5\Experts\に格納されます。
生成されたEAのデフォルトの入力パラメータ:
//--- メインシグナルの入力 input int Signal_ThresholdOpen =10; // オープンのシグナル閾値 [0...100] input int Signal_ThresholdClose =10; // クローズのシグナル閾値 [0...100] input double Signal_PriceLevel =0.0; // 取引を実行する価格レベル input double Signal_StopLevel =50.0; // ストップロスレベル(ポイント単位) input double Signal_TakeLevel =50.0; // テイクプロフィットレベル(ポイント単位)
これを次のように置き換えます:
//--- メインシグナルの入力 input int Signal_ThresholdOpen =40; // オープンのシグナル閾値 [0...100] input int Signal_ThresholdClose =20; // クローズのシグナル閾値 [0...100] input double Signal_PriceLevel =0.0; // 取引を実行する価格レベル input double Signal_StopLevel =0.0; // ストップロスレベル(ポイント単位) input double Signal_TakeLevel =0.0 // テイクプロフィットレベル(ポイント単位)
Signal_ThresholdOpen/Signal_ThresholdCloseの入力パラメータで、ポジションのオープンとクローズの閾値を指定できます。
LongCondition()およびShortCondition()メソッドのコードでは、次のように固定値を指定しています:
- ポジションオープン:80;
- ポジションクローズ:40;
MQL5ウィザードによって生成されたEAは、トレードシグナルモジュールからの「投票」を使用してポジションをオープンおよびクローズします。メインモジュールの投票結果も使用されますが、メインモジュールのLongCondition()およびShortCondition()メソッドは常に0を返します。
メインモジュールの投票結果は「投票」平均化にも使用されます。この場合、メインモジュール + 1つのトレードシグナルモジュールがあるため、閾値の設定時にこのことを考慮する必要があります。このため、ThresholdOpenとThresholdCloseは40=(0+80)/2、20=(0+40)/2として設定する必要があります。
Signal_StopLevelとSignal_TakeLevelの入力パラメータの値が0に設定されている場合、ポジションのクローズはクローズ条件が真であるときにのみ行われます。
2.4. 過去のバックテスト結果
Expert Advisorのバックテストを歴史的データ(EURUSD H1、テスト期間:2010.01.01-2011.03.16、PeriodMFI=37、MA_period=5)で行ってみましょう。
Expert Advisorの作成には固定ボリューム(Trading Fixed Lot、0.1)を使用し、トレーリングストップアルゴリズムは使用しませんでした(Trailing not used)。

強気包み/弱気包み + MFIに基づくEAのバックテスト結果
最良の入力パラメータセットは、MetaTrader 5のストラテジーテスターを使用して見つけることができます。
MQL5ウィザードで作成されたExpert Advisorのコードは、expert_abe_be_mfi.mq5に添付されています。