New Bar (新柱)事件处理程序·综合运用
📘

New Bar (新柱)事件处理程序·综合运用

第 3/3 篇

自己给 EA 加一个 OnNewBar 钩子

MQL5 没有内置的「新柱」事件,但用 CisNewBar 类就能在 EA 里补一个 OnNewBar() 处理函数,逻辑不绕,代码也短。核心思路是在 OnTick 里用 TimeCurrent() 算当前柱开盘时间,再交给类的 isNewBar() 判断。 这里有个性能细节值得记:用 TimeCurrent() 除周期秒数来推算柱开盘时间,比调用 SeriesInfoInteger(SERIES_LASTBAR_DATE) 更快;后者即便不写错误控制,速度也偏慢。对挂在实时图表上的 EA,这种差别在高频 tick 下会累积。 顺带一提,SeriesInfoInteger() 带 SERIES_LASTBAR_DATE 时不需要错误处理的特性,正好让 OnNewBar() 尽量省掉异常分支,可靠性更高。外汇和贵金属行情跳空多,这种简洁判断能少踩坑,但杠杆品种本身高风险,回测前先想清楚触发频率。 下面这段是可直接塞进 MT5 看的 EA 骨架:OnNewBar() 只打印新柱时间,你验证时把 PrintFormat 换成自己的入场判断即可。

MQL5 / C++
class="macro">#class="kw">property copyright "Copyright class="num">2010, Lizar"
class="macro">#class="kw">property link      "Lizar-class="num">2010@mail.ru"
class="macro">#class="kw">property version   "class="num">1.00"

class="macro">#include "OnNewBar.mqh" class=class="str">"cmt">// 此处是启动 "新柱线" 事件处理器的秘密

class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 新柱事件处理函数                                                   |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnNewBar()
  {
   PrintFormat("新柱线: %s",TimeToString(TimeCurrent(),TIME_SECONDS));
  }
class="macro">#class="kw">property copyright "Copyright class="num">2010, Lizar"
class="macro">#class="kw">property link      "Lizar@mail.ru"
class="macro">#include <Lib CisNewBar.mqh>
CisNewBar current_chart; class=class="str">"cmt">// CisNewBar 类实例: 当前图表
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| EA订单函数                                                        |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnTick()
  {
class=class="str">"cmt">//---
   class="type">int period_seconds=PeriodSeconds(_Period);                      class=class="str">"cmt">// 当前柱线周期的秒数
   class="type">class="kw">datetime new_time=TimeCurrent()/period_seconds*period_seconds;   class=class="str">"cmt">// 当前图表柱线开盘时间
   if(current_chart.isNewBar(new_time)) OnNewBar();                 class=class="str">"cmt">// 当新柱线出现 - 启动新柱线事件处理器
  }

◍ 单币 NewBar 处理的边界与下一步

前面几节把探测新柱的几种老办法拆开讲过利弊,最终落到一个 CisNewBar 类上:它能在不堆额外代码的前提下,把绝大多数任务里的 "new bar" 事件抓出来,顺手也甩掉了旧方案那些别扭的地方。 不过这套事件处理目前只适配单货币 EA。俄文原作者在文末附了 9 个文件,其中 lib_cisnewbar__1.mqh 是 11.24 KB 的核心类封装,onnewbar.mq5 仅 1.59 KB,适合直接拖进 MT5 看单币触发逻辑。 若你的策略要跑多货币,就得重新审视已暴露的低效点并自己改架构。最稳最快的单币写法已经在这,多货币 NewBar 处理是另一条路,留到别的篇幅再展开。

「画得少,看得清」

把第一版里那个多余的函数整个删掉,生活立刻轻松。新栏判定本来就不需要绕弯:前一栏时间永远和它左边不同,随便取一个时间,只要和上一栏对不上,它就是新栏——这个逻辑在任意周期都成立。 编译时若报 onNewBar() 未定义,根因是引用的 OnNewBar.mqh 里没写这个函数,只在 include 行留了句注释当秘诀。补上函数体或换用已实现的头文件即可通过。 外汇与贵金属杠杆高、滑点突兀,用这类轻量新栏检测只解决“何时算一根”,不等于信号能盈利。开 MT5 把 include 那行注释掉再编译,体会一下依赖消失后的报错,比读十遍文档更直白。

MQL5 / C++
class="macro">#include "OnNewBar.mqh" class=class="str">"cmt">// 这里是启动 "新栏 "事件处理程序的秘诀

常见问题

用静态变量记录上一根K线时间,在OnTick里比对当前K线时间,不同就执行你的逻辑并刷新记录,避免每跳重复跑。
注意跳空缺口、服务器重连后时间不连续、以及周末无新柱导致逻辑挂起,建议加时间有效性和重连重置判断。
可以,小布盯盘已内置AIGC诊断,打开对应品种页就能看到每根新柱的AI简评和概率倾向,不用自己写钩子。
线多了会掩盖价格本身结构,只留关键位和新柱标记,去掉冗余指标才能更快识别真实突破与反转。
NewBar下单滑点和计算量更低、逻辑更稳,但会漏掉柱内快速机会;高频场景才需要每跳判断,普通波段用新柱足够。