MQL5向导允许我们创建基于 标准库 类的现成专家顾问(EA)。这一工具能快速验证我们的交易思路,只需要创建自己的交易信号类即可。关于这个类的结构和示例,可以参考 MQL5向导:如何创建交易信号模块。
基本思路是:交易信号类继承自 CExpertSignal,然后重写 LongCondition() 和 ShortCondition() 这两个虚方法,使用我们自己的方法。
有一本书 《最佳交易者策略》(俄文),书中讨论了很多交易策略,我们将重点关注由 随机指标 确认的反转蜡烛图形态,例如锤子和悬挂人形态,此外还有 CCI、MFI 和 RSI 等振荡器。
最佳方式是创建一个单独的类,继承自 CExpertSignal,用于检查蜡烛图形态的形成。为了确认由蜡烛图模式生成的交易信号,只需编写一个继承自 CCandlePattern 的类,并在其中添加必要的确认特性(例如通过振荡器的确认)。
接下来,我们将讨论基于“锤子/悬挂人”反转蜡烛图形态的信号,并通过 随机指标 进行确认。该交易信号模块基于 CCandlePattern 类,这是一个使用蜡烛图模式创建交易信号的简单示例。
1. “锤子”和“悬挂人”反转蜡烛图形态
1.1. 锤子
“锤子”是一个小身体和长下影线的蜡烛图形态,通常在价格下跌后形成。锤子形态通常表示空头趋势的结束。
蜡烛图身体的颜色并不重要,但看涨的锤子表明了更强的看涨潜力。锤子形态的身体通常在前一根蜡烛的最低点附近形成。较长的下影线和较短的上影线会提高反转形态的潜力。

图1. 锤子蜡烛图形态
“锤子”形态的识别通过 CheckPatternHammer() 方法在 CCandlePattern 类中实现:
//+------------------------------------------------------------------+ //| 检查“锤子”蜡烛图形态的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHammer() { //--- 锤子 if((MidPoint(1)<CloseAvg(2)) && // 下跌趋势 (MathMin(Open(1),Close(1))>(High(1)-(High(1)-Low(1))/3.0)) && // 身体在上1/3 (Close(1)2)) && (Open(1) 2))) // 身体缺口 return(true); //--- return(false); }
在 CCandlePattern 类中,CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) 方法用于检查“锤子”蜡烛图形态的形成。
1.2. 悬挂人
“悬挂人”是一个小身体和长下影线的蜡烛图形态,通常在价格上涨后形成。悬挂人形态通常表示看涨趋势的结束。
蜡烛图身体的颜色并不重要,但看跌的蜡烛表明了更强的看跌潜力。悬挂人形态的身体通常在前一根蜡烛的最高点附近形成。较长的下影线和较短的上影线会提高反转形态的潜力。

图2. 悬挂人蜡烛图形态
“悬挂人”形态的识别通过 CheckPatternHangingMan() 方法在 CCandlePattern 类中实现:
//+------------------------------------------------------------------+ //| 检查“悬挂人”蜡烛图形态的形成 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHangingMan() { //--- 悬挂人 if((MidPoint(1)>CloseAvg(2)) && // 上涨趋势 (MathMin(Open(1),Close(1)>(High(1)-(High(1)-Low(1))/3.0)) && // 身体在上1/3 (Close(1)>Close(2)) && (Open(1)>Open(2))) // 身体缺口 return(true); //--- return(false); }
在 CCandlePattern 类中,CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) 方法用于检查“悬挂人”蜡烛图形态的形成。
2. 由随机指标确认的交易信号
打开多头或空头头寸的交易信号必须由 随机指标 确认。信号 %D 线必须高于/低于相应的关键水平(30 或 70)。
已开头寸的平仓取决于 %D 指标的值。平仓可以在两种情况下进行:
- 如果 %D 线达到相反的关键水平(多头头寸为 80,空头头寸为 20)
- 如果反向信号未得到确认(当 %D 线达到以下水平:多头为 20,空头为 80)

