从头开始开发智能交易系统(第 20 部分):新订单系统 (III)(基础篇)
把下单动作从 EA 主循环里拆出来
很多新手把 OrderSend 直接写在 OnTick 里,行情每跳就尝试发单,结果在滑点和高波动时反复撞墙。MT5 的异步下单机制要求你把『决策』和『执行』分开:先由策略逻辑算出信号,再交给独立订单模块统一派发。 在 2022 年 9 月 MT5 Build 3560 之后,交易类函数默认走异步通道,OrderSend 返回的是请求句柄而非成交结果。这意味着你不能再假设『调用即成交』,必须在 OnTradeTransaction 里回看交易事务状态。 实际验证很简单:开一个裸 EA,只在 OnInit 发一单,打印返回值类型,你会看到 RETCODE 只是『已接受』而非『已成交』。把下单逻辑外包成 COrder 类,主循环只负责喂信号,回测里重绘订单足迹会干净很多。外汇与贵金属杠杆高,异步失败不处理会放大穿仓风险,务必在订单模块里留超时与重试分支。
「把订单逻辑做成肉眼可见」
上一节我们改完了新订单系统的底层操作代码,这之后就能把精力完全压到「让下单这件事可被看见、可被理解」上。对很多交易者来说,跳价值是多少、该在哪挂单、止损放哪才不容易被扫,本来就是一笔糊涂账。 这套系统的目标,是把订单流、跳点成本和止损位置直接画在图表上,让不熟悉 MQL5 的人也能一眼看懂钱是怎么被风控掉的。外汇和贵金属杠杆高、跳空频繁,可视化不等于安全,只是先把盲区分摊出来。 要做到这种程度,光会写函数不够,得吃透 MetaTrader 5 终端实际怎么跑订单、哪些资源是平台现成给的。MQL5 的熟练度决定了你能否把抽象规则转成可交互的图。
◍ 把下单界面拆成可拖拽的对象组
这一节先不谈策略逻辑,只说我们要在 MT5 图表上造出什么东西。核心是一个带平仓按钮、数值显示和点位标记的可拖拽面板,拖一下就能挂单;当止损被触发反手时,系统按预设把止损转成止盈处理,交易者能直接看到何时、多少、何处、是否该持有确定仓位。 挂单形态和持仓形态略有差异,但底层的 OCO 约束对象是一致的。颜色我按示意配,你完全可以自己换。 关键工程量在对象数量:每个指标基础要 5 个图表对象;一笔 OCO 订单或 OCO 仓位,MT5 要同时管 15 个对象。若你挂 4 笔待成交 OCO 订单 + 1 笔 OCO 持仓,仅这一种资产,平台就得维护 25 个对象,还不算别的指标。 现代机器跑这点负载不算事,但做贵金属或外汇高频拖拽时,得心里有数——每笔订单占的对象数直接影响图表响应。早年一个挂单点只有一个对象,现在一个点裹着 5 个互连对象,连接关系由平台维持,我们只声明怎么连、触发后干啥。外汇和贵金属波动大、滑点风险高,对象越多越要留意图表卡顿。
对象定位该用哪种坐标系
在 MT5 里给图形对象定位,本质只有两条路:用时间+价格坐标,或用屏幕笛卡尔 X/Y 坐标。终端两种都支持,但选型直接决定后续代码怎么写。 时间价格坐标看着最直观,标个高低点、画根趋势线都很顺手。可一旦对象数量上来、彼此还要连成结构并保持整体移动,这套坐标就废了——你没法用单一时间价格把一组相对位置锁死。 所以多对象联动的场景,直接上笛卡尔系统:用像素级的 X/Y 来摆位置,结构内部相对关系才不会散。之前多篇里聊过这套选取思路,核心就是按屏幕坐标抓对象而非按行情坐标。 规划到这步就够清楚了,接下来可以开 MT5 新建脚本,先试试用 OBJPROP_XDISTANCE / YDISTANCE 把两个对象按笛卡尔方式钉在一起。外汇贵金属图形叠加高风险,坐标算错会让信号严重偏移,验证时务必在模拟盘先跑。
「从通用代码理解挂单与持仓的同构」
这套实现不想只丢给你一套能跑的系统,而是把内部每一步拆开讲,方便你照着同一个研究框架改出自己的版本。 核心一点:凡是和挂单相关的函数逻辑,在持仓处理上同样成立。系统底层走的是同一套通用代码,挂单和持仓只是状态不同,不是两套分支。 你在 MT5 里打开 EA 源码,看到 OrderSend / PositionModify 周边封装时,可以直接顺着挂单函数去读持仓部分,能省掉一半重复理解成本。外汇与贵金属波动剧烈,实盘前务必用策略测试器跑通通用路径。