皆さん、こんにちは!今日は、MQL5ウィザードを使って、ダーククラウドカバーやピアシングラインに基づいた取引シグナルを作成する方法についてお話しします。このウィザードは、クライアント端末と一緒に提供される標準ライブラリのクラスを基に、すぐに使えるエキスパートアドバイザー(EA)を作成できる便利なツールです。
このウィザードを使えば、自分の取引アイデアを素早くチェックできるので、特に初心者の方にはおすすめです。自分の取引シグナルクラスを作成するだけでOKです。その構造やサンプルについては、MQL5ウィザード:取引シグナルモジュールの作成方法の記事を参照してください。
基本的なアイデアは、取引シグナルのクラスをCExpertSignalから派生させ、LongCondition()とShortCondition()の仮想メソッドをオーバーライドして独自のメソッドを作成することです。
ロシア語の書籍「最高のトレーダーの戦略」には多くの取引戦略が紹介されていますが、今回はストキャスティクスやCCI、MFI、RSIなどのオシレーターによって確認される反転ローソク足パターンに焦点を当てます。
最適な方法は、ローソク足パターンの形成をチェックするために、CExpertSignalから派生した別のクラスを作成することです。ローソク足パターンによって生成された取引シグナルを確認するためには、CCandlePatternから派生したクラスを作成し、オシレーターなどの必要な機能を追加するだけです。
1. ダーククラウドカバーとピアシングラインの反転ローソク足パターン
1.1. ダーククラウドカバー
ダーククラウドカバーは、上昇トレンドの終わりに現れるベアリッシュな反転ローソク足パターンです。初日は長い白いローソク足が形成され、2日目にはギャップアップが発生します。しかし、2日目の終値は初日の中間点を下回ります。

ダーククラウドカバーのローソク足パターン
「ダーククラウドカバー」パターンの認識は、CCandlePatternクラスのCheckPatternDarkCloudCover()メソッドに実装されています。
//+------------------------------------------------------------------+ //| ダーククラウドカバーのローソク足パターンをチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternDarkCloudCover() { //--- ダーククラウドカバー if((Close(2)-Open(2)>AvgBody(1)) && // (長い白) (Close(1)<Close(2)) && // (Close(1)>Open(2)) && // (前のボディの中にクローズ) (MidOpenClose(2)>CloseAvg(1)) && // (上昇トレンド) (Open(1)>High(2))) // (新しい高値でオープン) return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_DARK_CLOUD_COVER)メソッドは、「ダーククラウドカバー」ローソク足パターンの形成をチェックするために使用されます。
1.2. ピアシングライン
2日目にギャップダウンが発生することで、下降トレンドが継続します。しかし、2日目の終値は初日のボディの中間点を上回ります。これにより、ベアにとってボトムが形成されている可能性を示唆します。このプライスアクションは、ローソク足チャートで見ると非常に明確ですが、バーチャートではそれほど目立ちません。2日目の終値が初日のボディにどれだけ深く侵入するかが、反転シグナルの成功の可能性を高めます。

ピアシングラインのローソク足パターン
「ピアシングライン」パターンの認識は、CCandlePatternクラスのCheckPatternPiercingLine()メソッドに実装されています。
//+------------------------------------------------------------------+ //| ピアシングラインのローソク足パターンをチェックします | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternPiercingLine() { //--- ピアシングライン if((Close(1)-Open(1)>AvgBody(1)) && // (長い白) (Open(2)-Close(2)>AvgBody(1)) && // (長い黒) (Close(1)>Close(2)) && // (Close(1)<Open(2)) && // (前のボディの中にクローズ) (MidOpenClose(2)<CloseAvg(2)) && // (下降トレンド) (Open(1)<Low(2))) // (前のローより低い位置でオープン) return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_PIERCING_LINE)メソッドは、「ピアシングライン」ローソク足パターンの形成をチェックするために使用されます。
2. MFIインジケーターで確認された取引シグナル
ロングまたはショートポジションを開くための取引シグナルは、MFIインジケーターによって確認されなければなりません。MFIインジケーターの値が40未満(ロングポジションの場合)または60を超える(ショートポジションの場合)必要があります。
オープンポジションのクローズは、MFIインジケーターの値に依存します。クローズは以下の2つのケースで行うことができます:
- MFIが反対のクリティカルレベル(ロングポジションの場合は70、ショートポジションの場合は30)に達した場合
- 逆シグナルが確認されない場合(MFIインジケーターが次のレベルに達したとき:ロングポジションの場合は30、ショートポジションの場合は70)

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

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

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

エキスパートアドバイザーのシグナルプロパティ
この場合、取引シグナルのモジュールは1つだけ使用します。
「MFIによって確認されたダーククラウドカバー/ピアシングラインに基づくシグナル」の取引シグナルモジュールを追加します:

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

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

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

エキスパートアドバイザーのマネーマネジメントプロパティ
「完了」ボタンを押すことで、生成されたエキスパートアドバイザーのコードが得られ、Expert_ADC_PL_MFI.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、PeriodMFI=49、MA_period=11)を見てみましょう。
エキスパートアドバイザーを作成する際に、固定ボリューム(固定ロットでの取引、0.1)を使用し、トレーリングストップアルゴリズムは使用しませんでした(トレーリングは使用しない)。

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