Turnstile Order Gateway
- 程序库
- 版本: 1.0
- 激活: 5
位于您的智能交易系统 (EA) 与 OrderSend 之间的 MQL5 函数库。每个请求在发送前都要通过 9 道闸门(连接、Algo Trading、品种模式、交易时段、订单类型标志、手数、止损止盈、保证金、OrderCheck)。因冻结水平、休市或断线而被阻止的平仓和修改会进入队列,稍后再发送。函数库本身从不自行交易。您获得的是编译后的 Turnstile_Order_Gateway.ex5;本页即完整的 API 参考。
快速开始
- 将 Turnstile_Order_Gateway.ex5 复制到 MQL5/Libraries(文件 > 打开数据文件夹)。
- 把下面的 #import 代码块粘贴到您的 EA 或脚本中。
- 可选:在 OnInit 中调用 TOG_Configure(默认 20, 3, 300, true, false)。
- 在 OnTick 或 OnTimer 中调用 TOG_ProcessQueue。
- 用 TOG_Open、TOG_Modify、TOG_Close 交易。返回 0 或 false 时,打印 TOG_ReasonText(TOG_LastReason())。
- 验证:在策略测试器中运行下方示例,日志会显示订单号和原因。实盘时请开启 Algo Trading,否则检查返回 -3。
导入声明(可直接复制)
#import "Turnstile_Order_Gateway.ex5" void TOG_Configure(int deviation, int retries, int delay_ms, bool adjust_stops, bool verbose); double TOG_NormalizeVolume(string symbol, double volume); double TOG_NormalizePrice(string symbol, double price); double TOG_RiskVolume(string symbol, ENUM_ORDER_TYPE type, double entry, double sl, double risk_money); double TOG_MaxVolume(string symbol, ENUM_ORDER_TYPE type, double share); ENUM_ORDER_TYPE_FILLING TOG_FillingMode(string symbol); int TOG_CheckMarket(string symbol, ENUM_ORDER_TYPE type); int TOG_CheckStops(string symbol, ENUM_ORDER_TYPE type, double price, double sl, double tp); int TOG_CheckFreeze(ulong ticket); int TOG_Preflight(string symbol, ENUM_ORDER_TYPE type, double volume, double price, double sl, double tp); ulong TOG_Open(string symbol, ENUM_ORDER_TYPE type, double volume, double price, double sl, double tp, ulong magic, string comment); bool TOG_Modify(ulong ticket, double price, double sl, double tp); bool TOG_Close(ulong ticket, double volume); int TOG_CloseAll(string symbol, long magic, bool pending); int TOG_ProcessQueue(); int TOG_QueueCount(); void TOG_ClearQueue(); int TOG_LastReason(); uint TOG_LastRetcode(); string TOG_ReasonText(int reason); int TOG_RetcodeClass(uint retcode); int TOG_GetStats(long &stats[]); #import
原因代码
TOG_LastReason 返回代码,TOG_ReasonText 返回大写文本。
- 0 OK;1 NO CHANGE(数值相同,未发送);2 DEFERRED(已排队)。
- -1 BAD PARAMETERS:未知品种或类型、挂单价格为 0、手数为 0。
- -2 NO CONNECTION:断线或无报价。
- -3 TRADING DISABLED:Algo Trading 或账户交易被关闭。
- -4 SYMBOL MODE:品种禁用、仅平仓、仅做多或仅做空。
- -5 MARKET CLOSED:不在交易时段内。
- -6 INVALID VOLUME:超出最小/最大值、不符合步长或超过手数上限。
- -7 INVALID STOPS:SL、TP 或挂单价格方向错误或处于止损水平之内。
- -8 FREEZE ZONE:价格处于冻结水平之内。
- -9 NO MARGIN:市价单保证金超过可用保证金。
- -10 ORDER TYPE BLOCKED:订单类型或 SL/TP 不被允许,或已达挂单数量上限。
- -11 ORDERCHECK FAILED 与 -12 SERVER REJECTED:见 TOG_LastRetcode。
- -13 TICKET NOT FOUND;-14 QUEUE FULL(已有 256 个等待)。
API 参考
type:ORDER_TYPE_BUY、ORDER_TYPE_SELL、ORDER_TYPE_BUY_LIMIT、ORDER_TYPE_SELL_LIMIT、ORDER_TYPE_BUY_STOP 或 ORDER_TYPE_SELL_STOP(stop-limit 返回 -1)。价格为绝对价格;sl 或 tp 为 0 表示不设置。
TOG_Configure
deviation:滑点点数,0 或以上(无效值:20)。retries:0-10(无效值:3)。delay_ms:重试间隔 0-5000 毫秒(无效值:300)。adjust_stops:true 时,方向正确但处于止损水平之内的 SL/TP 会被移到最近的合法价格再加一个跳动点(若服务器仍拒绝,再加点差);false 时返回 -7。verbose:以前缀 [TOG] 记录阻止、重试和延迟操作。
TOG_NormalizeVolume
按手数步长向下取整并限制在最大值内。低于最小值、手数为 0 或品种未知时返回 0.0。
TOG_NormalizePrice
按跳动单位和小数位取整。价格为 0 时返回 0.0,因此空的 SL 保持为 0。
TOG_RiskVolume
在 sl 处亏损 risk_money(账户货币)的手数,用 OrderCalcProfit 计算(适用于交叉盘、贵金属、指数、股票),向下取整。entry 为 0 时,买入类型用 Ask,卖出类型用 Bid。最小手数风险已超出时返回 0.0 并设 -6,sl 方向错误为 -7,输入无效为 -1。
double lots = TOG_RiskVolume(_Symbol, ORDER_TYPE_BUY, 0, sl, AccountInfoDouble(ACCOUNT_BALANCE) * 0.01);
TOG_MaxVolume
保证金不超过 可用保证金 x share(0-1,否则按 1)的最大有效手数,同时不超过最大手数和剩余手数上限。连最小手数都放不下时返回 0.0 并设 -9。
TOG_FillingMode
市价成交方式:允许时用 FOK,否则 IOC,否则 RETURN。若服务器拒绝,TOG_Open 会自动切换。
TOG_CheckMarket
开仓的第 1-4 道闸门:连接与报价、Algo Trading、该方向的品种模式、交易时段(服务器时间对照时段表;无时段表视为开市)。返回 0 或 -1 至 -5。
TOG_CheckStops
市价单:sl 和 tp 位于 Bid(买入)或 Ask(卖出)的正确一侧,且距离不小于 SYMBOL_TRADE_STOPS_LEVEL。挂单:挂单价格与市场的关系同理,sl 和 tp 以挂单价格计算。返回 0、-7、-1 或 -2。
TOG_CheckFreeze
当 Bid(买入)或 Ask(卖出)距持仓 SL 或 TP 在 SYMBOL_TRADE_FREEZE_LEVEL 之内,或市场同样接近挂单价格时返回 -8。冻结水平为 0 时返回 0,未知订单号返回 -13。
TOG_Preflight
按顺序执行全部 9 道闸门且不发送:市场闸门、订单类型标志与挂单上限、手数、止损止盈、保证金(市价单)、OrderCheck。返回第一个失败原因或 0。
if(TOG_Preflight(_Symbol, ORDER_TYPE_SELL, 0.10, 0, sl, tp) != 0) Print(TOG_ReasonText(TOG_LastReason()));
TOG_Open
规范手数和价格,按设置调整止损止盈,执行 TOG_Preflight 后发送。市价单(price 为 0)遇到重新报价、价格变动、超时和连接错误时以新价格重试。挂单使用 GTC,不允许 GTC 时用 DAY。返回持仓号(市价)、订单号(挂单)或 0。开仓从不排队。
TOG_Modify
修改持仓的 SL/TP,或挂单的价格/SL/TP(price 为 0 保持原价)。数值相同:返回 true,原因 1。被冻结区、休市或断线阻止:返回 false,原因 2,并排队;同一订单号的新调用会替换旧的。
TOG_Close
平掉持仓或删除挂单。volume 为 0 或等于全部手数时全部平仓;更小则部分平仓(向下取整);剩余低于最小手数时全部平仓。阻止情况同上:false,原因 2,排队(替换排队中的修改)。
TOG_CloseAll
对符合 symbol("" = 全部)和 magic(-1 = 任意)的每个持仓(pending 为 true 时也包括挂单)调用 TOG_Close。返回本次已平数量。
TOG_ProcessQueue
阻止解除后发送队列中的操作;请在 OnTick 或 OnTimer 中调用。操作在成功、订单号消失或其他失败时离开队列;服务器拒绝后等待一秒。返回完成数量。
TOG_QueueCount 与 TOG_ClearQueue
等待中的操作数(最多 256);不发送而清空全部。
TOG_LastReason、TOG_LastRetcode 与 TOG_ReasonText
上一次调用的原因;服务器最后的返回码(未发送时为 0);原因代码的文本(否则为 "UNKNOWN")。
TOG_RetcodeClass
0 DONE(已下单、已成交、部分成交、无变化、持仓已平),1 RETRY(重新报价、拒绝、错误、超时、价格变动或无效、无报价、请求过多、锁定、连接),2 FIX(无效请求、手数、止损止盈、到期、成交方式、订单),3 WAIT(休市、冻结),4 FATAL(其他,如资金不足)。
TOG_GetStats
向 stats[] 填入 10 个计数器并返回 10:0 请求,1 已发送,2 已完成,3 已阻止,4 重试,5 已延迟,6 队列完成,7 被拒绝,8 已调整止损,9 已丢弃。
完整集成示例
#import "Turnstile_Order_Gateway.ex5"
double TOG_RiskVolume(string symbol, ENUM_ORDER_TYPE type, double entry, double sl, double risk_money);
ulong TOG_Open(string symbol, ENUM_ORDER_TYPE type, double volume, double price, double sl, double tp, ulong magic, string comment);
bool TOG_Close(ulong ticket, double volume);
int TOG_ProcessQueue();
int TOG_LastReason();
string TOG_ReasonText(int reason);
#import
ulong ticket = 0;
bool tried = false;
void OnTick()
{
TOG_ProcessQueue();
if(!tried)
{
tried = true;
double sl = SymbolInfoDouble(_Symbol, SYMBOL_BID) - 300 * _Point;
double lots = TOG_RiskVolume(_Symbol, ORDER_TYPE_BUY, 0, sl, 10.0);
ticket = TOG_Open(_Symbol, ORDER_TYPE_BUY, lots, 0, sl, 0, 7001, "turnstile");
Print("open ", ticket, ": ", TOG_ReasonText(TOG_LastReason()));
}
if(ticket > 0 && PositionSelectByTicket(ticket) && PositionGetDouble(POSITION_PROFIT) > 5.0)
Print("close: ", TOG_Close(ticket, 0), " ", TOG_ReasonText(TOG_LastReason()));
} 架构与说明
- 每个导入本库的程序都有各自的设置、统计和内存队列(移除 EA 或重启终端后丢失)。
- 检查函数只读取终端数据;只有 TOG_Open、TOG_Modify、TOG_Close、TOG_CloseAll 和 TOG_ProcessQueue 会同步发送请求。
- 推荐设置:验证安全 = 默认设置并在 OnTick 中调用 TOG_ProcessQueue;严格止损 = adjust_stops false;开发调试 = verbose true 并在面板显示 TOG_GetStats。
- MetaTrader 5,净额与对冲账户,任意品种;仅限 EA 和脚本。可安全用于策略测试器、优化和 MQL5 Cloud Network(无 DLL、文件、网络请求;测试器中不暂停重试)。
- 不创建图表对象、定时器、文件或全局变量;为获取报价可能把品种加入市场报价窗口。
- 时段表中缺失的节假日会根据服务器回复识别为 -5。
- 不支持:stop-limit 订单、close-by、OrderSendAsync。
风险提示
本库检查并发送您的代码提出的请求。它不决定入场,也不保证成交、价格或盈利。请先在模拟账户上测试。
