环境函数
客户端状态检测函数
int GetLastError() 获取最新错误信息码
示例:
int err;
int handle=FileOpen("somefile.dat", FILE_READ|FILE_BIN);
if(handle<1)
{
err=GetLastError();
Print("error(",err,"): ",ErrorDescription(err));
return(0);
}
//----------错误描述子------------+
string ErrorDescription(int 错码)
{
string 原因;
switch(错码){
//--从服务器返回的错误
case 0: 原因= "交易成功 "; break;
case 1: 原因= "OrderModify() 未改变原值"; break;
case 2: 原因= "常规错误 如需重起客户端等,需查清"; break;
case 3: 原因= "无效的交易参数,如货币对,或未知业务,无些单号等"; break;
case 4: 原因= "交易服务器繁忙,需稍后重试或休息"; break;
case 5: 原因= "MT4版本太旧"; break;
case 6: 原因= "没有连接服务器 应该用IsConnected函数)过5秒后重试"; break;
case 7: 原因= "没有足够权限进行相应操作"; break;
case 8: 原因= "请求过于频繁,查看是否需修改程序"; break;
case 9: 原因= "交易运行故障"; break;
case 64: 原因= "账户被禁止"; break;
case 65: 原因= "本账户无效"; break;
case 128: 原因= "交易超时,请查看是否存在未修改或未删除的定单"; break;
case 129: 原因= "无效开仓价格,应用RefreshRates函数重试,或修改程序逻辑。"; break;
case 130: 原因= "OrderSend()的参数出错:止损或止赢离现价太近而无效"; break;
case 131: 原因= "无效的下单手数"; break;
case 132: 原因= "市场关闭,等开市后再试"; break;
case 133: 原因= "交易被禁止"; break;
case 134: 原因= "资金不足"; break;
case 135: 原因= "价格已 改变,应用RefreshRates()函数重试 "; break;
case 136: 原因= "脱离报价,可能因市价变化太快使交易商暂停报价或市场尚未启动"; break;
case 137: 原因= "经纪繁忙"; break;
case 138: 原因= "重新开价,可能是请求的报价已过时,或者买价和卖价混淆,请用RefreshRates()函数刷新数据再试 或修改程序"; break;
case 139: 原因= "订单被锁定,请修改程序逻辑。"; break;
case 140: 原因= "只允许开多仓,禁止开空仓"; break;
case 141: 原因= "过多请求,须减少请求次数,程序逻辑需要修改"; break;
case 142: 原因= "定单按次序排列。在交易执行期间,碰巧连接断开或重新连接时,此代码和错误代码128一样处理。"; break;
case 143: 原因= "定单已经被执行交易商接受。是客户端和交易服务器之间一个代码。处理方法参照错误128。"; break;
case 144: 原因= "在手动确认期间,定单已经被客户放弃。是客户端和交易服务器之间一个代码。"; break;
case 145: 原因= "因价格过于接近市价,故操作被拒绝 延时15秒后,用RefreshRates更新数据再试"; break;
case 146: 原因= "交易线程忙,只有在IsTradeContextBusy()函数返回FALSE后重试。"; break;
case 147: 原因= "交易商拒绝使用挂单有效期,"; break;
case 148: 原因= "开即时单和挂单总数超限,须平消一些后重试"; break;
case 149: 原因= "禁止对冲"; break;
case 150: 原因= "先入先出规则被禁止"; break;
//--从mql4中获得的错误
case 4000: 原因= "没有错误(未有过代码)"; break;
case 4001: 原因= "错误的函数指针"; break;
case 4002: 原因= "数组索引超出范围"; break;
case 4003: 原因= "对于调用堆栈储存器函数没有足够内存";break;
case 4004: 原因= "循环堆栈储存器溢出"; break;
case 4005: 原因= "对于堆栈储存器参量没有内存"; break;
case 4006: 原因= "对于字行参量没有足够内存 "; break;
case 4007: 原因= "对于字行没有足够内存 "; break;
case 4008: 原因= "没有初始字行 "; break;
case 4009: 原因= "在数组中没有初始字串符 "; break;
case 4010: 原因= "对于数组没有内存 "; break;
case 4011: 原因= "字行过长 "; break;
case 4012: 原因= "余数划分为零 "; break;
case 4013: 原因= "零划分 "; break;
case 4014: 原因= "不明命令"; break;
case 4015: 原因= "错误转换(没有常规错误) "; break;
case 4016: 原因= "没有初始数组 "; break;
case 4017: 原因= "禁止调用DLL "; break;
case 4018: 原因= "库文件不能被加载"; break;
case 4019: 原因= "不能调用函数 "; break;
case 4020: 原因= "禁止调用智能交易函数 "; break;
case 4021: 原因= "对于来自函数的字行没有足够内存 "; break;
case 4022: 原因= "系统繁忙 (没有常规错误) "; break;
case 4050: 原因= "函数的参数数量错误"; break;
case 4051: 原因= "函数的参数无效 "; break;
case 4052: 原因= "字行函数内部错误 "; break;
case 4053: 原因= "一些数组错误 "; break;
case 4054: 原因= "应用不正确数组 "; break;
case 4055: 原因= "c自定义指标错误 "; break;
case 4056: 原因= "不匹配的数组"; break;
case 4057: 原因= "全局变量处理出错 "; break;
case 4058: 原因= "找不到全局变量"; break;
case 4059: 原因= "函数在测试模式中被禁止使用"; break;
case 4060: 原因= "函数没有被确认"; break;
case 4061: 原因= "发送邮件错误 "; break;
case 4062: 原因= "参数应为字符串变量"; break;
case 4063: 原因= "参数应为整型变量"; break;
case 4064: 原因= "参数应为浮点类型变量"; break;
case 4065: 原因= "参数应为数组"; break;
case 4066: 原因= "所查询的历史数据在更新状态当中"; break;
//case 4067: 原因= "err trade error ◆交易函数有错误 ";break;
case 4099: 原因= "文件结束 "; break;
case 4100: 原因= "一些文件错误 "; break;
case 4101: 原因= "错误文件名称 "; break;
case 4102: 原因= "打开文件过多 "; break;
case 4103: 原因= "不能打开文件 "; break;
case 4104: 原因= "不匹配的文件访问 "; break;
case 4105: 原因= "未选中定单 "; break;
case 4106: 原因= "不明货币对 "; break;
case 4107: 原因= "无效价格"; break;
case 4108: 原因= "无效定单编码 "; break;
case 4109: 原因= "不允许交易"; break;
case 4110: 原因= "不允许做多"; break;
case 4111: 原因= "不允许做空 "; break;
case 4200: 原因= "物件已经存在 "; break;
case 4201: 原因= "未知的物件属性 "; break;
case 4202: 原因= "物件不存在"; break;
case 4203: 原因= "未知的物件类型"; break;
case 4204: 原因= "没有物件名称"; break;
case 4205: 原因= "物件坐标错误 "; break;
case 4206: 原因= "没有指定子窗口"; break;
default: 原因= "未知的错误 ";
}
return(原因);
}
//-----------------------------------------+
bool IsConnected()
判断客户端和服务器之间的 连接状态
示例:
if(!IsConnected())
{
Print("Connection is broken!");
return(0);
}
// Expert body that need opened connection
// ...
bool IsDemo()
判断是否是 模拟账户
示例:
if(IsDemo()) Print("I am working on demo account");
else Print("I am working on real account");
bool IsDllsAllowed()
判断是否允许调用 DLL函数
示例:
import "user32.dll"
int MessageBoxA(int hWnd ,string szText, string szCaption,int nType);
...
...
if(IsDllsAllowed()==false)
{
Print("DLL call is not allowed. Experts cannot run.");
return(0);
}
// expert body that calls external DLL functions
MessageBoxA(0,"an message","Message",MB_OK);
bool IsExpertEnabled()
判断是否 开启智能交易
示例:
如果while(!IsStopped())
{
...
if(!IsExpertEnabled()) break;
}
bool IsLibrariesAllowed()
判断是否允许调用 库函数
示例:
import "somelibrary.ex4"
int somefunc();
...
...
if(IsLibrariesAllowed()==false)
{
Print("Library call is not allowed. Experts cannot run.");
return(0);
}
// expert body that calls external DLL functions
somefunc();
bool IsOptimization()
判断智能交易是否是在策略测试器的 优化模式中运行
示例:
if(IsOptimization()) return(0);
bool IsStopped()
判断智能交易是否中止
如果程序(一个智能交易程序或一个脚本程序)得到了停止运行的命令,返回true,否则,返回false。
在客户端强制中止执行 之前,程序还能继续运行2.5秒。
示例:
while(expr!=false)
{
if(IsStopped()==true) return(0);
// long time procesing cycle
// ...
}
bool IsTesting()
判断智能交易是否处于 测试模式运行
示例:
if(IsTesting()) Print("I am testing now");
bool IsTradeAllowed()
判断是否允许交易。
如果智能交易程序允许交易,而且执行交易的线程没有被占用,返回true
示例:
if(IsTradeAllowed()) Print("Trade allowed");
bool IsTradeContextBusy()
判断交易是否 繁忙。
如果执行交易的线程被另一个智能交易占用,返回true
示例:
if(IsTradeContextBusy()) Print("交易繁忙中,请稍等");
bool IsVisualMode()
判断智能交易是否在可视模式下测试运行。
示例:
if(IsVisualMode()) Comment("可视模式开启");
int UninitializeReason()
获取 未初始化原因。
返回智能交易、自定义指标和脚本的未初始化原因代码。返回值为 未初始化原因代码 之一。本函数同样可以在函数init()中调用,用于分析上次运行出错原因。
示例:
// 这是范例
int deinit()
{
switch(UninitializeReason())
{
case REASON_CHARTCLOSE:
case REASON_REMOVE: CleanUp(); break; // 清理和所有资源重分配
case REASON_RECOMPILE:
case REASON_CHARTCHANGE:
case REASON_参量:
case REASON_ACCOUNT: StoreData(); break; // 准备重新开始
}
//...
}