皆さん、こんにちは!今日は、MQL5ウィザードを使って、ハンマーやハンギングマンパターンに基づくトレードシグナルを生成する方法をお話しします。このシステムトレーディング手法は、MetaTrader 5プラットフォームで活用できるので、ぜひ試してみてください。
MQL5ウィザードを使用すると、クライアント端末と一緒に提供される標準ライブラリクラスに基づいて、準備されたエキスパートアドバイザー(EA)を作成することができます。自分のトレードアイデアをすぐに確認できるので、非常に便利です。独自のトレーディングシグナルクラスを作成するだけでOKです。このクラスの構造や例については、『MQL5ウィザード:トレーディングシグナルのモジュールを作成する方法』を参照してください。
基本的なアイデアは、トレーディングシグナルクラスをCExpertSignalから派生させ、次に、LongCondition()とShortCondition()の仮想メソッドを独自の方法でオーバーライドすることです。
ロシア語の本である「最高のトレーダーの戦略」には、多くのトレーディング戦略が紹介されています。その中でも、ハンマーやハンギングマンのようなリバーサルキャンドルパターンに焦点を当て、ストキャスティクス、CCI、MFI、RSIのオシレーターによって確認されるものです。
キャンドルパターンの形成を確認するためには、CExpertSignalから派生した別のクラスを作成するのが最適です。キャンドルパターンによって生成されたトレードシグナルを確認するためには、CCandlePatternから派生したクラスを作成し、必要な機能を追加します(例えば、オシレーターによる確認など)。
1. ハンマーとハンギングマンのリバーサルキャンドルパターン
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. ハンギングマン
「ハンギングマン」は、小さなボディと長い下ヒゲを持つキャンドルで、上昇トレンドの後に形成されます。このパターンは、ブルトレンドの終わりを示します。
キャンドルボディの色は重要ではありませんが、ベアキャンドルはより高いベアポテンシャルを示します。ハンギングマンパターンのボディは、前のキャンドルの最大値付近で形成されることが多いです。長い下ヒゲと短い上ヒゲが逆転パターンの可能性を高めます。

図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. ストキャスティクスオシレーターによって確認されたトレードシグナル
ロングまたはショートポジションを開くためのトレードシグナルは、ストキャスティクスオシレーターによって確認される必要があります。シグナルの%Dラインは、対応するクリティカルレベル(30または70)を超えている必要があります。
オープンポジションのクローズは、%Dインジケーターの値に依存します。これは次の2つの条件で実行できます:
- %Dラインが反対のクリティカルレベル(ロングポジションの場合は80、ショートポジションの場合は20)に達した場合
- 逆シグナルが確認されていない場合(%Dラインが次のレベルに達したとき:ロングポジションの場合は20、ショートポジションの場合は80)

