首页 > 解决方案 > 关闭订单时票证无效

问题描述

我正在尝试关闭所有打开的订单,它们都是 MarketOrders 而不是 PendingOrders,并且 SL 和 TP 设置为 0,因此它们不应该关闭自己(它们仍然在终端中打开)。我将门票存储在数组中,因此我的循环如下所示:

for(int i = 0; i < trades.size(); ++i) OrderClose(tickets[i], lots[i], Bid, Slippage);

但我仍然收到“无效票”错误,你能告诉我为什么吗?它并不总是发生,它就像一些订单被关闭并且一些抛出无效票。我没有注意到只有 1 个订单的这种行为,所以我假设它仅在有更多订单时才会发生。

代码:

template < typename T >
struct vector {
  vector() {}
  vector(int arraySize) {
     if (arraySize < 0) { arraySize *= -1; }
     ArrayResize(m_data, arraySize);
  }
  vector(vector & rhs) { 
     if (size() < rhs.size()) { ArrayResize(m_data, rhs.size()); }
     for(uint i = 0; i < size(); ++i) { m_data[i] = rhs.m_data[i]; }
  }
  vector operator=(vector & rhs) {
     if (size() < rhs.size()) { ArrayResize(m_data, rhs.size()); }
     for(uint i = 0; i < size(); ++i) { m_data[i] = rhs.m_data[i]; }
     return this;
  }
  T operator[](uint index) { return m_data[index]; }
  void push_back( T value ) {

     ArrayResize(m_data, ArraySize(m_data) + 1); 
     m_data[ ArraySize(m_data) - 1 ] = value;
  }
  uint size() { return ArraySize(m_data); }
  void resize(uint newSize) { ArrayResize(m_data, newSize); }
  void erase() {
     ZeroMemory(m_data);
     ArrayResize(m_data, 0);
  }
  void assign(uint index, T value) {
     m_data[index] = value;
  }
private:
  T m_data[];
};

string Buy(double lots) {
  string alertString = "";
  int __ticket;
  if ( (__ticket = OrderSend (Symbol(), OP_BUY, lots, Ask, Slippage, 0, 0, NULL, m_magic)) != -1 )
  {
     m_buyTicket.push_back( __ticket );
     m_buyLots.push_back( lots );
     m_buyPrice.push_back( Ask );
     m_buyAccel.push_back( lots / Lots );
     m_buyPos.push_back( 0 );

     alertString = "Buy function call." +
            "\nAsk\t= " + (string)Round(Ask) +
            "\nBid\t= " + (string)Round(Bid) +
            "\nLots\t= " + (string)Round(lots) +
            "\nSpread\t= " + (string)m_spread +
            "\nID\t= " + (string)CountAll();
  }
  else { 
     int _error = GetLastError();
     alertString = "Error " + (string)_error + "\n" + TranslateError( _error );
  }
  return alertString;
}

string CloseAll() {
  string alertString = "CloseAll function call.";
  // Buy closing
  for (uint i = 0; i < m_buyPrice.size(); ++i)
  {
     if ( OrderClose ( m_buyTicket[i], m_buyLots[i], Bid, Slippage) )
     {
        alertString += "\nBuy " + (string)(i+1) + " closed with profit " +
                       (string)Shrink ( (Bid - m_buyPrice[i]) * m_buyAccel[i] );
     }
     else
     {
        int _error = GetLastError();
        alertString += "\nError " + (string)_error + "\n" + TranslateError( _error ) +
                       "\n(while closing Buy " + (string)(i+1) + ")";
     }
  }
  // Sell closing
  for (uint i = 0; i < m_sellPrice.size(); ++i)
  {
     if ( OrderClose ( m_sellTicket[i], m_sellLots[i], Ask, Slippage) )
     {
        alertString += "\nSell " + (string)(i+1) + " closed with profit " +
                       (string)Shrink ( (m_sellPrice[i] - Ask) * m_sellAccel[i] );
     }
     else
     {
        int _error = GetLastError();
        alertString += "\nError " + (string)_error + "\n" + TranslateError( _error ) +
                       "\n(while closing Sell " + (string)(i+1) + ")";
     }
  }
  return alertString;
}

标签: mql4

解决方案


当您成功关闭一些工单时,您不会将其从列表中删除trades,对吗?看来你应该这样做。如果订单关闭成功,请使用您的结构清除元素。顺便说一句,可能不需要重新发明轮子,CArrayObj用作元素的容器并在订单关闭后删除它们。


推荐阅读