获取活跃订单列表

EA 交易程序通常需要列举现有的活跃订单并分析其特性。具体来说,在 挂单修改一节中的 PendingOrderModify.mq5 示例中,我们创建了一个特殊函数 GetMyOrder 来查找属于该 EA 交易的订单,以便进行修改。此处,通过交易品种名称和 EA 交易 ID (Magic) 进行分析。理论上,其方法与上一节删除挂单 PendingOrderDelete.mq5 的示例中使用的方法相同。

在后一种情况下,为了简单起见,我们创建了一个订单并将其订单号存储在一个全局变量中。但这在一般情况下是做不到的,因为 EA 交易和整个终端可以随时停止或重启。因此,EA 交易必须包含用于恢复内部状态的算法,包括对整个交易环境的分析以及订单、交易、仓位、账户余额等。

在本节中,我们将研究 MQL5 函数,该函数用于获取活跃订单列表,并在交易环境中选择其中任何一个订单,这样便可以读取其所有特性。

int OrdersTotal()

OrdersTotal 函数可返回当前活跃订单的数量。其中包括挂单以及尚未执行的市场订单。通常情况下,市场订单会被迅速执行,因此通常不可能在活动阶段捕捉到,但如果市场流动性不足,就会发生这种情况。一旦订单被执行(交易完成),它就会从活跃订单类别转移到历史中。我们将在单独的章节讨论如何使用订单历史。

请注意,只有订单可以分为活跃的和历史。这将订单与总是在历史中创建的交易以及仅在线存在的仓位显著区分开来。要恢复仓位的历史,应分析 交易的历史

ulong OrderGetTicket(uint index)

OrderGetTicket 函数可根据终端交易环境中订单列表中的订单编号返回订单号。index 参数必须介于 0 到 OrdersTotal()-1 的值之间。订单的组织方式没有规定。

OrderGetTicket 函数可选择一个订单,也就是说,将其有关的数据复制到某个内部缓存中,以便 MQL程序可以使用 OrderGetDoubleOrderGetIntegerOrderGetString 函数的后续调用来读取其所有特性,这将在 单独的章节中讨论。

存在这种缓存即表明从其接收的数据可能已过时:订单可能不再存在或可能已经被修改(例如,它可能具有不同的状态、开盘价、Stop LossTake Profit 水平以及到期)。因此,为了保证收到订单的相关数据,建议在请求数据之前立即调用 OrderGetTicket 函数。此处是在 PendingOrderModify.mq5 示例中的实现方法。

ulong GetMyOrder(const string nameconst ulong magic)
{
   for(int i = 0i < OrdersTotal(); ++i)
   {
      ulong t = OrderGetTicket(i);
      if(OrderGetInteger(ORDER_MAGIC) == magic
      && OrderGetString(ORDER_SYMBOL) == name)
      {
         return t;
      }
   }
   return 0;
}

每个 MQL 程序都有自己的缓存(交易环境上下文),其中包括选定的订单。在以下章节中,我们将了解到,除了订单之外,MQL 程序还可以将交易和订单的仓位和历史片段选择到活动上下文中。

OrderSelect 函数可执行类似的订单选择,并将其数据复制到内部缓存中。

bool OrderSelect(ulong ticket)

该函数可检查订单是否存在,并为进一步读取其特性做好准备。在这种情况下,订单不是由序列号指定的,而是由 MQL 程序必须以某种方式提前收到的订单号指定的,特别是作为执行 OrderSend/OrderSendAsync 的结果。

如果成功,则该函数返回 true。如果收到 false,通常意味着没有指定订单号的订单。最常见的原因是当订单状态从活动变为历史时,例如,作为执行或取消的结果(我们将在后面学习如何确定确切的状态)。可以使用 相关函数在历史中选择订单。

以前,我们使用 MqlTradeResultSync 结构体中的 OrderSelect 函数来跟踪挂单的 创建移除