今回は、MQL5ウィザードを使って、朝星・夕星パターンとRSIを組み合わせたトレードシグナルを作成する方法についてお話しします。このウィザードは、MetaTrader 5のクライアント端末に付属している標準ライブラリクラスを基に、すぐに使えるエキスパートアドバイザー(EA)を作成することができます。
トレードアイデアを素早くチェックできるので、トレーディングシグナルのクラスを作成するだけでOKです。このクラスの構造やサンプルについては、MQL5ウィザード:トレーディングシグナルモジュールの作成方法を参考にしてください。
基本的な考え方は、トレーディングシグナルのクラスがCExpertSignalから派生し、次に自分自身のメソッドでLongCondition()とShortCondition()の仮想メソッドをオーバーライドする必要があります。
ロシア語の書籍「成功したトレーダーの戦略」には、数多くのトレーディング戦略が掲載されていますが、特に注目したいのは、ストキャスティクスやCCI、MFI、RSIなどのオシレーターによって確認された反転ローソク足パターンです。
ここでは、「朝星」と「夕星」(朝のドージ星/夕のドージ星)という反転ローソク足パターンに基づくシグナルをRSI指標で確認する方法を見ていきます。トレードシグナルのモジュールはCCandlePatternクラスに基づいており、ローソク足パターンを用いたトレードシグナルの作成における簡単なサンプルです。
1. 「朝星」と「夕星」の反転ローソク足パターン
1.1. 朝星
このパターンは、下落トレンドの反転を示します。3本のローソク足で構成されています(図1)。長い黒いローソク足の後に、色は問わず小さなボディのローソク足があり、黒いローソク足のボディの外に位置します。この小さなボディは、買い手と売り手の力が均等で、市場がトレンドを変える準備が整ったことを意味します。
パターンの3本目のローソク足は、強気のローソク足で、2本目のローソク足のボディとは重なっておらず、終値は1本目の(弱気の)ローソク足のボディの中にあります。このモデルの結果となるローソク足も図1に示されています。
2本目のローソク足がドージ型の場合、このモデルは「朝のドージ星」と呼ばれます。

図1. '朝星'と'朝のドージ星'のローソク足パターン
「朝星」パターンの識別は、CheckPatternMorningStar()とCheckPatternMorningDoji()メソッドで実装されています。
//+------------------------------------------------------------------+ //| '朝星'パターンの形成を確認します | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternMorningStar() { //--- 朝星 if((Open(3)-Close(3)>AvgBody(1)) && //弱気のローソク足、そのボディは平均のローソク足のボディより大きい (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && //2本目のローソク足は小さなボディを持っている(平均のボディの半分未満) (Close(2)<Close(3)) && //2本目のローソク足の終値は1本目の終値より低い (Open(2)<Open(3)) && //2本目のローソク足の始値は1本目の始値より低い (Close(1)>MidOpenClose(3))) //最後の完成したローソク足の終値は1本目の中心より高い return(true); //--- return(false); } //+------------------------------------------------------------------+
次に「夕星」パターンについても見ていきましょう。
1.2. 夕星
このパターンは、上昇トレンドの反転を示し、3本のローソク足で構成されています(図2)。長い白いローソク足の後に、色は問わず小さなボディのローソク足があり、白いローソク足のボディの外に位置します。この小さなボディは、買い手と売り手の力が均等で、市場がトレンドを変える準備が整ったことを意味します。
パターンの3本目のローソク足は、弱気のローソク足で、2本目のローソク足のボディとは重なっておらず、終値は1本目の(強気の)ローソク足のボディの中にあります。このモデルの結果となるローソク足も図2に示されています。
2本目のローソク足がドージ型の場合、このモデルは「夕のドージ星」と呼ばれます。

図2. '夕星'と'夕のドージ星'のローソク足パターン
「夕星」と「夕のドージ星」パターンの識別方法も解説します。
//+------------------------------------------------------------------+ //| '夕星'パターンの形成を確認します | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternEveningStar() { //--- 夕星 if((Close(3)-Open(3)>AvgBody(1)) && //強気のローソク足、そのボディは平均のボディより高い (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && //2本目のローソク足は小さなボディを持っている(平均のボディの半分未満) (Close(2)>Close(3)) && //2本目のローソク足の終値は1本目の終値より高い (Open(2)>Open(3)) && //2本目のローソク足の始値は1本目の始値より高い (Close(1)<MidOpenClose(3))) //最後の完成したローソク足の終値は1本目の中心より低い return(true); //--- return(false); } //+------------------------------------------------------------------+
このように、「夕星」と「夕のドージ星」のパターンを確認するメソッドも存在します。
2. RSI指標によって確認されたトレードシグナル
ロングまたはショートポジションを開くためのトレードシグナルは、RSI指標によって確認される必要があります。RSIの値が臨界レベル(ロングポジションの場合は40、ショートポジションの場合は60)より低い/高い必要があります。
オープンポジションのクローズは、RSIの値によって決まります。これは2つのケースで行われます:
- RSIが逆の臨界レベル(ロングポジションの場合は70、ショートポジションの場合は30)に達した場合
- 逆シグナルが確認されなかった場合(RSIが次のレベルに達したとき:ロングポジションの場合は30、ショートポジションの場合は70)

