皆さん、こんにちは!今日は、MQL5ウィザードを使って、ブルリッシュ・ハラミとベアリッシュ・ハラミパターンに基づくトレード信号の作成についてお話しします。これにより、自分のトレードアイデアを迅速にチェックできるようになりますよ!
このウィザードは、クライアントターミナルに付属している標準ライブラリのクラスを基に、即座にエキスパートアドバイザー(EA)を作成することができます。具体的には、まず自分自身のトレード信号クラスを作成し、その構造や例はこの記事で詳しく説明されています。
トレード信号の基本的な考え方は、CExpertSignalクラスを継承した信号クラスを作成し、LongCondition()やShortCondition()のメソッドをオーバーライドして自分のメソッドを実装することです。
参考までに、ロシア語の書籍「最高のトレーダーの戦略」には、多くのトレーディング戦略が紹介されていますが、ここでは、ストキャスティクスやCCI、MFI、RSIを用いた逆転キャンドルパターンに焦点を当てていきます。
1. ブルリッシュ・ハラミとベアリッシュ・ハラミの逆転キャンドルパターン
1.1. ブルリッシュ・ハラミ
ブルリッシュ・ハラミパターンは、下落トレンドの際に大きなキャンドルが小さなキャンドルに続く形で形成されます。小さなキャンドルのボディが大きなキャンドルのボディの縦の範囲内にあることが特徴です。このパターンは、下落トレンドが反転する可能性を示唆し、ロングポジションに入る良いタイミングを示します。2つ目のキャンドルはギャップアップで始まります。

図1. ブルリッシュ・ハラミのキャンドルパターン
「ブルリッシュ・ハラミ」パターンの認識は、CCandlePatternクラスのCheckPatternBullishHarami()メソッドで実装されています。
//+------------------------------------------------------------------+ //| ブルリッシュ・ハラミキャンドルパターンの形成をチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishHarami() { //--- ブルリッシュ・ハラミ if((Close(1)>Open(1)) && // 最後のバーはブル(白日) ((Open(2)-Close(2)>AvgBody(1)) && // 前のキャンドルはベアで、そのボディは平均より大きい ((Close(1)<Open(2)) && // ブルキャンドルの終値がベアキャンドルの始値より低い (Open(1)>Close(2))) && // ブルキャンドルの始値がベアキャンドルの終値より高い (MidPoint(2)<CloseAvg(2))) // 下落トレンド return (true); //--- return (false); }
CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI)メソッドを使用して、ブルリッシュ・ハラミキャンドルパターンの形成をチェックします。
1.2. ベアリッシュ・ハラミ
ベアリッシュ・ハラミパターンは、上昇トレンドの際に大きなキャンドルが小さなキャンドルに続く形で形成されます。小さなキャンドルのボディが大きなキャンドルのボディの縦の範囲内にあることが特徴です。このパターンは、上昇トレンドが反転する可能性を示唆し、ショートポジションに入る良いタイミングを示します。2つ目のキャンドルはギャップダウンで始まります。
2つ目の(黒)キャンドルが小さいほど、反転の可能性が高まります。

図2. ベアリッシュ・ハラミのキャンドルパターン
「ベアリッシュ・ハラミ」パターンの認識は、CCandlePatternクラスのCheckPatternBearishHarami()メソッドで実装されています。
//+------------------------------------------------------------------+ //| ベアリッシュ・ハラミキャンドルパターンの形成をチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishHarami() { //--- ベアリッシュ・ハラミ if((Close(1)<Open(1)) && // 最後のバーはベア(黒日) ((Close(2)-Open(2)>AvgBody(1)) && // 前のキャンドルはブルで、そのボディは平均より大きい ((Close(1)>Open(2)) && // ベアキャンドルの終値がブルキャンドルの始値より高い (Open(1)<Close(2))) && // ベアキャンドルの始値がブルキャンドルの終値より低い (MidPoint(2)>CloseAvg(2))) // 上昇トレンド return (true); //--- return (false); }
CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI)メソッドを使用して、ベアリッシュ・ハラミキャンドルパターンの形成をチェックします。
2. MFI指標によるトレード信号の確認
ロングまたはショートポジションを開くためのトレード信号は、MFI指標によって確認されなければなりません。MFIの値は、ロングポジションの場合は40未満、ショートポジションの場合は60を超えている必要があります。
ポジションのクローズもMFIの値に依存します。以下の2つのケースで行います:
- MFIが対極の臨界レベル(ロングポジションの場合は70、ショートポジションの場合は30)に達したとき
- 逆信号が確認されない場合(MFIが次のレベルに達する場合:ロングポジションの場合は30、ショートポジションの場合は70)

