EA 交易事件处理:用 OnTrade() 监控每一笔成交
交易事件、OnTrade 触发次数、订单/持仓快照对比法
很多 EA 在 OnTick 里一遍遍检查持仓和挂单,既浪费资源又不及时。MQL5 提供了“交易事件”:每当订单或持仓列表发生变化,终端会自动调用 OnTrade() 函数。把监控逻辑放进 OnTrade,等于让终端在成交发生的那一瞬主动通知你。
一、交易事件与 OnTrade()
OnTrade() 是预定义事件处理函数,交易动作完成时由系统自动调用。常见用途:记录交易日志、弹窗/推送通知、统计成交质量。注意它和 OnTick 是两套机制——价格变动走 OnTick,交易变动走 OnTrade。
二、实测限制:别迷信历史触发
作者与官方开发人员确认:历史列表的变更并不会触发 OnTrade(),且运行期去读历史里的已执行订单可能有延迟。OnTrade 只在“已下订单”和“新建持仓”列表变更时被调用。因此判断事件类型要靠“订单/持仓数量与属性对比”,而不是单纯读历史。
三、订单数量对比法
用一个全局变量 OrdersPrev 记住上一次 OnTrade 时的 OrdersTotal()。OnInit 里初始化,OnTrade 末尾更新。若 OrdersPrev < OrdersTotal() 表示有新订单出现;若大于,表示有订单消失/被执行。这是判断“新增”还是“消失”的最简方法。
四、持仓/挂单参数快照对比
定义结构体(如 _position 含 sl/tp/volume)和获取函数,在 OnTrade 开头刷新“当前快照”,与“上一次快照”比较。当订单数和持仓数都没变时,逐条比对 SL/TP,有变化就提示“修改了止损/获利”。挂单同理用 _orders 结构体比对。
五、事件分类:switch 区分建仓/平仓/反向
订单消失时,用 HistorySelect 拉取历史,取最后一笔成交的 DEAL_ENTRY(IN 建仓 / OUT 平仓 / INOUT 反向 / STATE 状态)配合 DEAL_TYPE(0 买 1 卖)区分动作,再用 Alert 报出品种与盈亏。全程配合 GetLastError / ResetLastError 避免误判。
小结
- 交易事件发生 → 终端自动调用 OnTrade()
- 一次市价开仓会触发 OnTrade 4 次,别当“一笔成交”
- 历史变更不触发 OnTrade,判断靠数量/属性对比
- OrdersPrev 对比法识别新增/消失订单
- 结构体快照对比法识别 SL/TP 修改
- switch(DEAL_ENTRY)+switch(DEAL_TYPE) 分类事件