Connexus观察者模式(第8部分):添加一个观察者请求·综合运用
📘

Connexus观察者模式(第8部分):添加一个观察者请求·综合运用

第 3/3 篇

◍ 收尾时释放观察者指针

在 MT5 自定义指标或 EA 的初始化函数末尾,向服务器发出请求后必须清理本地分配的对象。上面这段片段里,client.Send(request,response) 把组装好的观测请求提交出去,紧接着 delete my_observer 释放了之前 new 出来的观察者实例,避免句柄泄漏。 返回 INIT_SUCCEEDED 代表初始化流程正常结束,MetaTrader 5 终端据此允许指标加载到图表。若漏写 delete,多次重载指标会在内存里堆积无效指针,实盘环境下面临贵金属与外汇报价高频刷新,可能触发终端卡顿甚至强制退出。 开 MT5 按 F4 进 MetaEditor,搜自己 OnInit 里的 new 调用,确认每个配对 delete 都在 Send 之后、return 之前,就能复现这套安全收尾。

MQL5 / C++
  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 里照下面结构建文件夹,编译报错概率会低一截。

MQL5 / C++
|--- 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_MyFilterOnTick_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 在评论区的说法,闪到第一个错误改掉即可跑通。 外汇与贵金属行情波动剧烈、杠杆风险高,用该库接实时报价或信号接口时,务必在模拟盘验证稳定性后再上真仓。 代码整洁和长期可维护比一时快更重要,这套库的价值不在帮你发请求,而在让你少写重复胶水代码。

常见问题

可能造成内存泄漏或后续请求串号;在析构或结束逻辑里显式置空并释放指针最稳妥。
Utils 只管拼接与基础工具,接口层隔离业务请求细节,后面改协议不用动调用方。
可以,把代码贴给小布,它能标出命名不一致和接口分层问题,并给出改写建议。
能,统一前缀和语义让搜索、重构、交接都快很多,是代码库的隐形骨架。
底层通信放 Utils,请求组装走独立接口层,业务只调接口,三层分开就好维护。