市场模拟(第四部分):创建 C_Orders 类(一)·综合运用
🔌

市场模拟(第四部分):创建 C_Orders 类(一)·综合运用

(3/3)· 回放系统跑通前最易被跳过的环节,正是订单类与服务器握手的逻辑地基

偏理论 第 3/3 篇
很多人急着让模拟器下单,却没搞清 EA 与交易服务器的消息边界,直接抄代码跑通就以为懂了。一旦模块职责混淆,真实账户或模拟账户通信就会在边界处静默失效。先理清 C_Orders 类的任务边界,比多写十行下单代码更重要。

「把下单请求当成填表发给服务器」

很多刚写 EA 的人卡在服务器通信这一步,本质是没把编程当成「填一张严谨的表单」。交易者看图表随手点,程序员却必须保证每个字段合规,否则服务器像挑剔的审核员直接拒单,但会回写拒绝原因,读懂返回码就能修。 第 44–64 行的函数封装了整套通信流程,逻辑顺序不能乱:先清回应内存(49–50 行),再在提交前做数据校验(51 行),出错就拿到错误码重来;校验过才发请求(56 行)。 服务器回包先丢进占位变量,只为绕开编译器警告,真正有用的是回复结构体里的字段。57 行判断返回值是否不等于 TRADE_RETCODE_DONE,若不等就把错误码打印到终端(59 行)。函数本身在 44 行定义,失败时返回 0,成功则返回订单/仓位标识的单号。 市价单由 66 行的函数发出,它只接一个买卖方向参数,在收到 Chart Trade 的市价信号时于 113、116 行被调用。至于止损、止盈、杠杆、品种甚至跨期属性怎么带过去,要看下一层请求组装。外汇与贵金属杠杆交易风险高,返回码异常时需先排查再重试,勿盲目追单。

请求结构体的私有作用域与填表顺序

看 C_Orders 类里第 44 行的服务器通信函数,第 51、56 行用到的结构并未在函数内声明,它实际定义在类第 14 行——一个私有且类全局可见的结构。类外代码碰不到它,所以第 44 行函数依赖的这个变量,必须在类内第 66–94 行被正确赋值,否则服务器不会执行你想要的市价买或卖。 填结构之前先抓三样东西:当前价格(第 68 行,每个细节都关键)、交易量、以及品种小数位(第 70 行)。这里最容易踩坑的是交易量——图表上显示的成交量其实是杠杆水平,不是服务器要的真实手数,服务器期望的是最小交易量乘以杠杆后的倍数,俩概念别混。 第 72 行先清结构,73–86 行逐字段写明服务器动作,这套填法对股票、OTC 和外汇都通用。外汇和贵金属属高风险品种,字段填错任一项都可能直接造成账面亏损,挂单和 SL/TP 修改留到后面讲。 填完在第 88–91 行用标准库 ArrayPrint 把结构体打到终端自查,第 93 行返回请求响应。开 MT5 把这段跑一遍,对着终端输出核对每个字段,比看文档来得实在。

◍ 记住这一条就够了

这套图表交易头文件配合 Chart Trade 指标,当前已能跑通市价单的买卖,但 MqlTradeRequest 结构里的挂单逻辑留到了下一篇才拆。 系统依赖五个文件协同:Expert Advisor.mq5 管交互演示,Chart Trade.mq5 出订单配置窗,Market Replay.mq5(指标与服务各一)做回放控件与后台服务,Mouse Study.mq5 统一接管图形交互,缺一个实时下单或回测都起不来。 外汇与贵金属杠杆高、滑点随机,拿这套框架验证前先在策略测试器用历史数据跑通 Mouse Study 再接实盘,别直接挂真户。

把通信边界交给小布盯盘标注
这些订单类与服务器的职责划分,小布盯盘的 AIGC 已内置成品种页里的结构提示,打开对应页就能对照自己 EA 的模块边界,你专注决策而非翻代码。

常见问题

它是前面跨期订单消息系统的具体承载模块,负责把 EA 解读过的指令转成服务器能收的请求,缺了前几篇基础直接写类会看不懂字段来源。
表单把订单参数从交互层隔离出来,避免 EA 不知道订单来源的问题复发,也方便后续跨模块排查故障。
本篇明确没有备份系统,设计上故意单点明确,以便定位问题;概率上这要求每个模块写透而非写快。
可以,小布盯盘的品种页会把订单类职责与服务器握手点做成可视化提示,省去你手动比对前文消息机制的重复劳动。
本系列聚焦通信地基,回放执行订单的完整讨论见后续实战文档,本篇末节只做模块边界收束。