皆さん、こんにちは!今回は、MQL5ウィザードを使って、標準ライブラリのクラスを基にしたエキスパートアドバイザー(EA)を作成する方法をご紹介します。このツールを使えば、自分の取引アイデアをすぐにチェックできるので、取引シグナルクラスを自分で作成するだけでOKです。詳しい情報は、MQL5ウィザードでの取引シグナルモジュールの作成方法を参考にしてください。
基本的な考え方は、取引シグナルのクラスをCExpertSignalから派生させて、LongCondition()とShortCondition()の仮想メソッドを自分のメソッドでオーバーライドすることです。
ここでは、CCI指標を用いて確認された「強気包み」と「弱気包み」の反転キャンドルパターンについて取り上げます。この取引シグナルモジュールは、CCandlePatternクラスに基づいており、キャンドルパターンを用いた取引シグナルの作成にシンプルな例として使えます。
1. 「強気包み」と「弱気包み」の反転キャンドルパターン
1.1. 強気包み
「強気包み」反転パターンは、下降トレンドの際に、小さな黒いキャンドルの後に、大きな白いキャンドルが続き、前日のキャンドルを完全に覆う(「包み込む」)形で形成されます。小さなキャンドルの影(テール)は短いため、大きなキャンドルのボディが前日のキャンドル全体を覆うことができます。

Fig. 1. 強気包みキャンドルパターン
「強気包み」パターンの認識は、CCandlePatternクラスのCheckPatternBullishEngulfing()メソッドで実装されています。
//+------------------------------------------------------------------+ //| Checks formation of "Bullish Engulfing" candlestick pattern | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishEngulfing() { //--- Bullish Engulfing if((Open(2)>Close(2)) && // previous candle is bearish (Close(1)-Open(1)>AvgBody(1)) && // body of the bullish candle is higher than average value of the body (Close(1)>Open(2)) && // close price of the bullish candle is higher than open price of the bearish candle (MidOpenClose(2)<CloseAvg(2)) && // downtrend (Open(1)<Close(2))) // open price of the bullish candle is lower than close price of the bearish return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING)メソッドは「強気包み」キャンドルパターンの形成をチェックするために使用されます。
1.2. 弱気包み
「弱気包み」反転パターンは、上昇トレンドの際に、小さな白いキャンドルの後に、大きな黒いキャンドルが続き、前日のキャンドルを完全に覆う形で形成されます。小さなキャンドルの影(テール)は短いため、大きなキャンドルのボディが前日のキャンドル全体を覆うことができます。

Fig. 2. 弱気包みキャンドルパターン
「弱気包み」パターンの認識は、CCandlePatternクラスのCheckPatternBearishEngulfing()メソッドで実装されています。
//+------------------------------------------------------------------+ //| Checks formation of "Bearish Engulfing" candlestick pattern | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishEngulfing() { //--- Bearish Engulfing if((Open(2)<Close(2)) && // previous candle is bearish (Open(1)-Close(1)>AvgBody(1)) && // body of the candle is higher than average value of the body (Close(1)<Open(2)) && // close price of the bearish candle is lower than open price of the bullish candle (MidOpenClose(2)>CloseAvg(2)) && // uptrend (Open(1)>Close(2))) // Open price of the bearish candle is higher than close price of the bullish candle return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING)メソッドは「弱気包み」キャンドルパターンの形成をチェックするために使用されます。
2. CCI指標によって確認される取引シグナル
ロングまたはショートポジションを開くための取引シグナルは、CCI指標によって確認される必要があります。CCIの値は、クリティカルレベル(ロングポジションの場合は-50、ショートポジションの場合は50)を越えなければなりません。
開いたポジションのクローズは、CCIの値に依存します。これには2つのケースがあります:
- CCIラインが反対のクリティカルレベル(ロングポジションの場合は80、ショートポジションの場合は-80)に達した場合
- 逆シグナルが確認されない場合(CCIが次のレベルに達する場合:ロングポジションの場合は-80、ショートポジションの場合は80)

