【问题标题】:How to close a trade for sure in MQL4/MT4?如何在 MQL4/MT4 中确定关闭交易?
【发布时间】:2019-06-27 06:53:19
【问题描述】:

我有一个在按钮点击时关闭交易的 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(),但文档说您不需要为 MarketInfo 这样做。

我已经没有什么想法了。为什么会发生这种情况以及如何避免这种情况?我正在 FXCM Demo 上测试它(如果是这样的话)。

【问题讨论】:

  • 您可以使用OrderClosePrice()代替出价或询价。最好的方法似乎是尝试多次关闭票证,如果失败 - 之后是 Sleep(25)RefreshRates()
  • OrderClosePrice() 等于我在失败时使用的 Bid/Ask

标签: mql4 metatrader4 forex mt4


【解决方案1】:

首先确保您已正确选择订单,并尽可能使用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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • Ask/Bid 是缓存值。基本上,MarketInfo 等于 RefreshRates() + Ask/Bid。当它失败时,Ask/Bid 等于我用来关闭交易的价格。
    猜你喜欢
    • 2016-08-14
    • 2017-09-29
    • 2014-10-21
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2021-02-22
    相关资源
    最近更新 更多