Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1147

 
Vladimir Karputov:

Вот так:


Ещё важно то, как Вы обновляете цены (и обновляете ли вообще?). Спред - как Вы его получаете? 

    double point, price, ask, bid;
    ulong digits;

    if(!SymbolInfoDouble(symbol, SYMBOL_ASK, ask)) return(true);
    if(!SymbolInfoDouble(symbol, SYMBOL_ASK, bid)) return(true);
    if(!SymbolInfoInteger(symbol, SYMBOL_DIGITS, digits)) return(true);
    if(!SymbolInfoDouble(symbol, SYMBOL_POINT, point)) return(true);
SymbolInfoInteger(symbol, SYMBOL_SPREAD);
 
Mikhail Sergeev:

Так, на будущее:

1.SymbolInfoDouble

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

2. Спред лучше брать как разницу Ask и Bid 

3. Уровень заморозки: ищите из трёх значений (SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_STOPS_LEVEL и вычисленный спред) максимальное и умножаете на три и будет счастье.

Пункт 3 был на практике выведен при работе с КодоБазой (а валидатор и в КодоБазе и в Маркете одинаковый).
Документация по MQL5: Получение рыночной информации / SymbolInfoDouble
Документация по MQL5: Получение рыночной информации / SymbolInfoDouble
  • www.mql5.com
2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром. Если функция используется для получения информации о последнем тике, то лучше использовать SymbolInfoTick(). Вполне возможно, что по данному символу с...
 
Vladimir Karputov:

Так, на будущее:

1.SymbolInfoDouble

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

2. Спред лучше брать как разницу Ask и Bid 

3. Уровень заморозки: ищите из трёх значений (SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_STOPS_LEVEL и вычисленный спред) максимальное и умножаете на три и будет счастье.

Пункт 3 был на практике выведен при работе с КодоБазой (а валидатор и в КодоБазе и в Маркете одинаковый).

Большое спасибо! Сейчас внесу изменения и попробую.

 
Mikhail Sergeev:

Большое спасибо! Сейчас внесу изменения и попробую.

Да, будет интересен результат.

 
Vladimir Karputov:

Да, будет интересен результат.

Проблему решил! Всё очень просто оказалось, для удаления ордера надо обязательно заполнять: request.symbol

Я не нашёл никакой структурированной информации, по тому какие данные надо обязательно передавать в request в зависимости от типа торговой операции. И использовал пример   https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions 

Там этого нет.


Проверил множество вариантов с заморозкой. В моём случае одинарного размера оказалось достаточно.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Торговля осуществляется посредством отправки с помощью функции OrderSend() приказов на открытие позиций, а также приказов на установку, модификацию и удаление отложенных ордеров. Каждый торговый приказ содержит указание на тип запрашиваемой торговой операции. Торговые операции описаны в перечислении ENUM_TRADE_REQUEST_ACTIONS...
 
Mikhail Sergeev:

Проблему решил! Всё очень просто оказалось, для удаления ордера надо обязательно заполнять: request.symbol

Я не нашёл никакой структурированной информации, по тому какие данные надо обязательно передавать в request в зависимости от типа торговой операции. И использовал пример   https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions 

Там этого нет.


Проверил множество вариантов с заморозкой. В моём случае одинарного размера оказалось достаточно.

Зачем такие сложности? Используйте торговый класс CTrade.

 
Vladimir Karputov:

Зачем такие сложности? Используйте торговый класс CTrade.

К сожалению это ещё с МТ4 тянется. Адаптировать было проще.


Насчёт CTrade -  я особо в ней не разбирался, но вроде как везде где нужно указывать символ, он есть в параметрах передаваемых методу. А в методе OrderDelete(const ulong ticket) его нет, так что это не сработает. Надо заранее где-то заполнять request.symbol.

 
Mikhail Sergeev:

К сожалению это ещё с МТ4 тянется. Адаптировать было проще.


Насчёт CTrade -  я особо в ней не разбирался, но вроде как везде где нужно указывать символ, он есть в параметрах передаваемых методу. А в методе OrderDelete(const ulong ticket) его нет, так что это не сработает. Надо заранее где-то заполнять request.symbol.

Что не сработает то? Это торговый класс: устанавливает, модифицирует и удаляет ОТЛОЖЕННЫЕ ОРДЕРА, открывает, модифицирует и закрывает ПОЗИЦИИ.

Абсолютно всё работает. И пишется всё в одну строку любая торговая команда.


CTrade

Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade
  • www.mql5.com
Стандартная библиотека / Торговые классы / CTrade - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

Что не сработает то? Это торговый класс: устанавливает, модифицирует и удаляет ОТЛОЖЕННЫЕ ОРДЕРА, открывает, модифицирует и закрывает ПОЗИЦИИ.

Абсолютно всё работает. И пишется всё в одну строку любая торговая команда.


CTrade

//+------------------------------------------------------------------+
//| Delete specified pending order                                   |
//+------------------------------------------------------------------+
bool CTrade::OrderDelete(const ulong ticket)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- clean
   ClearStructures();
//--- setting request
   m_request.action    =TRADE_ACTION_REMOVE;
   m_request.magic     =m_magic;
   m_request.order     =ticket;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

Значит я просто не понимаю в какой момент заполняется m_request.symbol

Ну да ладно, вопрос решён. Ещё раз огромное спасибо за помощь!

 
Mikhail Sergeev:

Значит я просто не понимаю в какой момент заполняется m_request.symbol

Ну да ладно, вопрос решён. Ещё раз огромное спасибо за помощь!

Пройдитесь отладчиком по CTrade и увидите где же подевался символ :)

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