程序类型和许可证
相同源代码可以某种方式包括在不同类型的 MQL 程序中。除了选择在编译阶段在通用产品中 包括源代码 (预处理器指令 #include)外,还可以组装 库 ,即在执行阶段连接到主程序的二进制程序模块。
然而,某些函数只允许在特定类型的程序中使用。例如, OrderCalcMargin 函数不能用于 指标。虽然这一限制似乎根本上不合理,但是用于计算抵押资金的通用算法(该算法不仅能够内置于 EA 交易中,还能内置于指标中)的开发人员应将这一细微差别纳入考虑,为指标供一种替代计算方法。
完整程序类型限制列表将在每一章的适当章节提供。在所有这些情况下,重要的是要知道“父”程序的类型。
要确定程序类型,可使用 ENUM_MQL_INFO_INTEGER 中的 MQL_PROGRAM_TYPE 属性。可能的属性值在 ENUM_PROGRAM_TYPE 枚举中描述。
标识符 |
值 |
说明 |
|---|---|---|
PROGRAM_SCRIPT |
1 |
脚本 |
PROGRAM_EXPERT |
2 |
EA 交易 |
PROGRAM_INDICATOR |
4 |
指标 |
PROGRAM_SERVICE |
5 |
服务 |
在前一节中的日志片断中,我们看到 PROGRAM_SCRIPT 属性设置为 1,因为我们使用脚本测试。要获取字符串说明,可以使用 EnumToString。
ENUM_PROGRAM_TYPE type = (ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE);
|
另一个便于分析以启用/禁用某些功能的 MQL 程序特性是许可证类型。我们知道,MQL 程序可免费分发,也可以在 MQL5 市场中分发。此外,商店中的程序可购买或作为演示版本下载。这些因素易于检查,并且可根据需要调整算法以适配。为此,可使用 ENUM_MQL_INFO_INTEGER 中的 MQL_LICENSE_TYPE 特性,该特性将 ENUM_LICENSE_TYPE 枚举用作一个类型。
标识符 |
值 |
说明 |
|---|---|---|
LICENSE_FREE |
0 |
免费无限制版本 |
LICENSE_DEMO |
1 |
来自市场的付费产品的演示版本,仅可在策略测试程序中工作 |
LICENSE_FULL |
2 |
购买的许可版本,允许至少 5 次激活(激活次数可由卖家增加) |
LICENSE_TIME |
3 |
有时间限制的版本(尚未实现) |
务必要注意,许可证指二进制 ex5 模块,使用 MQLInfoInteger(MQL_LICENSE_TYPE) 向该模块提交请求。在库中,该函数将返回该库自身的许可证,而不是该库所链接到的主程序的许可证。
作为测试本节所述两个函数的示例,本书提供了简单服务 EnvType.mq5。它不包含工作循环,因此在 OnStart 中执行两个指令后将立即终止。
#property service
|
为简化其启动流程(即无需创建一个服务实例并通过终端中的导航器来运行),建议使用调试器:只需在 MetaEditor 中打开源代码并执行命令 Debugging -> Start on real data(按 F5 或工具栏上的按钮)。
我们应会得到以下日志条目:
EnvType (debug) PROGRAM_SERVICE
|
其中你可以清楚看到,程序类型为服务,并且实际上没有许可证(免费使用)。