皆さん、こんにちは!今日は、MQL5ウィザードを使って、ハンマーやハンギングマンパターンに基づくトレードシグナルを作成する方法についてお話しします。このツールを使うと、MetaTrader 5のクライアント端末に付属しているスタンダードライブラリクラスを利用して、すぐに使えるエキスパートアドバイザー(EA)を作成できます。自分のトレードアイデアを簡単にチェックできるので、ぜひ活用してみてください!
基本的なアイデアは、トレードシグナルのクラスをCExpertSignalから派生させ、LongCondition()とShortCondition()をオーバーライドして、自分自身のメソッドを作成することです。
ロシア語の本『最高のトレーダーの戦略』には、多くのトレーディング戦略が述べられていますが、今回は逆転のキャンドルパターンと、ストキャスティクス、CCI、MFI、RSIのオシレーターによって確認されたパターンに焦点を当てます。
1. ハンマーとハンギングマンの逆転キャンドルパターン
1.1. ハンマー
ハンマーは、小さなボディと長い下ヒゲを持つキャンドルで、下落トレンドの後に形成されます。ハンマーパターンは、ベアリッシュトレンドの終わりを示唆します。
キャンドルボディの色は重要ではありませんが、ブルリッシュハンマーはより高いブルリッシュポテンシャルを示します。ハンマーパターンのボディは、前のキャンドルの最小値近くで形成されることが多いです。下ヒゲが長く、上ヒゲが短いほど、逆転パターンの可能性が高まります。

ハンマーパターン
ハンマーパターンの認識は、CCandlePatternクラスのCheckPatternHammer()メソッドに実装されています。
//+------------------------------------------------------------------+ //| ハンマーパターンの形成をチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHammer() { //--- ハンマー if((MidPoint(1)<CloseAvg(2)) && // ダウントレンド (MathMin(Open(1),Close(1))>(High(1)-(High(1)-Low(1))/3.0)) && // ボディが上部1/3にある (Close(1)<Close(2)) && (Open(1)<Open(2))) // ボディのギャップ return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_HAMMER)メソッドは、ハンマーパターンの形成をチェックするために使用されます。
1.2. ハンギングマン
ハンギングマンは、小さなボディと長い下ヒゲを持つキャンドルで、上昇トレンドの後に形成されます。このパターンは、ブルリッシュトレンドの終わりを示唆します。
こちらもキャンドルボディの色は重要ではありませんが、ベアリッシュキャンドルは高いベアリッシュポテンシャルを示します。ハンギングマンパターンのボディは、前のキャンドルの最大値近くで形成されることが多いです。下ヒゲが長く、上ヒゲが短いほど、逆転パターンの可能性が高まります。

ハンギングマンパターン
ハンギングマンパターンの認識は、CCandlePatternクラスのCheckPatternHangingMan()メソッドに実装されています。
//+------------------------------------------------------------------+ //| ハンギングマンパターンの形成をチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHangingMan() { //--- ハンギングマン if((MidPoint(1)>CloseAvg(2)) && // アップトレンド (MathMin(Open(1),Close(1)>(High(1)-(High(1)-Low(1))/3.0)) && // ボディが上部1/3にある (Close(1)>Close(2)) && (Open(1)>Open(2)))) // ボディのギャップ return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN)メソッドは、ハンギングマンパターンの形成をチェックするために使用されます。
2. MFIインジケーターで確認されたトレードシグナル
ロングまたはショートポジションを開くためのトレードシグナルは、MFIインジケーターによって確認される必要があります。MFIインジケーターの値は、ロングポジションの場合は40未満、ショートポジションの場合は60を超えている必要があります。
オープンしたポジションのクローズは、MFIインジケーターの値に依存します。クローズは以下の2つの場合に行います:
- MFIが反対のクリティカルレベル(ロングポジションの場合70、ショートポジションの場合30)に達したとき
- 逆シグナルが確認されなかった場合(MFIインジケーターが次のレベルに達したとき:ロングポジションの場合30、ショートポジションの場合70)

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

エキスパートアドバイザーの作成
エキスパートアドバイザーの名前を指定します:

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

エキスパートアドバイザーのシグナルプロパティ
今回は、トレードシグナルのモジュールを1つだけ使用します。
MFIで確認されたハンマー/ハンギングマンに基づくシグナルモジュールを追加します:

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

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

エキスパートアドバイザーのトレーリングプロパティ
マネーマネジメントのプロパティについては、「固定取引量でのトレード」を使用します:

エキスパートアドバイザーのマネーマネジメントプロパティ
「完了」ボタンを押すことで、生成されたエキスパートアドバイザーのコードがExpert_AH_HM_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=47、MA_period=5)。
エキスパートアドバイザーの作成では、固定ボリュームを使用しました(固定ロットでのトレード、0.1)、トレーリングストップアルゴリズムは使用されていません(トレーリング使用せず)。

ハンマー/ハンギングマン + MFIに基づくエキスパートアドバイザーのテスト結果
最適な入力パラメータセットは、MetaTrader 5クライアント端末のストラテジーテスターを使用して見つけることができます。
MQL5ウィザードで生成されたエキスパートアドバイザーのコードは、expert_ah_hm_mfi.mq5に添付されています。