Как точно закрыть сделку в MQL4 / MT4? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть советник, который закрывает сделку при нажатии кнопки

//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, все та же ошибка.Некоторые советники просто пытаются закрыть его несколько раз (и для меня это выглядит как взлом), но это тоже не помогает.Есть некоторые упоминания о том, что вам нужно вызвать RefreshRates () перед bid / ask, но в документации сказано, что вам не нужно делать это для MarketInfo.

У меня закончились идеи, что это может быть.Почему это может произойти и как этого избежать?Я тестирую его на демонстрации FXCM (если это так).

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Сначала убедитесь, что вы правильно выбрали ордер, и попробуйте использовать 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), чтобы закрыть ордер. См. Здесь

0 голосов
/ 27 июня 2019

Распечатайте и сравните Ask/Bid && price при closed!=true.Помните, что данные режима MarketInfo хранятся в предопределенных переменных Ask/Bid, поэтому вы можете исключить это, если вы OrderSelect в текущем символе.

...