MetaTrader 5のMQL5ウィザードを使うことで、トレードシグナルを簡単に作成できるエキスパートアドバイザー(EA)を生成することができます。このツールは、クライアントターミナルに付属するスタンダードライブラリクラスを基にしたEAを作成することを可能にします(詳細についてはこちらを参照してください)。自身のトレードアイデアをすぐにチェックするために、自作のトレードシグナルクラスを作成するだけで済みます。このクラスの構造やサンプルについては、記事MQL5ウィザード:トレードシグナルモジュールの作成方法で確認できます。
基本的なアイデアは、トレードシグナルのクラスがCExpertSignalから派生し、次に、自分自身のメソッドを使ってLongCondition()とShortCondition()の仮想メソッドをオーバーライドする必要があるということです。
ロシア語の書籍「最高のトレーダーの戦略」では、多くのトレーディング戦略が考察されていますが、ここでは、ストキャスティクス、CCI、MFI、RSIなどのオシレーターで確認されたリバーサルキャンドルパターンに焦点を当てます。
最適な方法は、キャンドルパターンの形成をチェックするために、CExpertSignalから派生した別のクラスを作成することです。キャンドルパターンによって生成されたトレードシグナルの確認には、CCandlePatternから派生したクラスを作成し、必要な機能(たとえば、オシレーターによる確認)を追加するだけで済みます。
ここでは、CCIインジケーターによって確認された「3つの黒いカラス/3つの白い兵士」というリバーサルキャンドルパターンに基づくシグナルを考察します。トレードシグナルモジュールはCCandlePatternクラスに基づいており、キャンドルパターンを用いたトレードシグナルの作成に関する簡単な例です。
1. 「3つの黒いカラス」と「3つの白い兵士」リバーサルキャンドルパターン
1.1. 3つの黒いカラス
これは、現在の上昇トレンドの反転を予測するために使用されるベアリッシュなキャンドルパターンです。このパターンは、前の日よりも低い位置でクローズした3本の連続したロングボディのキャンドルから成り、各セッションのオープンは前のキャンドルのボディ内で行われます。

