首页 / 交易学院 / 用信号指标搭交易系统:从 ASCtrend 到 MQL5 向导信号模块
用信号指标搭交易系统:从 ASCtrend 到 MQL5 向导信号模块
📡

用信号指标搭交易系统:从 ASCtrend 到 MQL5 向导信号模块

交易策略 难度 · 进阶 2011 13 分钟阅读
信号指标ASCtrendBykovTrendCExpertSignalMQL5 向导交易系统

信号指标是交易者的老朋友:它们在图表上用箭头/标签标出“这里该买、那里该卖”。但标签只是提示,真正下单要靠 EA。本文给出从信号指标到可运行交易系统的完整链路:先用最朴素的方式把指标信号接进 OnTick,再升级成 MQL5 向导的标准信号模块,让同一套逻辑能被不同 EA 复用、还能在策略测试器里优化参数。

一、信号指标与信号趋势指标

代码库里信号指标很多,分两类。纯信号指标(BykovTrend、ASCtrend、BrainTrend1Sig、SilverTrend_Signal、Stalin、WPRSI signal、StepMA_NRTR、Sidus 等)只在出现信号时打标签。信号趋势指标(FiboCandles、Parabolic SAR、X2MA、SuperTrend、Heiken Ashi Smoothed、NonLagDot 等)自带趋势着色,EA 读取“当前柱颜色/方向”作为信号。两类读取代码略有不同,但 EA 主框架几乎一样——这正是“通用化”的价值。

二、交易系统的基础数据:输入参数清单

把信号指标变成 EA,要定义两组输入。信号指标侧:指标句柄、取信号的柱指数、买卖开关。交易侧:每笔交易的入金份额(MM,负值常表示按公式计算手数)、止损点数、止盈点数(为 0 时不挂止盈)、最大允许滑点、是否允许开买/卖仓、是否允许按信号平买/卖仓。把这些做成 input 参数,使用者不用改代码就能调策略。

三、EA 主体:OnTick 里检测信号

EA 的核心是 OnTick:先检查指标句柄算出的柱数够不够(BarsCalculated < min_rates_total 就 return),再判断是否到了“新 K 线”(用 CIsNewBar 或 SignalBar 标志)。到了信号柱,就读指标缓冲区当前值,置位 BUY_Open / SELL_Open 等静态标志,随后在交易函数里按标志和开关下单。静态变量保证“一根 K 线只交易一次”,避免同根 K 线重复开仓。

// EA 的 OnTick 核心骨架(节选)
void OnTick()
  {
   if(BarsCalculated(InpInd_Handle) < min_rates_total) return;  // 数据不足
   static bool BUY_Open=false, SELL_Open=false;
   static CIsNewBar NB;
   if(!SignalBar || NB.IsNewBar(Symbol(), InpInd_Timeframe) || Recount)
     {
      BUY_Open=false; SELL_Open=false;            // 信号清零
      double val[2];
      CopyBuffer(InpInd_Handle, 0, 0, 2, val);     // 读指标缓冲
      if(val[0]>0) BUY_Open=true;                  // 出现买入信号
      if(val[1]<0) SELL_Open=true;                 // 出现卖出信号
     }
   // 随后按 BUY_Open/SELL_Open 与开关执行下单
  }

四、把交易逻辑打包成通用函数库

原文强调:与其在每个 EA 里复制粘贴下单代码,不如把通用交易函数(开仓、平仓、挂止损止盈、检查占用)打包成一个独立库,让应用层尽量薄。这样换信号指标时只改“信号读取”那几行,下单逻辑一字不改。这是把“信号”和“执行”解耦的标准做法,也利于在测试器里稳定回测。

实战坑:信号指标常在“当前未走完的 K 线”上闪烁。若不等新 K 线收盘就交易,会被假信号反复打脸。务必用 IsNewBar 或只取“上一根已收盘 K 线”的信号值,避开重绘(repaint)陷阱。

五、进阶:封装成 MQL5 向导信号模块

想让信号被多个 EA 复用、还能在向导里可视化配置?把它封装成 CExpertSignal 派生类。模块文件头部要写一段“向导描述”:标题(向导里显示的名字)、类型(固定 SignalAdvanced)、名称、短名(生成 EA 时参数前缀)、类、页,以及若干“参数=函数名,类型,默认值,描述”行。写好这段后,MQL5 向导就能把它当标准信号模块选入、自动生成带参数的 EA。

// 向导描述(节选,基于 BykovTrend)
//+------------------------------------------------------------------
//| 标题=两条移动平均线交叉信号
//| 类型=SignalAdvanced
//| 名称=My_MA_Cross
//| 短名=MaCross
//| 类=MA_Cross
//| 参数=RISK,int,3,RISK
//| 参数=SSP,int,9,SSP
//+------------------------------------------------------------------

六、小结

从信号指标到交易系统有两条路:朴素路是把指标句柄接进 OnTick,按新 K 线读缓冲、按开关下单,适合快速验证想法;进阶路是把信号封装成 CExpertSignal 向导模块,参数化、可复用、可优化,适合长期维护。无论哪条,都把“信号读取”和“交易执行”解耦,并务必避开未收盘 K 线的重绘陷阱。把本文当模板,你对接下一个信号指标会快很多。

常见问题

信号指标(如 ASCtrend、BykovTrend)只在出现买卖点时打标签,EA 读标签触发交易;信号趋势指标(如 SuperTrend、Heiken Ashi Smoothed)自带趋势着色,EA 读当前柱颜色/方向作为信号。两类读取代码略不同,但 EA 主框架几乎一样。
在 OnTick 里先用 BarsCalculated 确认数据足够,再用 IsNewBar 判断到了新 K 线,然后 CopyBuffer 读指标缓冲当前值。出现买入值置 BUY_Open、卖出值置 SELL_Open,随后按开关执行下单。静态变量保证一根 K 线只交易一次。
信号指标常在未走完的当前 K 线上闪烁(repaint)。若不等收盘就交易,会被假信号反复触发。务必用 IsNewBar 或只取上一根已收盘 K 线的信号值,避开重绘陷阱。
从 CExpertSignal 派生一个类,在模块文件头部写“向导描述”:标题、类型(固定 SignalAdvanced)、名称、短名、类,以及参数行(函数名,类型,默认值,描述)。写好后在 MQL5 向导里就能选它、自动生成带参数的 EA,还能在测试器优化。
在原文的交易系统里,MM(每笔入金份额)为负值常代表“按公式/风险计算下单量”而非固定手数,是一种仓位管理写法。具体符号约定取决于 EA 实现,使用前应在代码里确认其含义。