MQL5ウィザードを使うと、エキスパートアドバイザー(EA)のコードを自動で作成することができます。詳細はMQL5ウィザードでのエキスパートアドバイザー作成を参照してください。
今回は、移動平均インディケーターによる価格のクロスオーバーを基にした戦略を考察し、これをADXインディケーターで確認します。この戦略は「ADDX確認の移動平均による価格クロスオーバー信号」と呼ばれます(MQL5ウィザードでEAを自動作成する際の名称です)。
トレード信号:
- 買い: 最後に完了したバーの終値が移動平均より高く、現在と最後の完了バーの移動平均が上昇している場合。
- 売り: 最後に完了したバーの終値が移動平均より低く、現在と最後の完了バーの移動平均が下降している場合。
- 偽の信号をフィルタリングするために、トレンドの強さ(ADX>ADXmin)とトレンドの方向を方向性運動指標(DI+およびDI-)を使って確認します。
この戦略は、CSignalADX_MAクラスに実装されており、terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqhに配置する必要があります。

移動平均による価格クロスオーバー信号とADX確認の図
トレード信号の詳細
このトレーディング戦略はCSignalADX_MAクラスに実装されており、インディケーターや価格値へのアクセスを簡単にするための保護されたメソッドがいくつか含まれています:
double PlusADX(int ind) // バーのDI+ラインの値を返す double MainADX(int ind) // バーのメインラインの値を返す double MinusADX(int ind) // バーのDI-ラインの値を返す double EMA(int ind) // バーの移動平均の値を返す double Close(int ind) // バーの終値の値を返す double StateADX(int ind) // DI+とDI-ラインの差を返す double StateEMA(int ind) // EMAが上昇すれば正の値、下降すれば負の値を返す double StateClose(int ind) // 終値と移動平均の差を返す
1. ロングポジションを開く条件
ロングポジションを開くための条件:
- StateEMA(0)<0 および StateEMA(1)>0: 現在と最後の完了バーで移動平均が上昇している。
- StateClose(1)>0: 最後の完了バーの終値が移動平均より高い。
- MainADX(0)>minimum_ADX: 現在のバーのADX値が指定された最小値(トレンドの存在確認用)を超えている。
- StateADX(0)>0: DI+が現在のバーのDI-より大きい。
//+------------------------------------------------------------------+ //| ロングポジションを開く条件をチェックする | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- 条件1: 現在と最後の完了バーで移動平均が上昇している bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- 条件2: 最後の完了バーの終値が移動平均より高い bool Buy_Condition_2=(StateClose(1)>0); //--- 条件3: 現在のバーのADX値が指定された最小値を超えている(トレンド閾値) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4: 現在のバーのDI+がDI-より大きい bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; sl =m_symbol.Ask()-m_stop_loss*m_adjusted_point; tp =m_symbol.Ask()+m_take_profit*m_adjusted_point; //--- すべての条件をチェックする return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
2. ロングポジションを閉じる条件
ロングポジションを閉じるための条件:
- StateEMA(0)<0 および StateEMA(1)<0: 現在と最後の完了バーで移動平均が下降している。
- StateClose(1)<0: 最後の完了バーの終値が移動平均より低い。
- MainADX(0)>minimum_ADX: 現在のバーのADX値が指定された最小値(トレンドの存在確認用)を超えている。
- StateADX(0)<0: 現在のバーのDI-がDI+より大きい。
//+------------------------------------------------------------------+ //| ロングポジションを閉じる条件をチェックする | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- 条件1: 現在と最後の完了バーで移動平均が下降している bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- 条件2: 完了バーの終値が移動平均より低い bool Sell_Condition_2=(StateClose(1)<0); //--- 条件3: 現在のバーのADX値が指定された最小値を超えている(トレンド閾値) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4: 現在のバーのDI-がDI+より大きい bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; //--- すべての条件をチェックする return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
3. ショートポジションを開く条件
ショートポジションを開くための条件は、ロングポジションを閉じる条件と同じです。
//+------------------------------------------------------------------+ //| ショートポジションを開く条件をチェックする | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { //--- 条件1: 現在と最後の完了バーで移動平均が下降している bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- 条件2: 完了バーの終値が移動平均より低い bool Sell_Condition_2=(StateClose(1)<0); //--- 条件3: 現在のバーのADX値が指定された最小値を超えている(トレンド閾値) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4: 現在のバーのDI-がDI+より大きい bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; sl =m_symbol.Bid()+m_stop_loss*m_adjusted_point; tp =m_symbol.Bid()-m_take_profit*m_adjusted_point; //--- すべての条件をチェックする return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
4. ショートポジションを閉じる条件
ショートポジションを閉じるための条件は、ロングポジションを開く条件と同じです。
//+------------------------------------------------------------------+ //| ショートポジションを閉じる条件をチェックする | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseShort(double& price) { //--- 条件1: 現在と最後の完了バーで移動平均が上昇している bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- 条件2: 最後の完了バーの終値が移動平均より高い bool Buy_Condition_2=(StateClose(1)>0); //--- 条件3: 現在のバーのADX値が指定された最小値を超えている(トレンド閾値) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4: 現在のバーのDI+がDI-より大きい bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; //--- すべての条件をチェックする return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
MQL5ウィザードを使ったエキスパートアドバイザーの作成
この戦略に基づいたトレーディングロボットを作成するためには、「ADX確認の移動平均による価格クロスオーバー信号」を信号プロパティとして選択してください。これはMQL5ウィザードの「エキスパートアドバイザー作成」オプションにあります。

MQL5ウィザードでの「ADX確認の移動平均による価格クロスオーバー信号」の選択
次に、必要なトレーリングストップアルゴリズムと資金とリスク管理システムを指定します。エキスパートアドバイザーのコードは自動的に生成され、コンパイルしてMetaTrader 5のストラテジーテスターでテストできます。
テスト結果
このエキスパートアドバイザーの履歴データに基づくバックテストを行います(EURUSD H1、テスト期間:2010年1月1日から2011年5月1日まで、PeriodADX=33、MinimumADX=22、PeriodMA=39、StopLoss=400、TakeProfit=900)。
エキスパートアドバイザーの作成には固定ボリュームを使用しました(固定ロット取引、0.1)、トレーリングストップアルゴリズムは使用されていません(トレーリングなし)。

エキスパートアドバイザーの履歴バックテスト結果
添付ファイル: CSignalADX_MAクラスが含まれるSignalADX-MA.mqhはterminal_data_folder\MQL5\Include\Expert\Signal\に配置してください。
ma_crossover_adx.mq5には、MQL5ウィザードを使用して作成されたエキスパートアドバイザーのコードが含まれています。