図3. ハンマーのパターン、ストキャスティクスによって確認されたもの
- int CH_HM_Stoch::LongCondition() - ロングポジションを開く条件をチェック(結果=80)、ショートポジションをクローズ(結果=40);
- int CH_HM_Stoch::ShortCondition() - ショートポジションを開く条件をチェック(結果=80)、ロングポジションをクローズ(結果=40)。
2.1. ロングポジションを開く/ショートポジションをクローズする
「ハンマー」パターンの形成は、ストキャスティクスオシレーターによって確認される必要があります:StochSignal(1)<30(最後に完成したバーのストキャスティクスインジケーターのシグナルラインの値が30未満である必要があります)。
ショートポジションは、ストキャスティクスインジケーターのシグナルラインが20または80レベルを上回った場合にクローズされる必要があります。
//+------------------------------------------------------------------+ //| マーケットへのエントリーとエグジットの条件をチェックします | //| 1) マーケットエントリー(ロングポジションを開く、結果=80) | //| 2) マーケットエグジット(ショートポジションをクローズ、結果=40) | //+------------------------------------------------------------------+ int CH_HM_Stoch::LongCondition() { int result=0; //--- idxはExpert Advisorの動作モードを示すために使用できます //--- idx=0 - この場合、EAは各ティックで取引条件をチェックします //--- idx=1 - この場合、EAはニュースバーのみで取引条件をチェックします int idx =StartIndex(); //--- ロングポジションを開く条件をチェックします //--- ハンマーパターンの形成とシグナルライン<30 if (CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) && (StochSignal(1)<30)) result=80; //--- ショートポジションをクローズする条件をチェックします //--- シグナルラインのオーバーボート/オーバーソールドレベルのクロスオーバー(下向き20、上向き80) if((((StochSignal(1)>20) && (StochSignal(2)<20)) || ((StochSignal(1)>80) && (StochSignal(2)<80)))) result=40; //--- 結果を返します return(result); }
2.2. ショートポジションを開く/ロングポジションをクローズする
「ハンギングマン」パターンの形成は、ストキャスティクスオシレーターによって確認される必要があります:StochSignal(1)>70(最後に完成したバーのストキャスティクスインジケーターのシグナルラインの値が70を超えている必要があります)。
ロングポジションは、ストキャスティクスインジケーターのシグナルラインが80または20レベルを下回った場合にクローズされる必要があります。
//+------------------------------------------------------------------+ //| マーケットへのエントリーとエグジットの条件をチェックします | //| 1) マーケットエントリー(ショートポジションを開く、結果=80) | //| 2) マーケットエグジット(ロングポジションをクローズ、結果=40) | //+------------------------------------------------------------------+ int CH_HM_Stoch::ShortCondition() { int result=0; //--- idxはExpert Advisorの動作モードを示すために使用できます //--- idx=0 - この場合、EAは各ティックで取引条件をチェックします //--- idx=1 - この場合、EAはニュースバーのみで取引条件をチェックします int idx =StartIndex(); //--- ショートポジションを開く条件をチェックします //--- ハンギングマンパターンの形成とシグナルライン>70 if (CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) && (StochSignal(1)>70)) result=80; //--- ロングポジションをクローズする条件をチェックします //--- シグナルラインのオーバーボート/オーバーソールドレベルのクロスオーバー(下向き80、上向き20) if((((StochSignal(1)<80) && (StochSignal(2)>80)) || ((StochSignal(1)<20) && (StochSignal(2)>20)))) result=40; //--- 結果を返します return(result); }
2.3. MQL5ウィザードを使ったエキスパートアドバイザーの作成
CH_HM_Stochクラスは標準ライブラリクラスには含まれていないため、ach_hm_stoch.mqhファイルをダウンロードし(添付ファイルを参照)、client_terminal_data\MQL5\Include\Expert\Signal\MySignalsフォルダに保存する必要があります。同様に、candlepatterns.mqhファイルも保存してください。MetaEditorを再起動した後、MQL5ウィザードで使用できます。
エキスパートアドバイザーを作成するには、MQL5ウィザードを起動します:

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

図5. エキスパートアドバイザーの概要
次に、使用するトレードシグナルのモジュールを選択します。

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

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

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

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

図10. エキスパートアドバイザーのマネーマネジメントプロパティ
「完了」ボタンを押すと、生成されたエキスパートアドバイザーのコードが得られ、Expert_AH_HM_Stoch.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ウィザードで生成されたエキスパートアドバイザーは、トレードシグナルモジュールからの「投票」を使用してポジションをオープンおよびクローズします。メインモジュールの投票結果も「投票」の平均化に使用されます。この場合、メインモジュール + 1つのトレードシグナルモジュールがあるため、閾値を設定する際にこの事実を考慮する必要があります。このため、ThresholdOpenとThresholdCloseはそれぞれ40=(0+80)/2、20=(0+40)/2として設定する必要があります。
Signal_StopLevelおよびSignal_TakeLevelの入力パラメータの値が0に設定されている場合、ポジションのクローズは、クローズ条件が真であるときのみ実行されます。
2.4. バックテスト結果
エキスパートアドバイザーのバックテストを行いましょう(通貨ペア:EURUSD H1、テスト期間:2010年1月1日〜2011年3月4日、PeriodK=47、PeriodD=9、PeriodSlow=13、MA_period=5)。
エキスパートアドバイザーの作成には、固定ボリューム(固定ロットでの取引、0.1)を使用し、トレーリングストップアルゴリズムは使用しません(トレーリングなし)。

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