从市场里选择智能交易系统的正确途径·进阶篇
📘

从市场里选择智能交易系统的正确途径·进阶篇

第 2/3 篇

「EA 的三种事件驱动骨架」

实盘里 EA 的逻辑范式基本只有三类:盯即时报价、盯柱线、由计时器触发。前两类都挂在 OnTick 上,第三类靠 OnTimer,算法交易者日常用到的事件驱动也就这几条主路。 基于即时报价的系统对网速极敏感,尤其市价单成交场景下,50 毫秒的延迟就可能改变入场价。这类策略往往只能靠租靠近经纪商服务器的 VPS 来压延迟,外汇和贵金属本身杠杆高、滑点风险大,这种隐性成本得先算进账。 柱线型 EA 在 MQL5 里没有“新柱线事件”,得自己用 Time[] 数组过滤。上面代码里 bNewBar() 拿 Time[1] 和上次记录的 PrevTimeAlpha 比大小,第一次跑只记时间不触发,之后每根新柱返回 true,在 OnTick 里包一层就能当柱线事件用。 计时器型在 OnInit 里 EventSetTimer(60) 设 60 毫秒周期,逻辑写进 OnTimer。不过策略测试器对这类 EA 支持参差,作者本人对计时器方案偏怀疑。 从多年自研和帮人排查的经验看,柱线跟踪的系统最稳,即时报价能挖到厚利但难得多。先把这三种范式在代码层拆清,后面才能谈怎么测。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Expert tick function                                             |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnTick()
  {
  class=class="str">"cmt">//some logic
  }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Expert new bar function                                          |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">class="kw">datetime PrevTimeAlpha=class="num">0;  
class="type">bool bNewBar()
  {
  if ( Time[class="num">1] > PrevTimeAlpha )
    {
    if ( PrevTimeAlpha > class="num">0 )
      {
      PrevTimeAlpha=Time[class="num">1];
      class="kw">return true;
      }
    else
      {
      PrevTimeAlpha=Time[class="num">1];
      class="kw">return false;
      }
    }
  else class="kw">return false;
  }  
class="type">void OnTick()
  {
  if ( bNewBar() ) { class=class="str">"cmt">/*some logic*/ }
  }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Timer function                                                   |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnTimer()
  {
  class=class="str">"cmt">//some logic
  }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Expert initialization function                                   |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">int OnInit()
  {
  EventSetTimer(class="num">60);
  class="kw">return(INIT_SUCCEEDED);
  }

回测前先把历史数据和点差机制摸透

MT5 策略测试器跑 EA 有两种即时报价来源:按公式在柱内模拟生成,或从经纪商服务器拉真实 tick。MT5 原生支持真实 tick 回测,MT4 得额外挂软件,能上 MT5 就别折腾 MT4。 真实 tick 和柱线很吃磁盘,经纪商服务器只留有限数据。MT5 主面板点 “symbols(品种)” → 选品种和时间段 → “Request(请求)”,就能看到服务器实际能给多少 tick。若返回数量少于你填的区间,窗口会红框提示你真实 tick 从哪天起才有;缺的区间平台会造模拟 tick,基于它的回测结果会失真。 柱线方面,MT5 里大多数品种通常能拿到 2000 根甚至更早就有的数据,单次请求上限常见为 100000 根(受 Max bars in history 限制,图表显示量另受 Max bars in chart 限制)。不够用就调大存储设置、重启终端再请求。MT4 是从 “工具 → 历史服务器” 进类似窗口,但只能按限制全量下载所有时间帧,不能只拽一段。 回测起点我建议先用历史中最近一整年跑一遍粗筛:EA 这段时间都拉胯就直接换标的,能看再铺开全历史。条件允许一律用真实 tick;EA 若带资金管理机制,测试时最好先关掉,否则你丢掉了原始预期回报这个核心评估量。 点差坑得记牢:MT5 测试器对点差有下限保护,设得比历史平均 tick 点差还低也没用,会强制按最小限制跑,这是防买家自欺;设高于下限才生效。MT4 反而能写死从 1 起任意点差,全程固定不随行情变,虽好填但不真实。MT5 里选“当前点差”会用每根柱存的值,用每次 tick 测时连逐笔点差都还原,最接近实盘。外汇贵金属杠杆高、点差跳变能瞬间吞掉浮盈,回测务必把点差扩大、佣金、滑点都算进去。

