大家好!今天我们来聊聊 MQL5 Wizard,这是一个帮助我们快速创建交易系统的工具。利用这个工具,我们可以基于 标准库 的类,快速生成可以运行的交易信号。
想要验证你的交易思路,只需创建一个属于自己的交易信号类。关于这个类的结构和示例,可以参考这篇文章 MQL5 Wizard: 如何创建交易信号模块。
我们先了解一下基本思路:交易信号类是从 CExpertSignal 派生的,接下来,我们需要重写 LongCondition() 和 ShortCondition() 这两个虚方法,使用我们自己的逻辑。
在这里,我想推荐一本书 《最佳交易者的策略》(俄文),里面有很多交易策略,我们将集中讨论反转蜡烛图形,特别是经过 随机指标、 CCI、 MFI 和 RSI 等指标的确认。
最佳的做法是创建一个单独的类,继承自 CExpertSignal,用来检查蜡烛图形的形成。为了确认由蜡烛图形生成的交易信号,只需要编写一个继承自 CCandlePattern 的类,并在其中添加必要的特性(例如,通过振荡器确认)。
接下来,我们将讨论基于“牛市会面线”反转蜡烛图形的信号,并用 RSI 指标进行确认。这个交易信号模块是基于 CCandlePattern 类的一个简单示例,展示了如何使用蜡烛图形创建交易信号。
1. “会面线”反转蜡烛图形
1.1. 牛市会面线
这个形态由两根蜡烛(熊市和牛市)组成,收盘价相等(或非常接近)。这两根蜡烛的实体必须大于平均实体长度。
“牛市会面线”形态表明了下跌趋势的反转。

图1. 牛市会面线形态
“牛市会面线”形态的识别是在 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))) // doji 收盘 return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_MEETING_LINES) 方法用于检查“牛市会面线”蜡烛图形的形成。
1.2. 熊市会面线
这个形态由两根蜡烛(牛市和熊市)组成,收盘价相等(或非常接近)。这两根蜡烛的实体必须大于平均实体长度。
“熊市会面线”形态表明了上涨趋势的反转。

图2. 熊市会面线形态
“熊市会面线”形态的识别是在 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))) // doji 收盘 return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_MEETING_LINES) 方法用于检查“熊市会面线”蜡烛图形的形成。
2. 通过RSI指标确认的交易信号
打开多头或空头仓位的交易信号必须通过 RSI 指标确认。RSI的值必须低于/高于关键水平(多头仓位为40,空头仓位为60)。
已开仓位的关闭取决于 RSI 的值。可以在以下两种情况下进行关闭:
- 如果RSI达到相反的关键水平(多头仓位为70,空头仓位为30)
- 如果反向信号未得到确认(当RSI达到以下水平时:多头仓位为30,空头仓位为70)

图3. 熊市会面线形态,经过RSI指标确认
- int CML_RSI::LongCondition() - 检查开多头仓位的条件(返回80)和关闭空头仓位的条件(返回40);
- int CML_RSI::ShortCondition() - 检查开空头仓位的条件(返回80)和关闭多头仓位的条件(返回40)。
2.1. 开多头仓位/关闭空头仓位
//+------------------------------------------------------------------+ //| 检查市场的进出条件 | //| 1) 市场入场(开多头仓位,结果=80) | //| 2) 市场退出(关闭空头仓位,结果=40) | //+------------------------------------------------------------------+ int CML_RSI::LongCondition() { int result=0; //--- idx可以用来确定专家顾问的工作模式 //--- idx=0 - 在这种情况下,EA在每个tick上检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻条上检查交易条件 int idx =StartIndex(); //--- 检查开多头仓位的条件 //--- 牛市会面线形态和RSI<30 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_MEETING_LINES) && (RSI(1)<40)) result=80; //--- 检查关闭空头仓位的条件 //--- 信号线交叉超买/超卖水平(向上30,向上70) if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) result=40; //--- 返回结果 return(result); }
2.2. 开空头仓位/关闭多头仓位
//+------------------------------------------------------------------+ //| 检查市场的进出条件 | //| 1) 市场入场(开空头仓位,结果=80) | //| 2) 市场退出(关闭多头仓位,结果=40) | //+------------------------------------------------------------------+ int CML_RSI::ShortCondition() { int result=0; //--- idx可以用来确定专家顾问的工作模式 //--- idx=0 - 在这种情况下,EA在每个tick上检查交易条件 //--- idx=1 - 在这种情况下,EA仅在新闻条上检查交易条件 int idx =StartIndex(); //--- 检查开空头仓位的条件 //--- 熊市会面线形态和RSI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_MEETING_LINES) && (RSI(1)>60)) result=80; //--- 检查关闭多头仓位的条件 //--- 信号线交叉超买/超卖水平(向下70,向下30) if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) result=40; //--- 返回结果 return(result); }
2.3. 使用MQL5 Wizard创建专家顾问
CML_RSI 类不包含在标准库中,使用它前需要下载 acml_rsi.mqh 文件(见附件),并将其保存到 client_terminal_data_folder\MQL5\Include\Expert\Signal\MySignals。对 acandlepatterns.mqh 文件也要做同样处理。重启 MetaEditor 后即可在 MQL5 Wizard 中使用这些文件。
启动 MQL5 Wizard 创建专家顾问:

图4. 使用MQL5 Wizard创建专家顾问
接下来,指定专家顾问的名称:

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

图6. 专家顾问的信号属性
在我们的案例中,只使用一个交易信号模块。
添加基于“牛市/熊市会面线确认的RSI”模块的交易信号:

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

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

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

图10. 专家顾问的资金管理属性
点击“完成”按钮后,我们将得到生成的专家顾问代码,位于 Expert_AML_RSI.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,测试期间:2000.01.01-2011.03.01,PeriodRSI=11,MA_period=3)上进行的专家顾问回测。
在创建专家顾问时,我们使用了固定交易量(固定手数交易,0.1),未使用跟踪止损算法(未使用跟踪止损)。

图11. 基于牛市/熊市会面线和RSI的专家顾问测试结果
最佳输入参数集可以通过 MetaTrader 5 客户端终端的策略测试器 找到。
使用 MQL5 Wizard 创建的专家顾问代码已经附在 expert_aml_rsi.mq5 文件中。
评论 0