如何在MQL4/MT4中确定成交?

如何在MQL4/MT4中确定成交?,mql4,metatrader4,forex,mt4,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) pri

我有一个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只是尝试关闭它几次(对我来说,这看起来像是一个黑客),但它也没有帮助。有人提到,您需要在出价/出价之前调用RefreshRates(),但文档中说,对于MarketInfo,您不需要这样做


我已经想不出会是什么了。为什么会发生,如何避免?我正在FXCM演示上测试它(如果是这样的话)。

打印并比较
Ask/Bid
&&
price
关闭时=正确
。请注意,
MarketInfo
模式数据已存储在
Ask/Bid
预定义变量中,因此,如果您在当前符号中选择
OrderSelect
,则可以消除该情况。

关闭时打印并比较
Ask/Bid
价格
=正确
。请注意,
MarketInfo
模式数据已经存储在
Ask/Bid
预定义变量中,因此如果您在当前符号中选择了
OrderSelect
,则可以消除该情况。

首先确保您正确选择了订单,并尽可能使用
orderscloseprice
(这样就无需检查
OP\u SELL
/
OP\u BUY


还要注意的是,您的经纪人可能会限制收盘价必须与订单开盘价和其他级别(sl/tp)相差多远,以便关闭订单。

首先确保您正确选择了订单,并尽可能使用
OrderClosePrice
(这样就无需检查
OP\u SELL
/
OP\u BUY


还要注意的是,您的经纪人可能会限制收盘价与订单开盘价和其他级别(sl/tp)之间的距离,以关闭订单。

您可以使用
OrderClosePrice()
而不是出价或要价。如果失败-
Sleep(25),最好的方法似乎是尝试多次关闭票据
RefreshRates()
之后。OrderClosePrice()等同于我在失败时使用的出价/询问。您可以使用
OrderClosePrice()
而不是出价或询问。如果失败-
睡眠(25)
RefreshRates()
之后,最好的方法似乎是尝试多次关闭票据。OrderClosePrice()等于失败时我使用的出价/询问sk/Bid是缓存值。基本上,MarketInfo等于RefreshRates()+Ask/Bid。失败时,Ask/Bid等于我用来成交的价格。Ask/Bid是缓存值。基本上,MarketInfo等于RefreshRates()+询问/出价。当它失败时,询问/出价等于我用来结束交易的价格。
//+------------------------------------------------------------------+
//| 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
     }
  }