こんにちは、トレーダーの皆さん!今日は、MQL5ウィザードを使って、強気包み足(Bullish Engulfing)と弱気包み足(Bearish Engulfing)に基づくトレードシグナルの作成方法についてお話しします。この方法を使えば、自分のトレードアイデアをすぐにチェックできるので、非常に便利です。
このウィザードを使うことで、標準ライブラリのクラスを基にしたエキスパートアドバイザー(EA)を簡単に作成できます。具体的には、トレードシグナルのクラスを自作する必要がありますが、その構造や例についてはMQL5ウィザード: トレードシグナルのモジュールの作成方法を参照してください。
1. 強気包み足と弱気包み足
1.1. 強気包み足
強気包み足は、下落トレンドの際に、小さな黒いローソク足の後に大きな白いローソク足が続き、前日のローソク足を完全に包み込む形で形成されます。この時、小さなローソク足の影は短く、大きなローソク足の本体が前日のローソク足を覆っていることがポイントです。

Fig. 1. 強気包み足パターン
このパターンの認識は、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); }
このメソッドを使用して「強気包み足」パターンの形成を確認できます。
1.2. 弱気包み足
弱気包み足は、上昇トレンドの際に、小さな白いローソク足の後に大きな黒いローソク足が続き、前日のローソク足を完全に包み込む形で形成されます。

Fig. 2. 弱気包み足パターン
このパターンの認識は、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); }
このメソッドを使用して「弱気包み足」パターンの形成を確認できます。
2. RSI指標によって確認されたトレードシグナル
トレードシグナルを開くためには、RSI指標によって確認される必要があります。RSIの値は、ロングポジションの場合は40未満、ショートポジションの場合は60を超える必要があります。
ポジションのクローズは、RSIの値に依存します。以下の2つのケースで行われます:
- RSIが反対の重要レベル(ロングポジションの場合は70、ショートポジションの場合は30)に達した場合
- 逆シグナルが確認されない場合(RSIが次のレベルに達した場合:ロングポジションは30、ショートポジションは70)

Fig. 3. RSI指標による確認
- int CBE_BE_RSI::LongCondition() - ロングポジションを開くための条件をチェックします(結果: 80)
- int CBE_BE_RSI::ShortCondition() - ショートポジションを開くための条件をチェックします(結果: 80)
2.1. ロングポジションを開く/ショートポジションを閉じる
- 強気包み足の形成は、RSI指標によって確認される必要があります:RSI(1) < 40(直近の完了したバーのRSI値が40未満である必要があります)。
- ショートポジションは、RSI指標が重要なレベル70や30を上回った場合に閉じる必要があります。
//+------------------------------------------------------------------+ //| エントリーとエグジットの条件をチェックします | //| 1) 市場エントリー(ロングポジション開放、結果=80) | //| 2) 市場エグジット(ショートポジションクローズ、結果=40) | //+------------------------------------------------------------------+ int CBE_BE_RSI::LongCondition() { int result = 0; //--- エキスパートアドバイザーの動作モードを決定するためのインデックス int idx = StartIndex(); //--- ロングポジションを開く条件のチェック if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) && (RSI(1) < 40)) result = 80; //--- ショートポジションを閉じる条件のチェック if(((RSI(1) > 30) && (RSI(2) < 30)) || ((RSI(1) > 70) && (RSI(2) < 70))) result = 40; //--- 結果を返す return (result); }
2.2. ショートポジションを開く/ロングポジションを閉じる
- 弱気包み足の形成は、RSI指標によって確認される必要があります:RSI(1) > 60(直近の完了したバーのRSI値が60を超えている必要があります)。
- ロングポジションは、RSI指標が重要なレベル70や30を下回った場合に閉じる必要があります。
//+------------------------------------------------------------------+ //| ショートポジションの条件をチェックします | //| 1) 市場エントリー(ショートポジション開放、結果=80) | //| 2) 市場エグジット(ロングポジションクローズ、結果=40) | //+------------------------------------------------------------------+ int CBE_BE_RSI::ShortCondition() { int result = 0; //--- エキスパートアドバイザーの動作モードを決定するためのインデックス int idx = StartIndex(); //--- ショートポジションを開く条件のチェック if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) && (RSI(1) > 60)) result = 80; //--- ロングポジションを閉じる条件のチェック if(((RSI(1) < 70) && (RSI(2) > 70)) || ((RSI(1) < 30) && (RSI(2) > 30))) result = 40; return (result); }
2.3. MQL5ウィザードを使ったエキスパートアドバイザーの作成
CBE_BE_RSIクラスは標準ライブラリのクラスには含まれていないため、使用するにはacml_rsi.mqhファイルをダウンロードし、client_terminal_data\MQL5\Include\Expert\Signal\MySignalsに保存する必要があります。同様にacandlepatterns.mqhファイルも必要です。MetaEditorを再起動した後、MQL5ウィザードで使用できます。
エキスパートアドバイザーを作成するには、MQL5ウィザードを起動します。

