利用 EX5 库来推动您的项目开发·综合运用
📦

利用 EX5 库来推动您的项目开发·综合运用

(3/3)· 前 two 篇铺垫了基础导出,本篇把继承与发布跑通,让你的算法真正能共享

含代码示例实战向 第 3/3 篇
不少人以为把 .mq5 编译成库就完事了,结果别人一继承就链接报错。ex5 库的类不能直接导出,绕不开虚函数那套花哨做法,发布前不验路径更是白忙。

「导出类没法直接继承,只能模拟」

MQL5 里把实施对象藏进 ex5 再导出,本质上切断了普通继承链:你拿到的不是基类本体,而是最后一环的可调用包装,直接写 class Derived : public ExportedBase 这种简单继承根本不成立。 想让外部开发者基于你的闭源类做扩展,只能绕一层中间类来“模拟继承”,同时保留多态和虚函数能力。代价是:基类成员变量不在子类的声明作用域里,而是塞在 _base 指针背后,调用时要多走一次间接寻址。 只要随包提供 SuperClass.mqh 标头,外部代码就能用 _base 访问需要的数据,可用性基本不受损。如果你只打算暴露专有函数,连 ISuperClass 包装都可以不预先写,直接导出函数让外部自己包一层即可。 对外发布闭源库时,至少得齐三样:类独立函数的导出入口、带声明的 .mqh 标头加 .ex5 实施、以及变量在 .ex5 内的真实定义,缺一个外部都没法正常继承。

MQL5 / C++
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 调一次——跑通了,这套机制才算你的。

把重复劳动交给小布
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到编译与导入路径是否规范,你专注决策。

常见问题

MQL5 不能直接导出类,需用多态和虚函数返回隐藏实施对象,再在调用端通过公开接口继承,具体见本文继承小节。
可以,小布盯盘的品种页内置了路径与编译状态诊断,能提示 library.ex5 是否落在 MQL5\Libraries 或相对路径是否正确。
需确认 #property library 指令齐全、导出函数带 export、且文档写明导入限制,避免对方在 #import 时搜索不到文件。
可能库未编译进 Libraries 文件夹,或导入声明与导出签名不一致,先核对相对路径再查函数模板是否匹配。