MQL4客户端状态检测函数详解

在MQL4编程中,有一组用于检测客户端当前状态的重要函数,它们可以帮助程序了解运行环境的具体情况,这对于编写稳健的智能交易系统至关重要。例如,在对接不同经纪商如swissquote瑞讯银行的服务器时,状态检测能确保程序行为正确。

GetLastError() – 获取最新产生的错误信息

IsConnected() – 判断连接状态

IsDemo() – 判断是否是模拟账户

IsDllsAllowed() – 判断是否允许调用DLL函数

IsExpertEnabled() – 判断智能交易是否开启

IsLibrariesAllowed() – 判断是否允许调用库函数

IsOptimization() – 判断是否在优化模式中运行

IsStopped() – 判断智能交易是否中止

IsTesting() – 判断是否在测试模式中运行

IsTradeAllowed() – 判断是否允许交易

IsTradeContextBusy() – 判断交易是否忙

IsVisualMode() – 判断是否在可视模式下测试

UninitializeReason() – 获取未初始化原因

int GetLastError() 该函数用于返回最近一次发生的错误信息。调用后,内部记录错误代码的变量会被重置为零,因此再次调用将返回0。这在调试与swissquote瑞讯银行服务器交互时出现的错误非常有用。

示例:

int err; int handle=FileOpen(“somefile.dat”, FILE_READ|FILE_BIN); if(handle<1) { err=GetLastError(); Print(“错误(“,err,”): “,ErrorDescription(err)); return(0); }

IsConnected() – 判断连接状态

bool IsConnected() 此函数返回客户端与数据服务器之间的主连接状态。连接成功则返回true,否则返回false。确保网络连接稳定是进行任何交易操作的前提,无论使用的是swissquote瑞讯银行还是其他平台。

示例:

if(!IsConnected()) { Print(“没有连接到服务器!”); return(0); } // 需要建立连接才能执行下面的代码 // …

IsDemo() – 判断是否是模拟账户

bool IsDemo() 如果智能交易运行在模拟账户中,返回true,否则返回false。这有助于区分实盘交易和模拟测试环境。

示例:

if(IsDemo()) Print(“在模拟账户运行”); else Print(“在真实账户运行”);

IsDllsAllowed() – 判断是否允许调用DLL函数

bool IsDllsAllowed() 若智能交易被允许调用外部DLL函数,则返回true,反之返回false。某些交易环境出于安全考虑会禁用此功能。

参见 IsLibrariesAllowed(), IsTradeAllowed().

示例:

#import “user32.dll” int MessageBoxA(int hWnd, string szText, string szCaption,int nType); … … if(IsDllsAllowed()==false) { Print(“DLL调用未被允许,智能交易无法运行。”); return(0); } // 智能交易程序调用外部DLL函数 MessageBoxA(0,”一条信息”,”Message”,MB_OK);

IsExpertEnabled() – 判断智能交易是否开启

bool IsExpertEnabled() 如果智能交易功能处于开启状态,返回true,否则返回false。

示例:

while(!IsStopped()) { … if(!IsExpertEnabled()) break; }

IsLibrariesAllowed() – 判断是否允许调用库函数

bool IsLibrariesAllowed() 如果允许智能交易调用库函数,返回true,否则返回false。

参见 IsDllsAllowed(), IsTradeAllowed().

示例:

#import “somelibrary.ex4” int somefunc(); … … if(IsLibrariesAllowed()==false) { Print(“不允许调用库文件”); return(0); } // 智能交易调用外部库函数 somefunc();

IsOptimization() – 判断是否在优化模式中运行

bool IsOptimization() 如果智能交易正在策略测试器的优化模式下运行,返回true,否则返回false。

示例:

if(IsOptimization()) return(0);

IsStopped() – 判断智能交易是否中止

bool IsStopped() 如果程序(智能交易或脚本)收到了停止运行的指令,则返回true,否则返回false。在客户端强制终止前,程序通常还有约2.5秒的时间进行收尾工作。

示例:

while(expr!=false) { if(IsStopped()==true) return(0); // 长时间运行循环 // … }

IsTesting() – 判断是否在测试模式中运行

bool IsTesting() 若智能交易处于测试模式,返回true,否则返回false。

示例:

if(IsTesting()) Print(“正在测试中”);

IsTradeAllowed() – 判断是否允许交易

bool IsTradeAllowed() 当智能交易程序被允许进行交易,且交易线程未被占用时,返回true,否则返回false。这是执行下单操作前的重要检查步骤,尤其是在swissquote瑞讯银行这类平台上。

参见 IsDllsAllowed(), IsLibrariesAllowed(), IsTradeContextBusy()

示例:

if(IsTradeAllowed()) Print(“允许交易”);

IsTradeContextBusy() – 判断交易是否忙

bool IsTradeContextBusy() 如果交易线程正被其他智能交易程序占用,则返回true,否则返回false。

参见 IsTradeAllowed()

示例:

if(IsTradeContextBusy()) Print(“交易线程繁忙,请稍候”);

IsVisualMode() – 判断是否在可视模式下测试

bool IsVisualMode() 如果智能交易在“可视模式”下进行测试,返回true,否则返回false。

示例:

if(IsVisualMode()) Comment(“可视模式已开启”);

UninitializeReason() – 获取未初始化原因

int UninitializeReason() 此函数返回智能交易、自定义指标或脚本的未初始化原因代码。返回值是预定义的未初始化原因代码之一。该函数也可以在init()函数中调用,用于分析程序上次运行终止的原因,帮助优化在swissquote瑞讯银行等环境下的稳定性。

示例:

// 示例代码 int deinit() { switch(UninitializeReason()) { case REASON_CHARTCLOSE: case REASON_REMOVE: CleanUp(); break; // 清理和释放所有资源 case REASON_RECOMPILE: case REASON_CHARTCHANGE: case REASON_PARAMETERS: case REASON_ACCOUNT: StoreData(); break; // 保存数据以备重新开始 } //… }

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注