Fig. 4. エキスパートアドバイザーの作成
次に、エキスパートアドバイザーの名前を指定します。

Fig. 5. エキスパートアドバイザーの一般的なプロパティ
その後、使用するトレードシグナルのモジュールを選択します。

Fig. 6. エキスパートアドバイザーのシグナルプロパティ
この場合、トレードシグナルモジュールは1つだけ使用します。
「RSIによって確認された強気包み足/弱気包み足に基づくシグナル」モジュールを追加します。

Fig. 7. エキスパートアドバイザーのシグナルプロパティ
トレードシグナルモジュールが追加されました。

Fig. 8. エキスパートアドバイザーのシグナルプロパティ
任意のトレーリングプロパティを選択できますが、「トレーリングストップは使用しない」を選択します。

Fig. 9. エキスパートアドバイザーのトレーリングプロパティ
資金管理プロパティとして、「固定取引量での取引」を使用します。

Fig. 10. エキスパートアドバイザーの資金管理プロパティ
「完了」ボタンを押すと、生成されたエキスパートアドバイザーのコードが得られ、Expert_ABE_BE_RSI.mq5に保存されます。このファイルはterminal_data_folder/MQL5/Experts/に格納されます。
生成されたエキスパートアドバイザーのデフォルトの入力パラメータは次のようになります:
//--- メインシグナルの入力 input int Signal_ThresholdOpen = 10; // 開くためのシグナル閾値 input int Signal_ThresholdClose = 10; // 閉じるためのシグナル閾値 input double Signal_PriceLevel = 0.0; // 取引を実行する価格レベル input double Signal_StopLevel = 50.0; // ストップロスレベル input double Signal_TakeLevel = 50.0; // テイクプロフィットレベル
これらは次のように置き換える必要があります:
//--- メインシグナルの入力 input int Signal_ThresholdOpen = 40; // 開くためのシグナル閾値 input int Signal_ThresholdClose = 20; // 閉じるためのシグナル閾値 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ウィザードによって生成されたエキスパートアドバイザーは、トレードシグナルモジュールからの「投票」を使用してポジションを開閉します。メインモジュールの投票結果も使用されますが、そのLongCondition()およびShortCondition()メソッドは常に0を返します。
メインモジュールの投票結果は「投票」の平均化にも使用されます。この場合、メインモジュール+1つのトレードシグナルモジュールがあるので、閾値の設定時にこの事実を考慮する必要があります。このため、ThresholdOpenとThresholdCloseは40=(0+80)/2、20=(0+40)/2に設定する必要があります。
Signal_StopLevelとSignal_TakeLevelの入力パラメータの値は0に設定されており、ポジションは閉じる条件が満たされたときのみクローズされます。
2.4. ヒストリーバックテスト結果
エキスパートアドバイザーのヒストリカルデータ(EURUSD H1、テスト期間:2010.01.01-2011.03.04、PeriodRSI=11、MA_period=5)でのバックテストを考察します。
エキスパートアドバイザーの作成には固定ボリューム(固定ロット取引、0.1)を使用し、トレーリングストップアルゴリズムは使用していません。

Fig. 11. エキスパートアドバイザーのテスト結果
最適な入力パラメータのセットは、ストラテジーテスターを使用して見つけることができます。
生成されたエキスパートアドバイザーのコードは、expert_abe_be_rsi.mq5に添付されています。