MQL5 Wizard 允许自动创建专家顾问(EA)的代码。在 MQL5 Wizard创建现成的专家顾问 里可以找到更多细节。
今天,我们将讨论一种基于移动平均线交叉的交易策略,并且通过ADX指标进行确认。这种策略被称为 “基于移动平均线交叉及ADX确认的交易信号” (在MQL5 Wizard中自动创建EA时使用的名称)。
交易信号:
- 买入:最近完成的K线收盘价高于移动平均线,且当前和最近完成的K线移动平均线均在上升。
- 卖出:最近完成的K线收盘价低于移动平均线,且当前和最近完成的K线移动平均线均在下降。
- 为了过滤虚假信号,需检查趋势强度(ADX > ADXmin)和趋势方向,使用方向性运动指标(DI+和DI-)进行确认。
该策略在 CSignalADX_MA 类中实现(需要将其放置在 terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh)。

基于移动平均线交叉的交易信号图示,确认通过ADX
交易信号细节
该交易策略在 CSignalADX_MA 类中实现,包含一些保护方法,以简化对指标和价格值的访问:
double PlusADX(int ind) // 返回K线的DI+值 double MainADX(int ind) // 返回K线的主线值 double MinusADX(int ind) // 返回K线的DI-值 double EMA(int ind) // 返回K线的移动平均值 double Close(int ind) // 返回K线的收盘价 double StateADX(int ind) // 返回DI+和DI-之间的差值 double StateEMA(int ind) // 返回EMA的变化(正值为上升,负值为下降) double StateClose(int ind) // 返回收盘价与移动平均线的差值
1. 开仓条件
开多仓的条件:
- StateEMA(0) < 0 且 StateEMA(1) > 0:移动平均线当前和最近完成K线在上升;
- StateClose(1) > 0:最近完成K线的收盘价高于移动平均线;
- MainADX(0) > minimum_ADX:当前K线的ADX值大于指定的最小值(用于检查趋势存在);
- StateADX(0) > 0:当前K线的DI+大于DI-。
//+------------------------------------------------------------------+ //| 检查开多仓条件 | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- 条件1:移动平均线在当前和最近完成K线上升 bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- 条件2:最近完成K线的收盘价高于移动平均线 bool Buy_Condition_2=(StateClose(1)>0); //--- 条件3:当前K线的ADX值大于指定的最小值(趋势阈值) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4:当前K线的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:移动平均线在当前和最近完成K线上下降;
- StateClose(1) < 0:最近完成K线的收盘价低于移动平均线;
- MainADX(0) > minimum_ADX:当前K线的ADX值大于指定的最小值(趋势阈值);
- StateADX(0) < 0:当前K线的DI-大于DI+。
//+------------------------------------------------------------------+ //| 检查平多仓条件 | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- 条件1:移动平均线在当前和最近完成K线上下降 bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- 条件2:最近完成K线的收盘价低于移动平均线 bool Sell_Condition_2=(StateClose(1)<0); //--- 条件3:当前K线的ADX值大于指定的最小值(趋势阈值) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4:当前K线的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:移动平均线在当前和最近完成K线上下降 bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- 条件2:最近完成K线的收盘价低于移动平均线 bool Sell_Condition_2=(StateClose(1)<0); //--- 条件3:当前K线的ADX值大于指定的最小值(趋势阈值) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4:当前K线的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:移动平均线在当前和最近完成K线上升 bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- 条件2:最近完成K线的收盘价高于移动平均线 bool Buy_Condition_2=(StateClose(1)>0); //--- 条件3:当前K线的ADX值大于指定的最小值(趋势阈值) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 条件4:当前K线的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 Wizard创建专家顾问
要基于该策略创建交易机器人,您需要在 “创建现成的专家顾问” 选项中选择信号属性为 “基于移动平均线交叉及ADX确认的信号”,该选项在MQL5 Wizard 中可以找到:

选择“基于移动平均线交叉及ADX确认的信号”在MQL5 Wizard中
接下来,您需要指定所需的 移动止损 算法和 资金和风险管理 系统。EA的代码将自动创建,您可以在 MetaTrader 5的策略测试器中编译和测试。
测试结果
让我们来看一下在历史数据上的EA回测结果(EURUSD H1,测试周期:2010年1月1日-2011年5月1日,PeriodADX=33,MinimumADX=22,PeriodMA=39,StopLoss=400,TakeProfit=900)。
在创建EA时,我们使用了固定的交易量(固定手数交易,0.1),未使用移动止损算法(未使用移动止损)。

基于移动平均线交叉及ADX确认的EA的历史回测结果
附加文件: SignalADX-MA.mqh 文件与 CSignalADX_MA 类需放置在 terminal_data_folder\MQL5\Include\Expert\Signal\ 中。
ma_crossover_adx.mq5 包含通过MQL5 Wizard创建的EA代码。