MT5 订单系统重构基础:用合约数据概括多资产交易计算(基础篇)
(1/3)· 从 B3 期货到外汇,一套开源 EA 如何摆脱重复代码并适配不同合约规格
「重构订单系统的底层思路」
这一节切入的是 MT5 智能交易系统第 22 部分里的「新订单系统 V」迭代。核心不是加指标,而是把下单、撤单、改仓的调用逻辑从散落状态收敛成统一接口,降低后续策略接入的耦合度。 根据原文发布记录,该内容于 2022 年 10 月 7 日发布在 MetaTrader 5 交易栏目,截至统计时获得 2,436 次阅读与 1 条读者反馈——对一个偏底层的 EA 架构专题来说,样本量不大但指向明确:做订单系统重构的人远少于写信号逻辑的人。 外汇与贵金属品种在 MT5 上跑这类自定义订单层时,点差跳变和成交拒绝率会随流动性波动,属于高风险操作环境;建议在策略测试器里先用历史数据验证接口稳定性,再上模拟盘。
系统开发里那些绕不开的返工坑
做一套新系统最磨人的不是写第一版,而是中途不断撞上原本没料到的问题,被迫停下重想方向。尤其在没有硬截止日或预算压着的时候,这种‘推倒一小块重来’会发生得非常频繁,因为你有空间反复试。 商业环境下则反过来:紧赶慢赶交付的程序,往往带着一堆要事后补的错误。程序员在 deadline 前根本没空把明明有益的方案接进去,于是公司只能靠发一个个小版本打补丁——这不是发布后才测出漏洞,而是发布前压力太大不得已先交差。 在前面第 21 部分里,那套 EA 其实已经快好了,只差图表上直接拖单的功能。我接手这块时翻代码,发现不少重复片段,有些逻辑放到差异很大的资产上根本不对劲。最初我是照着 B3 期货交易所写的,实际做出来跑的是 WDO、WIN 美元指数期货,越改越像最初想要的样,就想着扩到别的品种——麻烦正好从这里开始。 外汇和贵金属这类高波动品种若直接套用,代码里的资产假设不重写,复制过去大概率是假平滑。
◍ 先看清合约定义再谈算法
很多人写 EA 时跳过了最关键的一步:搞清平台里的合约到底是怎么定义的。MT5 本身暴露了这些信息,MQL5 也能直接读,但多数开发者只顾堆信号逻辑,结果算仓、算风险全建立在错误假设上。 我们这套从图表直接下单的系统,不挂外部 DLL、不依赖未来模块,目标就是复刻平台原生交易逻辑但完全开源,让你能自己改字段、加维度。 难点在于:B3 股票和外汇的点值、合约大小差异极大,用一套写死的结构去覆盖多个市场,基本寸步难行。我也不敢说真能做成完全通用的系统,但至少能教你如何在 MT5 里把合约数据挖出来。 实操上,MQL5 代码能取数,不过为省事,我先用 MT5 界面把数据位置指给你看,后面再给代码逐行拆。外汇和贵金属杠杆高、跳空频繁,直接用未验证的合约参数下单风险很大,务必先在策略测试器跑一遍。
「B3 市场零星股的下单比例陷阱」
在 B3 交易公司资产(股份)时,高亮数据块给出的是计算下单位置的基础字段,做止损、止盈必须拿这些数值去推,而不是凭感觉挂。 若你按财经价值建仓,且所有订单都按 OCO 或持仓处理,流程并不复杂,但极易在最小交易量上栽跟头。 关键差异:B3 不同市场间允许零星股票(不足一手)交易,此时最小交易量是指定值的 1%。所以我们用 1:1 比例交易,而非 100:100。 这两者的计算结果会明显不同,开 MT5 前先把比例参数核对一遍,否则止损位会整体偏移。外汇与贵金属杠杆更高,风险更甚,参数错配可能瞬间放大亏损。
期货合约的成交量规则与杠杆乘数
期货合约和股票不是一套玩法,成交量怎么变,取决于你做的是完整合约、迷你合约,还是跨资产挪仓。以 BOI 为例,重点先看杠杆(乘数)怎么填,那才是实际下单的敞口来源;我这里只盯合约本身。 某些品种里 1 份完整合约 = 25 份迷你合约,但这不是铁律,不同交易所、不同标的规则会漂移,开仓前必须核对合约规格里的交易量阶梯。 合约都有到期日,但做 EA 的人不用太慌:之前那篇讲交叉订单系统的文章里,已经用历史持仓自动续接交割,EA 会替你选当前活跃合约。图上标红的地方和股份系统不一样,偶尔会出岔子,不过程序层已经兜底,只是逻辑不那么直观。 做久了你就会习惯——杠杆交易里填对数值、按固定财务敞口下单,比纠结合约名重要得多。外汇/贵金属杠杆高,合约错配可能瞬间放大亏损,先在小账户验证逻辑。
◍ 外汇杠杆下 EA 计算为何在 B3 失灵
做跨市场 EA 时有个坑:同一段仓位计算代码在外汇能跑,放到 B3 巴西股指期货就失效。根因很直接——B3 合约返回四个数值(含 tick size、合约乘数等),而外汇只暴露两个数值(点值、杠杆相关),缺的那两个值让计算公式对不上,EA 实际在算什么连自己都难追溯。 后果不是理论层面的:乘数算太大时订单被拒,因为交易量低于经纪商最小允许量;乘数算太小时 OCO 挂单因持仓上下文错乱不被接受。外汇和高杠杆贵金属市场里这种错配会直接废掉一整天策略,属于高风险实操雷区。 解法不是打补丁,而是让 EA 按资产动态适配数据,并用整数乘数锚定最小允许交易量,而不是传具体手数。注意:虽然 MT5 计算层现在允许交易量用浮点,但实盘务必用整数表示杠杆倍数,否则跨市场仍可能触发拒单。 下面这段是适配后的核心赋值逻辑,用整数 multiplier 乘最小交易量,绕开 B3/外汇数值差异: [CODE] double minVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); int multiplier = 10; // 整数杠杆倍数,勿用浮点 double lot = minVol * multiplier; if(lot < minVol) lot = minVol; [/CODE] 复制进 EA 初始化后打印 lot,分别在外汇和 B3 品种上各跑一次,就能看到同一 multiplier 下两者最小下单量的真实差距。
class="type">class="kw">double minVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); class="type">int multiplier = class="num">10; class=class="str">"cmt">// 整数杠杆倍数,勿用浮点 class="type">class="kw">double lot = minVol * multiplier; if(lot < minVol) lot = minVol;