在交易界,MQL5 Wizard是一个非常实用的工具,它能够帮助我们快速创建基于标准库类的现成EA(专家顾问)。你只需创建自己的交易信号类,便可以立即检验你的交易想法。关于如何创建交易信号模块的更多细节,可以参考这篇文章:MQL5 Wizard:如何创建交易信号模块。
基本思路是:交易信号类派生自CExpertSignal,然后我们需要重写LongCondition()和ShortCondition()这两个虚方法,加入自己的逻辑。
在这方面,我推荐一本书,《顶尖交易者的策略(俄文),书中探讨了许多交易策略,我们将重点关注反转蜡烛图模式,并借助随机指标、CCI、MFI和RSI等指标进行确认。
创建一个派生自CExpertSignal的独立类来检测蜡烛图模式的形成是最理想的。为了确认由蜡烛图模式产生的交易信号,只需编写一个派生自CCandlePattern的类,并添加必要的确认特性(例如,使用振荡器进行确认)。
接下来,我们将讨论基于“牛市/熊市会合线”反转蜡烛图模式的信号,并通过随机指标进行确认。交易信号模块是基于CCandlePattern类,这是一个使用蜡烛图模式创建交易信号的简单示例。
1. “会合线”反转蜡烛图模式
1.1. 牛市会合线
该模式由两根蜡烛组成(先是下跌蜡烛,后是上涨蜡烛),它们的收盘价相等(或接近)。两根蜡烛的实体长度必须大于平均实体长度。
“牛市会合线”模式表示下跌趋势的反转。

图1. 牛市会合线模式
“牛市会合线”模式的识别通过CCandlePattern类中的CheckPatternBullishMeetingLines()方法实现:
//+--------------------------------------------------------------------+ //| 检查“牛市会合线”蜡烛图模式的形成 | //+--------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishMeetingLines() { //--- 牛市会合线 if((Open(2)-Close(2)>AvgBody(1)) && // 长黑蜡烛 ((Close(1)-Open(1))>AvgBody(1)) && // 长白蜡烛 (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // 十字星收盘 return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_MEETING_LINES)方法用于检查“牛市会合线”蜡烛图模式的形成。
1.2. 熊市会合线
该模式由两根蜡烛组成(先是上涨蜡烛,后是下跌蜡烛),它们的收盘价相等(或接近)。两根蜡烛的实体长度必须大于平均实体长度。
“熊市会合线”模式表示上涨趋势的反转。

图2. 熊市会合线模式
“熊市会合线”模式的识别通过CCandlePattern类中的CheckPatternBearishMeetingLines()方法实现:
//+--------------------------------------------------------------------+ //| 检查“熊市会合线”蜡烛图模式的形成 | //+--------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishMeetingLines() { //--- 熊市会合线 if((Close(2)-Open(2)>AvgBody(1)) && // 长白蜡烛 ((Open(1)-Close(1))>AvgBody(1)) && // 长黑蜡烛 (MathAbs(Close(1)-Close(2))<0.1*AvgBody(1))) // 十字星收盘 return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_MEETING_LINES)方法用于检查“熊市会合线”蜡烛图模式的形成。
2. 由随机指标确认的交易信号
开多或开空的交易信号必须由随机指标确认。%D线必须高于或低于相应的临界水平(30或70)。
平仓的条件取决于%D指标的值,主要有两种情况:
- 当%D线到达相反临界水平时(多单为80,空单为20)
- 当反向信号未确认时(当%D线达到以下水平:多单20,空单80)

图3. 熊市会合线模式通过随机指标确认
- int CML_Stoch::LongCondition() - 检查开多单的条件(返回80)和闭空单的条件(返回40);
- int CML_Stoch::ShortCondition() - 检查开空单的条件(返回80)和闭多单的条件(返回40)。
2.1. 开多单/闭空单
“牛市会合线”模式的形成必须通过随机指标确认:StochSignal(1)<30(随机指标最近一根完成的蜡烛的信号线值必须小于30)。
如果随机指标的信号线向上穿过20或80水平,则必须平掉空单。
//+------------------------------------------------------------------+ //| 检查市场进出条件 | //| 1) 市场进入(开多单,结果=80) | //| 2) 市场退出(闭空单,结果=40) | //+------------------------------------------------------------------+ int CML_Stoch::LongCondition() { int result=0; //--- idx可以用来确定EA工作模式 //--- idx=0 - 在这种情况下,EA在每个tick上检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻蜡烛上检查交易条件 int idx =StartIndex(); //--- 检查开多单的条件 //--- 牛市会合线模式和信号线<30 if (CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_MEETING_LINES) && (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 CML_Stoch::ShortCondition() { int result=0; //--- idx可以用来确定EA工作模式 //--- idx=0 - 在这种情况下,EA在每个tick上检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻蜡烛上检查交易条件 int idx =StartIndex(); //--- 检查开空单的条件 //--- 熊市会合线模式和信号线>70 if (CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_MEETING_LINES) && (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创建EA
CML_Stoch类不包含在标准库类中,要使用它,需要下载acml_stoch.mqh文件(见附件)并将其保存到client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals。对candlepatterns.mqh文件也要进行相同处理。重启MetaEditor后,你可以在MQL5 Wizard中使用它。
要创建一个EA,请启动MQL5 Wizard:

图4. 使用MQL5 Wizard创建EA
现在让我们指定EA的名称:

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

图6. EA的信号属性
在我们的案例中,我们只使用一个交易信号模块。
添加“基于牛市/熊市会合线,由随机指标确认的信号”交易信号模块:

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

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

图9. EA的止损属性
关于资金管理属性,我们将使用“固定交易量交易”:

图10. EA的资金管理属性
按下“完成”按钮后,我们将获得生成的EA代码,文件名为Expert_AML_Stoch.mq5,保存路径为terminal_data_folder\MQL5\Experts\。
生成的EA的默认输入参数:
//--- 主要信号的输入参数 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生成的EA会根据交易信号模块的“投票”来开仓和平仓。主模块的投票(作为容器,包含所有添加的模块)也会被使用,但它的LongCondition()和ShortCondition()方法始终返回0。
主模块的投票结果也会在“投票”平均值中使用。在我们的案例中,主模块+1个交易信号模块,因此在设置阈值时需要考虑这一点。因此,ThresholdOpen和ThresholdClose必须设置为40=(0+80)/2和20=(0+40)/2。
Signal_StopLevel和Signal_TakeLevel输入参数的值设置为0,这意味着只有在平仓条件满足时才能平仓。
2.4. 历史回测结果
我们来看看在历史数据上(EURUSD H1,测试周期:2005.01.01-2010.03.16,PeriodK=6,PeriodD=3,PeriodSlow=36,MA_period=3)对EA的回测结果。
在创建EA时,我们使用了固定交易量(固定交易手数, 0.1),未使用止损算法(未使用止损)。

图11. 基于牛市/熊市会合线与随机指标的EA测试结果
最佳的输入参数集可以通过MetaTrader 5客户端终端的策略测试器找到。
通过MQL5 Wizard创建的EA代码附在expert_aml_stoch.mq5文件中。
评论 0