繁体   English   中英

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

[英]How to close a trade for sure in MQL4/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演示版上进行测试(如果是这种情况)。

首先,请确保您已正确选择订单,并尝试在可能的情况下使用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)相差的限制,以便平仓。 请参考这里

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM