利用 EX5 库来推动您的项目开发·综合运用
(3/3)· 前 two 篇铺垫了基础导出,本篇把继承与发布跑通,让你的算法真正能共享
「导出类没法直接继承,只能模拟」
MQL5 里把实施对象藏进 ex5 再导出,本质上切断了普通继承链:你拿到的不是基类本体,而是最后一环的可调用包装,直接写 class Derived : public ExportedBase 这种简单继承根本不成立。 想让外部开发者基于你的闭源类做扩展,只能绕一层中间类来“模拟继承”,同时保留多态和虚函数能力。代价是:基类成员变量不在子类的声明作用域里,而是塞在 _base 指针背后,调用时要多走一次间接寻址。 只要随包提供 SuperClass.mqh 标头,外部代码就能用 _base 访问需要的数据,可用性基本不受损。如果你只打算暴露专有函数,连 ISuperClass 包装都可以不预先写,直接导出函数让外部自己包一层即可。 对外发布闭源库时,至少得齐三样:类独立函数的导出入口、带声明的 .mqh 标头加 .ex5 实施、以及变量在 .ex5 内的真实定义,缺一个外部都没法正常继承。
class=class="str">"cmt">//--- including the class="kw">public header class class="macro">#include "SuperClass.mqh" class=class="str">"cmt">//--- getting the hidden implementation object class="macro">#class="kw">import "ISuperClass.ex5" CSuperClass *iSuperClass(); class="macro">#class="kw">import class _CSuperClass { class="kw">public: class=class="str">"cmt">//--- instance of the hidden implementation object CSuperClass *_base; class="kw">public: class=class="str">"cmt">//--- constructor _CSuperClass() { _base=iSuperClass(_GetExt()); }; class=class="str">"cmt">//--- destructor ~_CSuperClass() { class="kw">delete _base; }; class=class="str">"cmt">//--- further followed by all functions of the base CSuperClass class class=class="str">"cmt">//--- working function called from the hidden implementation object class="kw">virtual class="type">int func(class="type">int a, class="type">int b) { _base.func(a,b); }; };
把函数库丢进 ex5 资源库
- 年 11 月,MetaQuotes 开放了文件资源库的访问权限,开发者从此能把编译好的 ex5 函数库上传托管。
托管的意义不只是自己存东西。别的开发者也能拉取你发布的库,你后续推新版本时,对方能在 MT5 里直接拿到更新,省去手动传文件的麻烦。 如果你想变现,公司站点还给了入口:可以把自己的函数库挂到市场里,选免费或收费两种模式对外提供。外汇和贵金属 EA 开发涉及杠杆与跳空,挂库分发前务必在 MT5 策略测试器里跑过多周期回测再对外发布。
◍ 把工具请下神坛
导出 ex5 库这件事,本质上只是把函数或类对象从主程序里拆出来单独编译,再让别的工程用 #import 接回去。技术门槛不高,但能改变你和别人协作的方式:共同维护一个策略模块、在应用商店挂出带权限控制的子功能,都比把一整坨代码拷来拷去干净。 外汇与贵金属市场杠杆高、滑点随机,任何 ex5 库都不会替你扛回撤,把它当零件而不是印钞机。 真要落地,今晚开 MT5 新建一个 empty 库工程,把上一篇的 CalcSpread 函数导出成 ex5,再建个脚本 #import 调一次——跑通了,这套机制才算你的。