図3. MFIによって確認されたブルリッシュ・ハラミパターン
- int CBH_BH_MFI::LongCondition() - ロングポジションを開く条件をチェック(80を返す)およびショートポジションをクローズする条件(40を返す);
- int CBH_BH_MFI::ShortCondition() - ショートポジションを開く条件をチェック(80を返す)およびロングポジションをクローズする条件(40を返す)。
2.1. ロングポジションを開く/ショートポジションをクローズする
「ブルリッシュ・ハラミ」パターンの形成は、MFI指標によって確認されなければなりません:MFi(1)<40(最後のバーのMFI値は40未満である必要があります)。
ショートポジションは、MFI指標が臨界レベル(70または30)を上回ったときにクローズします。
//+------------------------------------------------------------------+ //| 市場へのエントリーとエグジットの条件をチェックします | //| 1) 市場エントリー(ロングポジションを開く、結果=80) | //| 2) 市場エグジット(ショートポジションをクローズ、結果=40) | //+------------------------------------------------------------------+ int CBH_BH_MFI::LongCondition() { int result=0; //--- idxはエキスパートアドバイザーの動作モードを決定するために使用できます //--- idx=0 - この場合、EAは各ティックでトレード条件をチェックします //--- idx=1 - この場合、EAはニュースバーのみのトレード条件をチェックします int idx = StartIndex(); //--- ロングポジションを開く条件のチェック //--- ブルリッシュ・ハラミパターンとMFI<40 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) && (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 CBH_BH_MFI::ShortCondition() { int result=0; //--- idxはエキスパートアドバイザーの動作モードを決定するために使用できます //--- idx=0 - この場合、EAは各ティックでトレード条件をチェックします //--- idx=1 - この場合、EAはニュースバーのみのトレード条件をチェックします int idx = StartIndex(); //--- ショートポジションを開く条件のチェック //--- ベアリッシュ・ハラミパターンとMFI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) && (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ウィザードを使用したエキスパートアドバイザーの作成
CBH_BH_MFIクラスは、標準ライブラリのクラスには含まれていないため、abh_bh_mfi.mqhファイルをダウンロードし、client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignalsに保存する必要があります。同様に、acandlepatterns.mqhファイルも保存してください。これらは、MetaEditorを再起動後にMQL5ウィザードで使用できます。
エキスパートアドバイザーを作成するには、MQL5ウィザードを起動します:

図4. MQL5ウィザードを使用したエキスパートアドバイザーの作成
エキスパートアドバイザーの名前を指定しましょう:

図5. エキスパートアドバイザーの一般的なプロパティ
次に、使用するトレード信号のモジュールを選択します。

図6. エキスパートアドバイザーの信号プロパティ
私たちの場合、トレード信号は1つだけ使用します。
「MFIによって確認されたブルリッシュ・ハラミ/ベアリッシュ・ハラミに基づく信号」モジュールを追加します:

図7. エキスパートアドバイザーの信号プロパティ
信号モジュールが追加されました:

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

図9. エキスパートアドバイザーのトレーリングプロパティ
マネーマネジメントプロパティに関しては、「固定取引ボリュームで取引する」を使用します:

図10. エキスパートアドバイザーのマネーマネジメントプロパティ
「完了」ボタンを押すと、生成されたエキスパートアドバイザーのコードがExpert_ABH_BH_MFI.mq5に保存され、terminal_data_folder\MQL5\Experts\に置かれます。
生成されたエキスパートアドバイザーのデフォルト入力パラメータは以下の通りです:
//--- メイン信号の入力 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ウィザードによって生成されたエキスパートアドバイザーは、トレード信号モジュールからの「投票」に基づいてポジションを開閉します。メインモジュールの投票結果も使用されますが、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.16、PeriodMFI=37、MA_period=11)に基づくバックテストを考慮しましょう。
エキスパートアドバイザーの作成においては、固定ボリューム(固定ロットで取引、0.1)を使用し、トレーリングストップアルゴリズムは使用しませんでした(トレーリングは使用しない)。

図11. ブルリッシュ・ハラミ/ベアリッシュ・ハラミ + MFIに基づくエキスパートアドバイザーのテスト結果
最適な入力パラメータのセットは、MetaTrader 5の戦略テスターを使用して見つけることができます。
MQL5ウィザードで作成されたエキスパートアドバイザーのコードは、expert_abh_bh_mfi.mq5に添付されています。