MetaTrader 5のMQL5ウィザードを使えば、トレードアイデアを素早くチェックできるエキスパートアドバイザー(EA)を簡単に作成できます。自分だけのトレーディングシグナルクラスを作成するだけで済みます。このクラスの構造や例については、MQL5ウィザード: トレーディングシグナルのモジュールを作成する方法を参照してください。
トレーディングシグナルクラスは、CExpertSignalから派生させる必要があります。さらに、LongCondition()とShortCondition()の仮想メソッドを自分自身のメソッドでオーバーライドすることが求められます。
ロシア語の書籍「最高のトレーダーの戦略」では、多くのトレーディング戦略が考察されています。私たちは、ストキャスティクス、CCI、MFI、RSIなどのオシレーターによって確認された反転ローソク足パターンに焦点を当てます。
トレードシグナルを確認するためには、CCI指標を使用します。CCIの値が臨界レベル(ロングポジション用の-50、ショートポジション用の50)を超える必要があります。
1. ハンマーとハンギングマンの反転ローソク足パターン
1.1. ハンマー
ハンマーは、小さな実体と長い下ひげを持つローソク足で、下落トレンドの後に形成されます。このパターンは、ベアリッシュトレンドの終わりを示します。

Fig. 1. ハンマーのローソク足パターン
ハンマーパターンの認識は、CheckPatternHammer()メソッドで実装されています。
//+------------------------------------------------------------------+ //| ハンマーのローソク足パターンをチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHammer() { //--- ハンマー if((MidPoint(1)<CloseAvg(2)) && (MathMin(Open(1),Close(1))>(High(1)-(High(1)-Low(1))/3.0)) && (Close(1)<Close(2)) && (Open(1)<Open(2))) return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_HAMMER)メソッドを用いて、ハンマーのローソク足パターンをチェックします。
1.2. ハンギングマン
ハンギングマンは、小さな実体と長い下ひげを持つローソク足で、上昇トレンドの後に形成されます。このパターンは、ブルリッシュトレンドの終わりを示します。

Fig. 2. ハンギングマンのローソク足パターン
ハンギングマンパターンの認識は、CheckPatternHangingMan()メソッドで実装されています。
//+------------------------------------------------------------------+ //| ハンギングマンのローソク足パターンをチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHangingMan() { //--- ハンギングマン if((MidPoint(1)>CloseAvg(2)) && (MathMin(Open(1),Close(1)>(High(1)-(High(1)-Low(1))/3.0)) && (Close(1)>Close(2)) && (Open(1)>Open(2))) return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN)メソッドを用いて、ハンギングマンのローソク足パターンをチェックします。
2. CCI指標で確認されたトレードシグナル
ロングまたはショートポジションを開くためのトレードシグナルは、CCI指標によって確認されなければなりません。CCIの値が臨界レベル(ロングポジション用の-50、ショートポジション用の50)を越える必要があります。
開いているポジションのクローズは、CCIの値に依存します。以下の2つのケースで行われます:
- CCIラインが反対の臨界レベル(ロングポジション用の80、ショートポジション用の-80)に達した場合
- 逆シグナルが確認されなかった場合(CCIが次のレベルに達したとき:ロングポジション用の-80、ショートポジション用の80)

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

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

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

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

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

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

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

Fig. 10. エキスパートアドバイザーの資金管理プロパティ
「完了」ボタンを押すことで、生成されたエキスパートアドバイザーのコードが得られ、Expert_AH_HM_CCI.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.01.01-2011.03.16、PeriodCCI=25、MA_period=5)を見てみましょう。
エキスパートアドバイザー作成時に、固定ボリューム(固定ロット取引、0.1)を使用し、トレーリングストップアルゴリズムは使用していません(トレーリングなし)。

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