Fig. 3. CCI指標によって確認された「強気包み」パターン
- int CBE_BE_CCI::LongCondition() - ロングポジションを開く条件をチェックします(結果=80)およびショートポジションをクローズします(結果=40);
- int CBE_BE_CCI::ShortCondition() - ショートポジションを開く条件をチェックします(結果=80)およびロングポジションをクローズします(結果=40)。
2.1. ロングポジションを開く/ショートポジションをクローズする
「強気包み」パターンは、CCI指標によって確認されなければなりません:CCI(1)<-50(最後の完成したバーのCCI値は-50未満である必要があります)。
ショートポジションは、CCI指標がクリティカルレベル-80を上回るか、クリティカルレベル80を下回った場合にクローズされます。
//+------------------------------------------------------------------+ //| Checks conditions for entry and exit from market | //| 1) Market entry (open long position, result=80) | //| 2) Market exit (close short position, result=40) | //+------------------------------------------------------------------+ int CBE_BE_CCI::LongCondition() { int result=0; //--- idx can be used to determine Expert Advisor work mode //--- idx=0 - in this case EA checks trade conditions at each tick //--- idx=1 - in this case EA checks trade condition only at news bars int idx =StartIndex(); //--- checking of conditions to open long position //--- formation of Bullish Engulfing pattern and CCI<-50 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) && (CCI(1)<-50)) result=80; //--- checking of conditions to close short position //--- signal line crossover of overbought/oversold levels (downward -80, downward -80) if(((CCI(1)>-80) && (CCI(2)<-80)) || ((CCI(1)<80) && (CCI(2)>80))) result=40; //--- return result return(result); }
2.2. ショートポジションを開く/ロングポジションをクローズする
「弱気包み」パターンは、CCI指標によって確認されなければなりません:CCI(1)>50(最後の完成したバーのCCI値は50より大きい必要があります)。
ロングポジションは、CCI指標が-80または80レベルを下回った場合にクローズされます。
//+------------------------------------------------------------------+ //| Checks conditions for entry and exit from market | //| 1) Market entry (open short position, result=80) | //| 2) Market exit (close long position, result=40) | //+------------------------------------------------------------------+ int CBE_BE_CCI::ShortCondition() { int result=0; //--- idx can be used to determine Expert Advisor work mode //--- idx=0 - in this case EA checks trade conditions at each tick //--- idx=1 - in this case EA checks trade condition only at news bars int idx =StartIndex(); //--- checking of conditions to open short position //--- formation of Bearish Engulfing pattern and CCI>50 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) && (CCI(1)>50)) result=80; //--- checking of conditions to close long position //--- signal line crossover of overbought/oversold levels (downward -80, downward 80) if(((CCI(1)<80) && (CCI(2)>80)) || ((CCI(1)<-80) && (CCI(2)>-80))) result=40; //--- return result return(result); }
2.3. MQL5ウィザードを使ったエキスパートアドバイザーの作成
CBE_BE_CCIクラスは標準ライブラリのクラスに含まれていないため、acbe_be_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. エキスパートアドバイザーの資金管理プロパティ
「完了」ボタンを押すことで、生成されたエキスパートアドバイザーのコードが得られます。これは、terminal_data_folder\MQL5\Experts\に保存されます。
生成されたエキスパートアドバイザーのデフォルトの入力パラメータは以下の通りです:
//--- inputs for main signal input int Signal_ThresholdOpen =10; // Signal threshold value to open [0...100] input int Signal_ThresholdClose =10; // Signal threshold value to close [0...100] input double Signal_PriceLevel =0.0; // Price level to execute a deal input double Signal_StopLevel =50.0; // Stop Loss level (in points) input double Signal_TakeLevel =50.0; // Take Profit level (in points)
これを次のように変更する必要があります:
//--- inputs for main signal input int Signal_ThresholdOpen =40; // Signal threshold value to open [0...100] input int Signal_ThresholdClose =20; // Signal threshold value to close [0...100] input double Signal_PriceLevel =0.0; // Price level to execute a deal input double Signal_StopLevel =0.0; // Stop Loss level (in points) input double Signal_TakeLevel =0.0 // Take Profit level (in points)
Signal_ThresholdOpen/Signal_ThresholdCloseの入力パラメータは、ポジションを開くためとクローズするための閾値レベルを指定することができます。
LongCondition()およびShortCondition()メソッドのコードでは、閾値の固定値が指定されています:
- ポジションをオープン:80;
- ポジションをクローズ:40。
MQL5ウィザードによって生成されたエキスパートアドバイザーは、取引シグナルのモジュールからの「投票」を使ってポジションを開閉します。メインモジュールの「投票」結果も使用されますが、LongCondition()およびShortCondition()メソッドは常に0を返します。
メインモジュールの投票結果も「投票」平均化に使用されます。この場合、メインモジュール + 1つの取引シグナルモジュールとなるため、閾値を設定する際にこの点を考慮する必要があります。このため、ThresholdOpenは40=(0+80)/2、ThresholdCloseは20=(0+40)/2として設定される必要があります。
Signal_StopLevelおよびSignal_TakeLevelの入力パラメータは0に設定されており、クローズ条件が真のときのみポジションがクローズされます。
2.4. 歴史的バックテスト結果
エキスパートアドバイザーの歴史データ(EURUSD H1、テスト期間:2010.01.01-2011.03.16、PeriodCCI=49、MA_period=11)に基づくバックテストを考察しましょう。
エキスパートアドバイザーの作成には、固定ボリューム(Trading Fixed Lot、0.1)を使用し、トレーリングストップアルゴリズムは使用されていません(Trailing not used)。

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