市场模拟(第四部分):创建 C_Orders 类(一)·综合运用
(3/3)· 回放系统跑通前最易被跳过的环节,正是订单类与服务器握手的逻辑地基
「把下单请求当成填表发给服务器」
很多刚写 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 再接实盘,别直接挂真户。