简体   繁体   中英

How to close a trade for sure in MQL4/MT4?

I have an EA with closes a trade on button click

//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();

Sometimes it closes the trade and sometimes it returns error #129 (Invalid price). I can't figure out why. Most of the cases people just misuse bid/ask or don't have enouth slippage. I've try to use slippage up to 200, still the same error. Some EA's just try to close it several times (and it looks like a hack for me), but it does not help as well. There are some mentions that you need to call RefreshRates() before bid/ask, but documentaion says that you don't need to do that for MarketInfo.

I've run out of ideas what it could be. Why it can happen and how to avoid that? I'm testing it on FXCM Demo (if it is the case).

First make sure that you've selected the order properly, and try to use OrderClosePrice where possible(this will eliminate the need for checking the 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
     }
  }

Also note that your broker might have restrictions on how far the closing price must be from the Order Opened price and other levels(sl/tp), in order to close an order. Refer here

Print and compare Ask/Bid && price when closed!=true . Beware that MarketInfo mode data is stored at Ask/Bid predefined variables already, so you can eliminate that if you OrderSelect in current symbol.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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