Ошибка закрытия ордера

 

Скажите а есть отдельная команда по закрытию позиции или только встречная позиция?

Ситуация: есть позиция sell  7 лотов , есть профит положительный, пытаемся закрыть, выполняется код

         MqlTradeRequest MtRequest={0};
         MqlTradeResult MtResult={0};

         MtRequest.action= TRADE_ACTION_DEAL;
         MtRequest.magic = 888;
         MtRequest.symbol = symbol;
         MtRequest.volume = vol;
         MtRequest.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
         MtRequest.deviation=3;
         MtRequest.type=ORDER_TYPE_BUY;
         MtRequest.type_filling=ORDER_FILLING_FOK;
 
         if(!OrderSend(MtRequest,MtResult))
           {
            return(false);
           }



и получаем ошибку 2012.01.12 01:55:00   failed instant buy 7.00 EURUSD at 1.27108 [Invalid volume]

Как быть ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 

Проверить максимальный разрешенный объем ордера.

double maxVol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);

 

 
rexover:

Скажите а есть отдельная команда по закрытию позиции или только встречная позиция?

Ситуация: есть позиция sell  7 лотов , есть профит положительный, пытаемся закрыть, выполняется код

         MqlTradeRequest MtRequest={0};
         MqlTradeResult MtResult={0};

         MtRequest.action= TRADE_ACTION_DEAL;
         MtRequest.magic = 888;
         MtRequest.symbol = symbol;
         MtRequest.volume = vol;
         MtRequest.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
         MtRequest.deviation=3;
         MtRequest.type=ORDER_TYPE_BUY;
         MtRequest.type_filling=ORDER_FILLING_FOK;
 
         if(!OrderSend(MtRequest,MtResult))
           {
            return(false);
           }



и получаем ошибку 2012.01.12 01:55:00   failed instant buy 7.00 EURUSD at 1.27108 [Invalid volume]

Как быть ?


Такой команды в MQL5 функциях нет. Все торговые операции выполняются одной функцией: OrderSend() с предварительным заполнением структуры MqlTrade Request. Программист должен сам контролировать на валидность все заполняемые параметры. Либо за него это сделает выполняемая по умолчанию терминалом и сервером функция OrderCheck() с указанием кода ошибки, при неверно заданных параметрах.

Но можно закрыть позицию одной командой, если воспользоваться стандартным классом CTrade. Метод этого класса PositionClose()

#include <Trade\Trade.mqh>
CTrade trade;
.....
// Закрытие позиции:
trade.PositionClose(symbol);
.....

сделает за Вас всю необходимую работу: разобьёт позицию на допустимые объёмы в сделке и закроет её по частям.

Вообще, стандартные классы сильно облегчают жизнь программисту, избавляя его от излишней головной боли и экономя его время.


Причина обращения: