如何在MQL4 / MT4中确定平仓交易?

时间:2019-06-27 06:53:19

标签: mql4 metatrader4 forex mt4

我有一个EA,可以通过单击按钮关闭交易

//void CloseCurrentTrade(). It's called after successfull OrderSelect
int orderType = OrderType();
double price;
if (orderType == OP_BUY)
    price = return MarketInfo(OrderSymbol(), MODE_BID);
else if (orderType == OP_SELL)
    price = return MarketInfo(OrderSymbol(), MODE_ASK);
else
    return;
int slippage = 20;
bool closed = OrderClose(OrderTicket(), OrderLots(), price, slippage);
if (closed)
    return;
int lastError = GetLastError();

有时它会关闭交易,有时会返回错误#129(无效价格)。我不知道为什么。大多数情况下,人们只是滥用出价/要价或没有内漏。我尝试使用滑差最大200,仍然是相同的错误。某些EA只是尝试将其关闭几次(对我来说,这似乎是一个hack),但它也无济于事。有人提到您需要在买/卖之前调用RefreshRates(),但是documentaion表示您不需要为MarketInfo这样做。

我已经没有足够的想法了。为什么会发生以及如何避免呢?我正在FXCM演示版上进行测试(如果是这样)。

2 个答案:

答案 0 :(得分:3)

首先请确保您已正确选择订单,然后尝试在可能的情况下使用OrderClosePrice(这样就无需检查OP_SELL / OP_BUY

//+------------------------------------------------------------------+
//| Close the latest order for this current symbol                   |
//+------------------------------------------------------------------+
void CloseCurrentTrade()
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderMagicNumber()!=MagicNum) continue; // if there is no magic number set, then no need for this(manual orders)
      if(OrderType()>OP_SELL) continue;

      if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage))
         Print("Error in Closing the Order, Error : ",ErrorDescription(GetLastError()));

      break; // assuming you want to close the latest trade only, exit the order closing loop
     }
  }

还请注意,您的经纪人可能对收市价必须与开仓价和其他水平(sl / tp)之间的距离有限制,以便平仓。 Refer here

答案 1 :(得分:0)

Ask/Bid时打印并比较price和&closed!=true。请注意,MarketInfo模式数据已经存储在Ask/Bid个预定义变量中,因此如果您OrderSelect使用当前符号,则可以消除这种情况。