MQL4 是 MetaTrader 4 平台上开发交易策略和指标的编程语言。在开发复杂的交易策略时,通常需要使用一些外部函数或库。本文将详细介绍如何在 MQL4 中描述和使用外部函数,特别是来自 DLL 和 EX4 库的函数,以及如何解决函数调用的歧义。
一、外部函数的描述
在 MQL4 中,使用其他模块中定义的外部函数时,必须显式描述这些函数。描述包括返回类型、函数名称以及一系列输入参数及其类型。如果没有这样的描述,编译、构建或执行程序时可能会出错。描述外部对象时,使用关键字 #import
来指示模块。
例如:
#import "customlib.dll"
int ShowCustomAlert(int windowHandle, string textMessage, string titleMessage, int alertType);
int SendCustomMessage(int windowHandle, int customMessage, int parameter1, int parameter2);
#import
通过使用 #import
,可以轻松描述从外部 DLL 或已编译的 EX4 库调用的函数。EX4 库是已编译的 ex4 文件,具有库属性。只有使用 export
修饰符描述的函数才能从 EX4 库中导入。
二、DLL 和 EX4 库的使用
在使用 DLL 和 EX4 库时,要注意它们应具有不同的名称(无论它们位于哪个目录),如果它们一起被导入。所有导入的函数都具有与库的“文件名”对应的作用域解析。
例如:
#import "mathlib.ex4"
double customRound(double numberToRound);
#import
这里,我们导入了一个名为 mathlib.ex4
的库,并描述了一个叫做 customRound
的函数。
三、解决函数调用的歧义
在程序中从不同的执行上下文使用具有相同名称的多个函数可能会导致歧义。为避免函数调用的歧义,请始终使用作用域解析操作显式指定函数作用域。
下面的示例展示了如何解决函数调用的歧义:
#import "utility32.dll"
int RetrieveErrorCode();
#import "toolslib.ex4"
int RetrieveErrorCode();
#import
class CTool {
public:
int RetrieveErrorCode() { return(67890); }
void execute() {
Print(RetrieveErrorCode()); // 调用类的方法
Print(::RetrieveErrorCode()); // 调用 MQL4 函数
Print(utility32::RetrieveErrorCode()); // 从 utility32.dll 调用 DLL 库函数
Print(toolslib::RetrieveErrorCode());
// 从 toolslib.ex4 调用 EX4 库函数
}
};
void OnStart() {
CTool tool;
tool.execute();
}
在这个示例中,我们使用作用域解析操作来明确指定要调用的 RetrieveErrorCode
函数的来源。
四、结论
通过高效地使用 MQL4 中的外部函数和库,开发者能够在开发交易策略时充分利用现有资源。需要注意的是,在描述和使用这些外部函数时,要确保正确处理函数调用的歧义,以避免潜在的错误和问题。通过掌握这些技巧,可以更加灵活和强大地利用 MQL4 进行高效的交易策略开发。