我如何才能 select 只有 Metatrader 4 上最后关闭的订单?

How can I select only the last closed order(s) on Metatrader 4?

现在我select只要有新的历史交易(定时器周期为 1 秒的 onTimer 处理程序),所有历史交易都使用循环:

/*
      3.) History Trades      
   */      

      static int historyTradesTotal=0;       
       if(OrdersHistoryTotal()==historyTradesTotal) return;
       historyTradesTotal = OrdersHistoryTotal();


         int i,hstTotal = OrdersHistoryTotal();
         string historical_trades = "";

         for(i=hstTotal; i >= 0; i--)
         {
     //---- check selection result
           if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;

           historical_trades = historical_trades +

              "historical_trades|" +
              version + "|" +
              DID + "|" +
              IntegerToString(AccountNumber()) + "|" +   
              IntegerToString(OrderTicket()) + "|" +
              TimeToString(OrderOpenTime(), TIME_DATE|TIME_SECONDS) + "|" +
              TimeToString(OrderCloseTime(), TIME_DATE|TIME_SECONDS) + "|" +
              IntegerToString(OrderType()) + "|" +
              DoubleToString(OrderLots(),2) + "|" +
              OrderSymbol() + "|" +
              DoubleToString(OrderOpenPrice(),5) + "|" +
              DoubleToString(OrderClosePrice(),5) + "|" +
              DoubleToString(OrderStopLoss(),5) + "|" +
              DoubleToString(OrderTakeProfit(),5) + "|" +
              DoubleToString(OrderCommission(),2) + "|" + 
              DoubleToString(OrderSwap(),2) + "|" +
              DoubleToString(OrderProfit(),2) + "|" +
              "<" + OrderComment() + ">|"; 
         }
}

那么现在我怎样才能 select 在最后一个 onTimer 事件之间关闭的订单,以避免在新订单一直关闭时循环遍历所有交易?

解决方案还应考虑在一秒内同时关闭两个或多个交易的罕见情况,例如..

这在 MQL4 中是不可能的。订单按其 ID 存储和返回,您不能应用自定义排序。所以你必须从最后一个开始遍历它们才能找到你需要的那个。另一种方法是将所有未结订单保存在 CArrayInt 或数组中(在新交易开始时添加,在找到关闭的交易时删除,在执行 init/deinit 时删除 read/write)并检查 live_trades_array 元素仍然打开。如果您的 ea 只有几个订单并且平台上有几个不同的 ea,那可能会快得多。

  int i = OrdersHistoryTotal(); 
  int a = OrdersHistoryTotal() - 10;
  int b = OrdersHistoryTotal();
   
  for (i = a;i < b ;i++)
     {
           if (OrderSelect(i,SELECT_BY_POS, MODE_HISTORY) == true)
              {      
                
                 Alert("orders found"+ OrderTicket() + " " + OrderCloseTime());
              
              }
     }

此代码有效,它从历史上上一个订单的第 10 个订单开始,但如果您只想检查上一个订单,您可以在 int a 中用 10 代替 1。如果您只想检查最后 5 个订单,请将 10 更改为 5。简单。