◍ 自造两个回撤比指标筛策略

回测跑出正收益后,别只盯着平台给的夏普和回撤看。可以手算两个比值,把余额、净值回撤和总盈利揉成一个数:Alpha = 总盈利 / 最大净值回撤,Betta = 总盈利 / 最大余额回撤。MT4 和 MT5 的策略测试器报告里都直接给出最大净值回撤与最大余额回撤,总盈利用结束余额减初始余额即可,计算成本极低。 这两个值越高,说明单位回撤吃到的利润越厚,策略在统计样本上更可能站得住。经验上 Alpha 和 Betta 落在 5~10 区间,意味着风险相对可控且预判能力不差;低于 5 的样本大多经不起实盘磨损。 配合几个硬门槛一起卡:预期收益 MathWaitingPoints 至少 3 倍于平均点差 MiddleSpread;盈利因子 ProfitFactor ≥ 1.1~1.2;每年成交 TradesPerYear ≥ 20~30。外汇和贵金属杠杆高、滑点跳空频繁,这些阈值只是过滤噪音,不等于策略实盘必盈,仍可能遇异常失效。 交易图本身也别忽略——权益曲线越直越省心。这些变量都能按品种调参,我实测下来它们和市面盈利策略重合度偏高,但偶尔有刺头例外,不常发生。

「高收益EA的欺诈信号与资金管理的坑」

看到年化收益高得离谱的EA,先别激动,这类系统涉嫌欺诈的概率偏高。仅凭说明里的年度利润数字,就能在筛选阶段砍掉绝大多数不靠谱策略。 相对安全的年化区间大致在10%–200%,但200%已属高风险,100%–150%每年更贴近可接受的实绩。市场上偶尔传有年化1000%的系统,作者真有这种算法,几乎不可能公开分享。 网格、马丁格尔、金字塔或摊平这类复杂资金管理的EA,很容易对历史做过度拟合。爆仓前它们可能连续盈利很久,伪装成圣杯。 辨别伪圣杯不用猜,直接拉其实盘账户监控看曲线和回撤,异常平滑或回撤突兀的都要警惕。外汇与贵金属杠杆高,这类策略一旦反转即是本金级风险。

从监控尖峰揪出爆仓前兆

在 MT5 信号区打开实盘监控页,多数信号会暴露隐藏的净值曲线与自定义度量。会看的人能省掉大量试错时间,这里只说两类最典型的危险与安全特征。 先看危险信号:表面利润线走得顺滑,但下方出现向下绿色尖峰就值得警惕。这种尖峰对应某项关键 alpha 自定义度量极低,不用细究数值,单一个尖峰就可能在一天内吞掉本金。它通常意味着资金管理失控或亏损单扛得太久,结局多是净值剧烈回撤。外汇与贵金属杠杆高,这类信号碰不得。 反例是一条‘不好看但干净’的曲线:余额不平直,却没有人为制造盈利幻觉的资金操作痕迹。其 alpha 与 beta 同步向上,绿蓝线黏合稳步爬升。年利润率不高,但用不超过 50% 回撤换来了 100–150% 的年利润——这是我花 20 分钟在信号市场里翻到的真实产品。 用这种逆向筛法,能快速避开大多数包装过的假信号。好系统可能授权费不便宜,但实盘监控不会骗人,开 MT5 信号标签按净值尖峰排一遍就知道。

常见问题

Tick 驱动每次报价都算,信号细但吃 CPU;新柱驱动每根 K 线算一次,省资源但会漏瞬时机会。黄金波动快,若策略吃突破建议 Tick,做日线波段用新柱足够。
先在当前品种属性里看平均点差和掉期正负,再在回测设置里勾选「使用当前点差」并手动填常见极值。不摸透这两样,回测盈利实盘可能直接变亏。
可以。小布能按你设的最大回撤和回撤恢复比自动标红可疑策略,并把极端尖峰时段列出来,你只需对筛后清单做人工复核。
大概率不可信。常见手法是隐藏止损、用极小仓位博微利或只晒精选时段。先看资金曲线是否平滑到反常,再查有无大单边裸奔期。
盯净值曲线斜率和空闲保证金占比,若净值突然陡降且保证金占用破 80%,基本是尖峰行情在啃本金。立刻降手数或暂停比事后重启更划算。