皆さん、こんにちは!今日は、MQL5ウィザードを使って、朝星と夕星のパターンを基にした取引シグナルの作成方法をご紹介します。これにより、取引アイデアを迅速にチェックすることができ、独自の取引シグナルクラスを作成することができます。クラスの構造や例については、MQL5ウィザード:取引シグナルモジュールの作成方法を参照してください。
基本的な考え方は、取引シグナルのクラスをCExpertSignalから派生させ、LongCondition()及びShortCondition()の仮想メソッドを自分のメソッドでオーバーライドする必要があります。
ロシア語の書籍『ベストトレーダーの戦略』には多くの取引戦略が考察されていますが、ここでは、ストキャスティクス、CCI、MFI、RSIといったオシレーターで確認された逆転のキャンドルパターンに焦点を当てていきます。
1. 朝星と夕星の逆転キャンドルパターン
1.1. 朝星
このパターンは下落トレンドの反転を示し、3つのキャンドルで構成されています(図1参照)。長い黒キャンドルの後に、色に関係なく小さなボディを持つキャンドルがあり、そのキャンドルは黒キャンドルのボディの外に位置します。この小さなボディは、ブルとベアの力が等しいことを意味し、市場がトレンドを変える準備が整っていることを示しています。
パターンの3つ目のキャンドルはブルのキャンドルで、ボディは2つ目のキャンドルのボディと重なりません。また、クローズ価格は1つ目の(ベアの)キャンドルのボディの中にあります。このモデルの結果のキャンドルも図1に表示されています。

図1. 朝星と朝ドジ星のキャンドルパターン
「朝星」パターンの識別は、CCandlePatternクラスのCheckPatternMorningStar()及びCheckPatternMorningDoji()メソッドで実装されています。
//+------------------------------------------------------------------+ //| Check formation of the "Morning Star" pattern | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternMorningStar() { //--- Morning Star if((Open(3)-Close(3)>AvgBody(1)) && // bearish candle, its body greater than average candle body (MathAbs(Close(2)-Open(2)<AvgBody(1*0.5)) && // second candle has small body (lower than half of the average body) (Close(2)<Close(3)) && // close of the second candle is lower than close of the first (Open(2)<Open(3)) && // open of the second candle is lower than open of the first (Close(1)>MidOpenClose(3))) // close of the last completed candle is higher than center of the first return(true); //--- return(false); } //+------------------------------------------------------------------+
1.2. 夕星
このパターンは上昇トレンドの反転を示し、3つのキャンドルで構成されています(図2参照)。長い白キャンドルの後に、色に関係なく小さなボディを持つキャンドルがあります。この小さなボディは、ブルとベアの力が等しいことを示し、市場がトレンドを変える準備が整っていることを示します。
パターンの3つ目のキャンドルはベアのキャンドルで、ボディは2つ目のキャンドルのボディと重なりません。また、クローズ価格は1つ目の(ブルの)キャンドルのボディの中にあります。このモデルの結果のキャンドルも図2に表示されています。

図2. 夕星と夕ドジ星のキャンドルパターン
ここでは、「夕星」と「夕ドジ星」パターンを識別するメソッドを紹介します:
//+------------------------------------------------------------------+ //| Check formation of the "Evening Star" pattern | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternEveningStar() { //--- Evening Star if((Close(3)-Open(3)>AvgBody(1)) && // bullish candle with body higher than average body (MathAbs(Close(2)-Open(2)<AvgBody(1*0.5)) && // second candle has a small body (less than half of the average) (Close(2)>Close(3)) && // close of the second candle is higher than close of the first (Open(2)>Open(3)) && // open of the second candle is higher than open of the first (Close(1)<MidOpenClose(3))) // close of the last completed candle is lower than center of the first return(true); //--- return(false); } //+------------------------------------------------------------------+
2. MFIインジケーターで確認された取引シグナル
ロングまたはショートポジションを開くための取引シグナルは、MFIインジケーターによって確認される必要があります。MFIの値は、ロングポジションの場合は40未満、ショートポジションの場合は60を超える必要があります。
オープンポジションのクローズは、MFIインジケーターの値に依存します。クローズは次の2つのケースで行われます:
- MFIが反対のクリティカルレベル(ロングポジションの場合は70、ショートポジションの場合は30)に達した場合
- 逆シグナルが確認されない場合(MFIインジケーターが次のレベルに達した場合:ロングポジションの場合は30、ショートポジションの場合は70)

図3. MFIインジケーターで確認された朝星パターン
- int CMS_ES_MFI::LongCondition() - ロングポジションを開く条件をチェックし(80を返す)、ショートポジションをクローズする条件をチェックします(40を返す);
- int CMS_ES_MFI::ShortCondition() - ショートポジションを開く条件をチェックし(80を返す)、ロングポジションをクローズする条件をチェックします(40を返す)。
2.1. ロングポジションを開く/ショートポジションをクローズする
「朝星」パターンの形成は、MFIインジケーターによって確認されなければなりません:MFi(1)<40(最終完了バーのMFIインジケーターの値は40未満である必要があります)。
ショートポジションは、MFIインジケーターがクリティカルレベル(70または30)を上回った場合にクローズされます。
//+------------------------------------------------------------------+ //| 市場へのエントリーとエグジット条件をチェックします | //| 1) 市場エントリー(ロングポジションを開く、結果=80) | //| 2) 市場エグジット(ショートポジションをクローズする、結果=40) | //+------------------------------------------------------------------+ int CMS_ES_MFI::LongCondition() { int result=0; //--- idxはExpert Advisorの動作モードを決定するために使用できます //--- idx=0 - この場合、EAは各ティックで取引条件をチェックします //--- idx=1 - この場合、EAはニュースバーのみで取引条件をチェックします int idx =StartIndex(); //--- ロングポジションを開く条件のチェック //--- 朝星パターンの形成とMFI<40 if(CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) && (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 CMS_ES_MFI::ShortCondition() { int result=0; //--- idxはExpert Advisorの動作モードを決定するために使用できます //--- idx=0 - この場合、EAは各ティックで取引条件をチェックします //--- idx=1 - この場合、EAはニュースバーのみで取引条件をチェックします int idx =StartIndex(); //--- ショートポジションを開く条件のチェック //--- 夕星パターンの形成とMFI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) && (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ウィザードを使用してエキスパートアドバイザーを作成する
CMS_ES_MFIクラスはスタンダードライブラリのクラスには含まれていません。このクラスを使用するには、ams_es_mfi.mqhファイルをダウンロードし、client_terminal_data_folder\MQL5\Include\Expert\Signal\MySignalsに保存する必要があります。同様に、acandlepatterns.mqhファイルも行う必要があります。これらはMetaEditorを再起動後にMQL5ウィザードで使用できます。
エキスパートアドバイザーを作成するには、MQL5ウィザードを起動します:

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

図5. エキスパートアドバイザーの一般的なプロパティ
その後、使用する取引シグナルモジュールを選択する必要があります。

図6. エキスパートアドバイザーのシグナルプロパティ
今回は、取引シグナルモジュールを1つだけ使用します。
「MFIで確認された朝星・夕星に基づくシグナル」モジュールを追加:

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

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

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

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

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