Connexus观察者模式(第8部分):添加一个观察者请求·综合运用
◍ 收尾时释放观察者指针
在 MT5 自定义指标或 EA 的初始化函数末尾,向服务器发出请求后必须清理本地分配的对象。上面这段片段里,client.Send(request,response) 把组装好的观测请求提交出去,紧接着 delete my_observer 释放了之前 new 出来的观察者实例,避免句柄泄漏。 返回 INIT_SUCCEEDED 代表初始化流程正常结束,MetaTrader 5 终端据此允许指标加载到图表。若漏写 delete,多次重载指标会在内存里堆积无效指针,实盘环境下面临贵金属与外汇报价高频刷新,可能触发终端卡顿甚至强制退出。 开 MT5 按 F4 进 MetaEditor,搜自己 OnInit 里的 new 调用,确认每个配对 delete 都在 Send 之后、return 之前,就能复现这套安全收尾。
class=class="str">"cmt">//--- Send client.Send(request,response); class=class="str">"cmt">//--- Delete pointer class="kw">delete my_observer; class="kw">return(INIT_SUCCEEDED); }
把 URL 并进 Utils,接口单开一層
原库里 URL 与 Data 两个文件夹都装工具型文件,维护时容易找错地方。直接把 URL 下的 QueryParam.mqh、URL.mqh 挪到 Data 并改名为 Utils,一类用途归一个目录。 接口不是附属件,而是整个 HTTP 库的连接契约。所以在 Core 内单拆 Interface 文件夹,把 IHttpObserver.mqh 与 IHttpTransport.mqh 沉到 Core/Interface 下,调用关系一眼能看明白。 重构后目录从 11 个一级子项收成 9 个,Core 内部层级多了一层但职责更清。在 MT5 的 MQL5/Include 里照下面结构建文件夹,编译报错概率会低一截。
|--- Connexus |--- |--- Constants |--- |--- |--- HttpMethod.mqh |--- |--- |--- HttpStatusCode.mqh |--- |--- Core |--- |--- |--- Interface |--- |--- |--- |--- IHttpObserver.mqh |--- |--- |--- |--- IHttpTransport.mqh |--- |--- |--- HttpClient.mqh |--- |--- |--- HttpRequest.mqh |--- |--- |--- HttpResponse.mqh |--- |--- |--- HttpTransport.mqh |--- |--- Utils |--- |--- |--- Json.mqh |--- |--- |--- QueryParam.mqh |--- |--- |--- URL.mqh |--- |--- Header |--- |--- |--- HttpBody.mqh |--- |--- |--- HttpHeader.mqh
「统一命名是代码库的隐形骨架」
在 MT5 里写 EA 或指标,最容易被忽略却最拖后期效率的,就是函数与变量的命名随意。一个 500 行以上的 MQL5 文件,如果方法名有的用 CamelCase、有的用下划线分隔,维护者平均要多花 30% 时间定位逻辑入口。
统一前缀加语义的命名(如 iATR_MyFilter、OnTick_CheckRisk)能让协作者一眼区分系统函数与自定义部分,降低误改概率。外汇与贵金属杠杆高、波动突发行情多,脚本出错可能瞬间放大亏损,命名清晰是降低人为故障的第一道防线。
别把规范当文档装饰。新建 .mq5 时先定三条例:自定义函数加模块缩写、全局变量用 g_ 起头、回调保持 On* 原生形态。今晚开 MT5 新建一个空 EA,照这三条先写十个空函数壳,比背语法书有用。
◍ 统一规范让 MT5 库更好改
在 MT5 写 EA 或指标库时,缩进、命名不一致会直接拖慢排查速度。团队里有人用 m_ 前缀私有变量、有人不用,读代码时大脑要不停切换上下文,专注力耗在格式而非逻辑上。 维护阶段代价更明显:需求一变,风格乱的库容易改出副作用。从设计起就定死规则,新接手的人能照着结构加功能,不用先猜旧代码意图。外汇和贵金属策略迭代快,这种隐性成本会放大回测与实盘切换的失误概率。 现有库已落地几条硬规则:类加 C 前缀、接口加 I、私有变量加 m_、方法首字母大写、枚举全大写。本次补充——属性读写用 Get/Set,数组长度叫 Size,重置叫 Clear,转字符串叫 ToString。 CQueryParam 里的 AddParam() 就是冗余典型:类本身已是参数语境,直接叫 Add() 更干净。改名不动实现,只调接口,MT5 里重构时先用 Find/Replace 扫一遍调用点再编译验证。
最后一句大实话
Connexus 这套观察者模式落地后,HTTP 通信模块从被动轮询变成了事件驱动,MT5 里各组件能自动对请求状态变化做出反应。 重构后的目录把接口、实现、测试拆开,Test\TestRequest.mq5 编译报错多数来自隐式有符号/无符号数组转换——按 Rashid Umarov 在评论区的说法,闪到第一个错误改掉即可跑通。 外汇与贵金属行情波动剧烈、杠杆风险高,用该库接实时报价或信号接口时,务必在模拟盘验证稳定性后再上真仓。 代码整洁和长期可维护比一时快更重要,这套库的价值不在帮你发请求,而在让你少写重复胶水代码。