程序类型和许可证

相同源代码可以某种方式包括在不同类型的 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);
Print(EnumToString(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
   
void OnStart()
{
   Print(EnumToString((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE)));
   Print(EnumToString((ENUM_LICENSE_TYPE)MQLInfoInteger(MQL_LICENSE_TYPE)));
}

为简化其启动流程(即无需创建一个服务实例并通过终端中的导航器来运行),建议使用调试器:只需在 MetaEditor 中打开源代码并执行命令 Debugging -> Start on real data(按 F5 或工具栏上的按钮)。

我们应会得到以下日志条目:

EnvType (debug)        PROGRAM_SERVICE
EnvType (debug)        LICENSE_FREE

其中你可以清楚看到,程序类型为服务,并且实际上没有许可证(免费使用)。