如何检测MQL5中是否存在挂单?OrdersTotal返回0的问题
解决MQL5中OrdersTotal()返回0无法检测挂单的问题
首先明确:OrdersTotal()返回的是终端中所有可见订单的总数,但如果你的挂单没被统计到,大概率是以下原因之一,对应解决方案如下:
常见原因及修复
权限不足:终端未允许自动交易或程序未获得交易权限
打开终端菜单「工具 > 选项 > 交易」,勾选「允许自动交易」;运行EA/脚本时,确认弹出的权限请求弹窗选择允许。未筛选挂单类型:
OrdersTotal()包含已成交订单、挂单等所有订单,直接用它判断是否有挂单不准确
要单独统计挂单,需要遍历所有订单并筛选挂单类型,示例代码:int GetPendingOrderCount() { int pendingCount = 0; for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // 匹配所有挂单类型 if(type == ORDER_TYPE_BUY_LIMIT || type == ORDER_TYPE_SELL_LIMIT || type == ORDER_TYPE_BUY_STOP || type == ORDER_TYPE_SELL_STOP || type == ORDER_TYPE_BUY_STOP_LIMIT || type == ORDER_TYPE_SELL_STOP_LIMIT) { pendingCount++; } } } return pendingCount; }调用这个函数就能得到真实的挂单数量。
终端未显示目标订单:检查终端的「交易」标签,确认挂单确实存在且未被过滤(比如没有隐藏某类订单)。
品种匹配问题:如果你的挂单是在其他品种下,而程序默认只关注当前图表品种,需要在筛选时增加品种判断:
// 在挂单类型判断后追加 if(OrderSymbol() == _Symbol) { pendingCount++; }
额外注意事项
OrderSelect()必须指定MODE_TRADES参数,否则会默认遍历历史订单,而挂单属于当前交易订单。- 如果订单已成交、取消或过期,
OrdersTotal()不会再统计该订单。
内容的提问来源于stack exchange,提问作者Gabriele
相关产品推荐
相关产品推荐