图3. 由随机指标确认的“锤子”形态
- int CH_HM_Stoch::LongCondition() - 检查开多头头寸的条件(返回 80)和关闭空头头寸的条件(返回 40);
- int CH_HM_Stoch::ShortCondition() - 检查开空头头寸的条件(返回 80)和关闭多头头寸的条件(返回 40)。
2.1. 开多头头寸/关闭空头头寸
形成“锤子”形态必须由 随机指标 确认:StochSignal(1)<30(随机指标的信号线值必须小于 30)。
空头头寸必须在随机指标的信号线向上穿越 20 或 80 水平时关闭。
//+------------------------------------------------------------------+ //| 检查市场进出条件 | //| 1) 市场入场(开多头头寸,结果=80) | //| 2) 市场退出(关闭空头头寸,结果=40) | //+------------------------------------------------------------------+ int CH_HM_Stoch::LongCondition() { int result=0; //--- idx 可用于确定专家顾问工作模式 //--- idx=0 - 在此情况下 EA 在每个滴答时检查交易条件 //--- idx=1 - 在此情况下 EA 仅在新闻蜡烛时检查交易条件 int idx =StartIndex(); //--- 检查开多头头寸的条件 //--- 形成锤子形态和信号线<30 if (CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) && (StochSignal(1)<30)) result=80; //--- 检查关闭空头头寸的条件 //--- 信号线穿越超买/超卖水平(向下 20,向上 80) if((((StochSignal(1)>20) && (StochSignal(2)<20)) || ((StochSignal(1)>80) && (StochSignal(2)<80)))) result=40; //--- 返回结果 return(result); }
2.2. 开空头头寸/关闭多头头寸
形成“悬挂人”形态必须由 随机指标 确认:StochSignal(1)>70(随机指标的信号线值必须大于 70)。
多头头寸必须在随机指标的信号线向下穿越 80 或 20 水平时关闭。
//+------------------------------------------------------------------+ //| 检查市场进出条件 | //| 1) 市场入场(开空头头寸,结果=80) | //| 2) 市场退出(关闭多头头寸,结果=40) | //+------------------------------------------------------------------+ int CH_HM_Stoch::ShortCondition() { int result=0; //--- idx 可用于确定专家顾问工作模式 //--- idx=0 - 在此情况下 EA 在每个滴答时检查交易条件 //--- idx=1 - 在此情况下 EA 仅在新闻蜡烛时检查交易条件 int idx =StartIndex(); //--- 检查开空头头寸的条件 //--- 形成悬挂人形态和信号线>70 if (CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) && (StochSignal(1)>70)) result=80; //--- 检查关闭多头头寸的条件 //--- 信号线穿越超买/超卖水平(向下 80,向上 20) if((((StochSignal(1)<80) && (StochSignal(2)>80)) || ((StochSignal(1)<20) && (StochSignal(2)>20)))) result=40; //--- 返回结果 return(result); }
2.3. 使用MQL5向导创建专家顾问
CH_HM_Stoch 类不包含在标准库类中,因此使用它时,需要下载 ach_hm_stoch.mqh 文件(见附件),并将其保存在 client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals 中。对 candlepatterns.mqh 文件也要做同样处理。重启 MetaEditor 后即可在 MQL5 向导中使用它。
要创建专家顾问,请启动 MQL5向导:

图4. 使用MQL5向导创建专家顾问
我们指定专家顾问的名称:

图5. 专家顾问的一般属性
接下来,我们需要选择使用的交易信号模块。

图6. 专家顾问的信号属性
在我们的案例中,仅使用一个交易信号模块。
添加“基于锤子/悬挂人形态,经随机指标确认的信号”的交易信号模块:

图7. 专家顾问的信号属性
交易信号模块已添加:

图8. 专家顾问的信号属性
你可以选择任何跟随属性,但我们将使用“未使用跟随止损”:

图9. 专家顾问的跟随属性
关于资金管理属性,我们将使用“固定交易量交易”:

图10. 专家顾问的资金管理属性
点击“完成”按钮,我们将获得生成的专家顾问代码,位于 Expert_AH_HM_Stoch.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.04,PeriodK=47,PeriodD=9,PeriodSlow=13,MA_period=5)。
在创建专家顾问时,我们使用了固定的交易量(交易固定手数,0.1),未使用跟随止损算法(未使用跟随)。

图11. 基于锤子/悬挂人+随机指标的专家顾问测试结果
可以使用 MetaTrader 5 客户端终端的策略测试器 找到最佳的输入参数设置。
由 MQL5 向导创建的专家顾问的代码附在 expert_ah_hm_stoch.mq5 中。