在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; // 保存数据以备重新开始 } //… }