図1: 「3つの黒いカラス」キャンドルパターン
「3つの黒いカラス」パターンの認識は、CCandlePatternクラスのCheckPatternThreeBlackCrowsメソッドに実装されています。
//+------------------------------------------------------------------+
//| "3つの黒いカラス"キャンドルパターンの形成をチェックする |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternThreeBlackCrows()
{
//--- 3つの黒いカラス
if((Open(3)-Close(3)>AvgBody(1)) &&
(Open(2)-Close(2)>AvgBody(1)) &&
(Open(1)-Close(1)>AvgBody(1)) &&
(MidPoint(2)(MidPoint(1) return(true);
//---
return(false);
}
CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS)メソッドは、「3つの黒いカラス」キャンドルパターンの形成をチェックするために使用されます。
1.2. 3つの白い兵士キャンドルパターン
これは、現在の下降トレンドの反転を予測するために使用されるブルリッシュなキャンドルパターンです。このパターンは、前の日よりも高い位置でクローズした3本の連続したロングボディのキャンドルから成り、各セッションのオープンは前のキャンドルのボディ内で行われます。
このパターンは、2日目のキャンドルが1日目の範囲の上半分にオープンする限り有効です。2日目がその高値近くでクローズし、非常に小さいか存在しない上影を残す必要があります。3日目にも同じパターンが繰り返されます。

図2: 「3つの白い兵士」キャンドルパターン
「3つの白い兵士」パターンの認識メソッドは以下の通りです。
//+------------------------------------------------------------------+
//| "3つの白い兵士"キャンドルパターンの形成をチェックする |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternThreeWhiteSoldiers()
{
//--- 3つの白い兵士
if((Close(3)-Open(3)>AvgBody(1)) &&
(Close(2)-Open(2)>AvgBody(1)) &&
(Close(1)-Open(1)>AvgBody(1)) &&
(MidPoint(2)>MidPoint(3)) &&
(MidPoint(1)>MidPoint(2)))
return(true);
//---
return(false);
}
CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS)メソッドは、「3つの白い兵士」キャンドルパターンの形成をチェックするために使用されます。
2. CCIインジケーターによって確認されたトレードシグナル
ロングまたはショートポジションを開くためのトレーディングシグナルは、CCIインジケーターによって確認される必要があります。CCIの値は、クリティカルレベル(ロングポジションの場合は-50、ショートポジションの場合は50)を超える必要があります。
オープンポジションのクローズは、CCIの値に依存します。これは2つのケースで行われます:
- CCIラインが対になるクリティカルレベル(ロングポジションの場合は80、ショートポジションの場合は-80)に達した場合
- 逆シグナルが確認されない場合(CCIが次のレベルに達する際:ロングポジションの場合は-80、ショートポジションの場合は80)

図3: CCIインジケーターによって確認された「3つの黒いカラス」パターン
- int CBC_WS_CCI::LongCondition() - ロングポジションを開く条件をチェックし(戻り値は80)、ショートポジションをクローズする条件をチェックします(戻り値は40);
- int CBC_WS_CCI::ShortCondition() - ショートポジションを開く条件をチェックし(戻り値は80)、ロングポジションをクローズする条件をチェックします(戻り値は40)。
2.1. ロングポジションを開く/ショートポジションをクローズする
「3つの黒いカラス」パターンの形成は、CCIインジケーターによって確認される必要があります:CCI(1)<-50(最新の完了したバーのCCIの値は-50未満でなければなりません)。
ショートポジションは、CCIインジケーターがクリティカルレベル-80を上に越えた際、またはクリティカルレベル80を下に越えた際にクローズされます。
//+------------------------------------------------------------------+
//| 市場への入出の条件をチェックする |
//| 1) 市場への入場(ロングポジションを開く、結果=80) |
//| 2) 市場からの退出(ショートポジションをクローズ、結果=40) |
//+------------------------------------------------------------------+
int CBC_WS_CCI::LongCondition()
{
int result=0;
//--- idxはエキスパートアドバイザーの動作モードを決定するために使用できます
//--- idx=0 - この場合、EAは各ティックでトレード条件をチェックします
//--- idx=1 - この場合、EAはニュースバーでのみトレード条件をチェックします
int idx = StartIndex();
//--- ロングポジションを開く条件をチェックします
//--- 3つの白い兵士パターンとCCI<-50
if(CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) && (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. ショートポジションを開く/ロングポジションをクローズする
「3つの白い兵士」パターンの形成は、CCIインジケーターによって確認される必要があります:CCI(1)>50(最新の完了したバーのCCIの値は50を超えなければなりません)。
ロングポジションは、CCIインジケーターが-80レベルまたは80レベルを下に越えた際にクローズされます。
//+------------------------------------------------------------------+
//| 市場への入出の条件をチェックする |
//| 1) 市場への入場(ショートポジションを開く、結果=80) |
//| 2) 市場からの退出(ロングポジションをクローズ、結果=40) |
//+------------------------------------------------------------------+
int CBC_WS_CCI::ShortCondition()
{
int result=0;
//--- idxはエキスパートアドバイザーの動作モードを決定するために使用できます
//--- idx=0 - この場合、EAは各ティックでトレード条件をチェックします
//--- idx=1 - この場合、EAはニュースバーでのみトレード条件をチェックします
int idx = StartIndex();
//--- ショートポジションを開く条件をチェックします
//--- 3つの黒いカラスパターンとCCI>50
if(CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) && (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ウィザードを使用してエキスパートアドバイザーを作成する
CBC_WS_CCIクラスはスタンダードライブラリクラスに含まれていないため、使用するにはacbc_ws_cci.mqhファイルをダウンロードし、client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignalsに保存する必要があります。同様に、candlepatterns.mqhファイルも保存してください。MetaEditorを再起動後、MQL5ウィザードで使用できます。
エキスパートアドバイザーを作成するには、MQL5ウィザードを起動します:

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

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

図6: エキスパートアドバイザーのシグナルプロパティ
この場合、1つのトレードシグナルモジュールのみを使用します。
「CCIによって確認された3つの黒いカラス/3つの白い兵士に基づくシグナル」トレードシグナルモジュールを追加します:

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

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

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

図10: エキスパートアドバイザーのマネーマネジメントプロパティ
「完了」ボタンを押すことで、生成されたエキスパートアドバイザーのコードが得られ、Expert_ABC_WS_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ウィザードによって生成されたエキスパートアドバイザーは、トレードシグナルモジュールからの「投票」を使用してポジションのオープンとクローズを行います。メインモジュールの投票(コンテナとして、すべての追加モジュールを含む)も使用されますが、その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、PeriodCCI=37、MA_period=13)で考察します。
エキスパートアドバイザーの作成にあたって、固定ボリューム(固定ロットでの取引、0.1)を使用し、トレーリングストップアルゴリズムは使用していません(トレーリング未使用)。

図11: 3つの黒いカラス/3つの白い兵士 + CCIに基づくエキスパートアドバイザーのテスト結果
最適な入力パラメータのセットは、MetaTrader 5クライアントターミナルのストラテジーテスターを使用して見つけることができます。
MQL5ウィザードで作成されたエキスパートアドバイザーのコードは、expert_abc_ws_cci.mq5に添付されています。