Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
rexover
114
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: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
Olegs Kucerenko
12137
Olegs Kucerenko  

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

double maxVol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);

 

Alexander Laur
8052
Alexander Laur  
rexover:

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

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

......

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

Как быть ?

 Если Вы эту ошибку получаете на Чемпионатном счете, то все правильно. Объем одиночного ордера не может превышать 5.0 лотов. Для того, чтобы закрыть 7.0 лотов, Вам нужно отправить два отдельных запроса на закрытие: 5.0 лотов и 2.0 лота.
Валерий
1433
Валерий  
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);
.....

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

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


Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий