New Bar (新柱)事件处理程序·综合运用
自己给 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 换成自己的入场判断即可。
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 那行注释掉再编译,体会一下依赖消失后的报错,比读十遍文档更直白。
class="macro">#include "OnNewBar.mqh" class=class="str">"cmt">// 这里是启动 "新栏 "事件处理程序的秘诀