図3. '朝星'パターン、RSI指標によって確認
- int CMS_ES_RSI::LongCondition() - ロングポジションを開く条件を確認(結果は80)、ショートポジションをクローズする条件(結果は40)を確認します;
- int CMS_ES_RSI::ShortCondition() - ショートポジションを開く条件を確認(結果は80)、ロングポジションをクローズする条件(結果は40)を確認します。
2.1. ロングポジションを開く/ショートポジションをクローズする
「朝星」パターンの形成は、RSI指標によって確認する必要があります:
RSI(1)<40(最後の完成したバーのRSI値が40未満である必要があります)。ショートポジションは、RSI指標が臨界レベル70または30を上回った場合にクローズされる必要があります。
//+------------------------------------------------------------------+ //| 市場へのエントリーとエグジットの条件を確認します | //| 1) 市場エントリー(ロングポジションを開く、結果=80)| //| 2) 市場エグジット(ショートポジションをクローズ、結果=40)| //+------------------------------------------------------------------+ int CMS_ES_RSI::LongCondition() { int result=0; //--- idxはエキスパートアドバイザーの動作モードを決定するために使用できます //--- idx=0 - この場合、EAは各ティックでトレード条件をチェックします //--- idx=1 - この場合、EAはニュースバーのみでトレード条件をチェックします int idx =StartIndex(); //--- ロングポジションを開く条件をチェック //--- 朝星パターンとRSI<30 if(CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) && (RSI(1)<40)) result=80; //--- ショートポジションをクローズする条件をチェック //--- 買われ過ぎ/売られ過ぎレベルのシグナルライン交差(上昇30、上昇70) if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) result=40; //--- 結果を返す return(result); }
2.2. ショートポジションを開く/ロングポジションをクローズする
「夕星」パターンの形成は、RSI指標によって確認する必要があります:
RSI(1)>60(最後の完成したバーのRSI値が60より大きい必要があります)。ロングポジションは、RSI指標が臨界レベル70または30を下回った場合にクローズされる必要があります。
//+------------------------------------------------------------------+ //| 市場へのエントリーとエグジットの条件を確認します | //| 1) 市場エントリー(ショートポジションを開く、結果=80)| //| 2) 市場エグジット(ロングポジションをクローズ、結果=40)| //+------------------------------------------------------------------+ int CMS_ES_RSI::ShortCondition() { int result=0; //--- idxはエキスパートアドバイザーの動作モードを決定するために使用できます //--- idx=0 - この場合、EAは各ティックでトレード条件をチェックします //--- idx=1 - この場合、EAはニュースバーのみでトレード条件をチェックします int idx =StartIndex(); //--- ショートポジションを開く条件をチェック //--- 夕星パターンとRSI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) && (RSI(1)>60)) result=80; //--- ロングポジションをクローズする条件をチェック //--- シグナルライン交差の買われ過ぎ/売られ過ぎレベル(下降70、下降30) if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) result=40; //--- 結果を返す return(result); }
2.3. MQL5ウィザードを使ったエキスパートアドバイザーの作成
CMS_ES_RSIクラスは標準ライブラリクラスに含まれていないため、使用するにはacms_es_rsi.mqhファイルをダウンロードして、client_terminal_data_folder\MQL5\Include\Expert\Signal\MySignalsに保存します。candlepatterns.mqhファイルについても同様の手順を踏みます。MetaEditorを再起動した後にMQL5ウィザードで使用できます。
エキスパートアドバイザーを作成するには、MQL5ウィザードを起動します:

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

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

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

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

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

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

図10. エキスパートアドバイザーの資金管理プロパティ
「完了」ボタンを押すことで、生成されたエキスパートアドバイザーのコードを取得します。このコードは、terminal_data_folder\MQL5\Experts\に保存されます。
生成されたエキスパートアドバイザーのデフォルト入力パラメータ:
//--- メインシグナルの入力 input int Signal_ThresholdOpen =10; // オープンのためのシグナル閾値 input int Signal_ThresholdClose =10; // クローズのためのシグナル閾値 input double Signal_PriceLevel =0.0; // 取引を実行する価格レベル input double Signal_StopLevel =50.0; // ストップロスレベル(ポイント単位) input double Signal_TakeLevel =50.0 // テイクプロフィットレベル(ポイント単位)
これを次のように置き換えます:
//--- メインシグナルの入力 input int Signal_ThresholdOpen =40; // オープンのためのシグナル閾値 input int Signal_ThresholdClose =20; // クローズのためのシグナル閾値 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.04、PeriodK=47、PeriodD=9、PeriodSlow=13、MA_period=5)でのバックテストを考えてみましょう。
エキスパートアドバイザーの作成には固定ボリューム(固定ロットでの取引、0.1)を使用し、トレーリングストップアルゴリズムは使用しません(トレーリングなし)。

図11. 朝星・夕星+RSIに基づくエキスパートアドバイザーのテスト結果
最適な入力パラメータは、MetaTrader 5のストラテジーテスターを使用して見つけることができます。
パラメータの研究は、ストラテジーテスターの3Dビジュアライゼーションモードを使用することで大幅に簡素化されます。このモードは、419ビルドから追加されました(図12):

図12. PeriodRSIおよびMA_period入力パラメータの関数としてのバランス
MQL5ウィザードで作成されたエキスパートアドバイザーのコードは、expert_ms_es_rsi.mq5に添付されています。