大家好,今天我们来聊聊如何运用 MQL5 Wizard 创建专业的交易顾问(EA)。这个工具可以快速生成基于 标准库 类的交易策略,帮助我们验证交易想法。只需构建自己的交易信号类,具体结构和示例可以参考 MQL5 Wizard:如何创建交易信号模块。
简单来说,交易信号类是基于 CExpertSignal 进行扩展的。接下来,我们需要重写 LongCondition() 和 ShortCondition() 这两个虚拟方法,以实现自己的逻辑。
在俄罗斯有一本书 《最佳交易者的策略》,书中讨论了许多交易策略。今天,我们将重点关注以 随机指标 确认的反转蜡烛图形态,包括 3黑鸦 和 3白兵。
最佳实践是创建一个独立的类,继承自 CExpertSignal,用于检查蜡烛图形态的形成。确认由蜡烛图形态生成的交易信号时,只需编写一个类,继承自 CCandlePattern,并在其中添加必要的功能(例如,通过震荡指标确认)。
1. 反转蜡烛图形态:3黑鸦与3白兵
1.1. 3黑鸦
这是一个看跌蜡烛图形态,用于预测当前上涨趋势的反转。该形态由三根连续的长实体蜡烛组成,每根蜡烛收盘价均低于前一日,并且每个交易日的开盘价都在前一根蜡烛体内。

图1. 3黑鸦蜡烛图形态
在 CCandlePattern 类中,识别 "3黑鸦" 形态的方法是 CheckPatternThreeBlackCrows,具体实现如下:
//+------------------------------------------------------------------+ //| 检查 "3黑鸦"蜡烛图形态 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternThreeBlackCrows() { //--- 3黑鸦 if((Open(3)-Close(3)>AvgBody(1)) && (Open(2)-Close(2)>AvgBody(1)) && (Open(1)-Close(1)>AvgBody(1)) && (MidPoint(2)<MidPoint(3)) && (MidPoint(1)<MidPoint(2))) return(true); //--- return(false); }
通过 CCandlePattern 类中的 CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) 方法来检查 "3黑鸦" 蜡烛图形态的形成。
1.2. 3白兵蜡烛图形态
这是一个看涨蜡烛图形态,用于预测当前下跌趋势的反转。该形态由三根连续的长实体蜡烛组成,每根蜡烛收盘价均高于前一日,并且每个交易日的开盘价都在前一根蜡烛体内。
只要第二天的蜡烛开盘价在第一天的范围上半部分,且第二天以接近最高点的价格收盘,形成非常小的上影线或没有上影线,则该形态有效。第三天重复相同的模式。

图2. 3白兵蜡烛图形态
识别 "3白兵" 形态的方法如下:
//+------------------------------------------------------------------+ //| 检查 "3白兵"蜡烛图形态 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternThreeWhiteSoldiers() { //--- 3白兵 if((Close(3)-Open(3)>AvgBody(1)) && (Close(2)-Open(2)>AvgBody(1)) && (Close(1)-Open(1)>AvgBody(1)) && (MidPoint(2)>MidPoint(3)) && (MidPoint(1)>MidPoint(2))) return(true); //--- return(false); }
通过 CCandlePattern 类中的 CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) 方法来检查 "3白兵" 蜡烛图形态的形成。
2. 随机指标确认的交易信号
开多单或空单的交易信号必须由 随机指标 确认。%D线必须高于或低于相应的临界水平(30或70)。
开仓后平仓的条件取决于 %D 指标的值,平仓可以在以下两种情况下进行:
- 如果 %D 线达到相反的临界水平(多单为80,空单为20)
- 如果反向信号未得到确认(当 %D 线达到以下水平:多单为20,空单为80)

图3. 随机指标确认的3白兵形态
检查进出场条件的实现分别在两个方法中:
- int CBC_WS_Stoch::LongCondition() - 检查开多单条件(返回80)和空单平仓条件(返回40);
- int CBC_WS_Stoch::ShortCondition() - 检查开空单条件(返回80)和多单平仓条件(返回40)。
2.1. 开多单/平空单
"三白兵" 形态的形成必须通过 随机指标 确认:StochSignal(1)<30(随机指标信号线的值必须小于30)。
如果随机指标信号线向上穿过20或80水平,必须平掉空单。
//+------------------------------------------------------------------+ //| 检查进出场条件 | //| 1) 开多单条件(返回=80) | //| 2) 平空单条件(返回=40) | //+------------------------------------------------------------------+ int CBC_WS_Stoch::LongCondition() { int result=0; //--- idx 用于确定EA的工作模式 //--- idx=0 - EA在每个tick时检查交易条件 //--- idx=1 - EA只在新闻条时检查交易条件 int idx =StartIndex(); //--- 检查开多单条件 //--- "三白兵" 形态和信号线<30 if (CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) && (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 CBC_WS_Stoch::ShortCondition() { int result=0; //--- idx 用于确定EA的工作模式 //--- idx=0 - EA在每个tick时检查交易条件 //--- idx=1 - EA只在新闻条时检查交易条件 int idx =StartIndex(); //--- 检查开空单条件 //--- "三黑鸦" 形态和信号线>70 if (CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) && (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 Wizard创建交易顾问
CBC_WS_Stoch 类不包含在标准库类中,使用前需下载 acbc_ws_stoch.mqh 文件(请参见附件)并保存在 client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals 中。对 candlepatterns.mqh 文件也需做同样处理。重启 MetaEditor 后,您可以在 MQL5 Wizard 中使用这些文件。
要创建交易顾问,请启动 MQL5 Wizard:

图4. 使用MQL5 Wizard创建交易顾问
接下来,填写交易顾问的名称:

图5. 交易顾问的一般属性
然后选择所用的交易信号模块。

图6. 交易顾问的信号属性
在我们的案例中,只使用一个交易信号模块。
添加“基于3黑鸦/3白兵的交易信号,经过随机指标确认”模块:

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

图8. 交易顾问的信号属性
您可以选择任何追踪属性,但我们会选择“不使用追踪止损”:

图9. 交易顾问的追踪属性
关于资金管理属性,我们将选择“使用固定交易量”:

图10. 交易顾问的资金管理属性
最后点击“完成”按钮,我们就能得到生成的交易顾问代码,位于 Expert_ABC_WS_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 Wizard 生成的交易顾问通过各个交易信号模块的“投票”来开平仓。主模块的投票(作为容器,包含所有添加的模块)也会被使用,但它的 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.02.02,PeriodK=47,PeriodD=9,PeriodSlow=13,MA_period=5)对交易顾问的回测结果。
在创建交易顾问时,我们使用了固定交易量(固定交易手数,0.1),不使用追踪止损算法(不使用追踪止损)。

图11. 基于3黑鸦/3白兵+随机指标的交易顾问测试结果
您可以使用 MetaTrader 5 的策略测试器 找到最佳的输入参数组合。
由 MQL5 Wizard 创建的交易顾问的代码已附在 expert_abc_ws_stoch.mq5 文件中。