Invalid price при установке ордера, с чего бы?

 

Иногда в журнале вижу такую ошибку. Меня это удивляет т.к. цены нормализованы, и, соот-но в этом всё чётко. Стопы тоже проверяю все, хотя.. если бы было дело в стопах, ошибка была бы другой.

Вот у меня нормализуется цена:

//==================================================================================================================================================================================
// Заполнение структуры торгового запроса(m_request) для операции orderSend(). =====================================================================================================
void OrdersHandling :: setMqlTradeRequestToPut(const string symbolName, const ENUM_ORDER_TYPE type, const ulong magic, const double lot, const double price, const double stopLimit, const double SL, const double TP, const string comment) {
//---
  m_request.action = TRADE_ACTION_PENDING;
  m_request.symbol = symbolName;
  m_request.magic = magic;
  m_request.volume = lot;
  m_request.type = type;
  m_request.stoplimit = ND(stopLimit);
  m_request.price = ND(price);
  m_request.sl = ND(SL);
  m_request.tp = ND(TP);
  m_request.comment = comment;
}

Функция нормализации вот:

//==================================================================================================================================================================================
// 1.1 Нормализация числа с плавающей запятой по количеству знаков торгового инструмента открытого графика. ========================================================================
double ND(const double valueToNormalize) export {    // Значение для нормализации
//---
  return NormalizeDouble(valueToNormalize, (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS));
}

В чём причина может быть?

 
Viktar Dzemikhau:

В чём причина может быть?

Каждая цена должна быть кратна TickSize.

double CorrectPrice( const string Symb, const double Price )
{
  const double TickSize = MathMax(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE), SymbolInfoDouble(Symb, SYMBOL_POINT));
  
  return(NormalizeDouble(((int)(Price / TickSize + 0.1)) * TickSize, (int)SymbolInfoInteger(Symb, SYMBOL_DIGITS)));
}
 
fxsaber:

Каждая цена должна быть кратна TickSize.

Так я торгую отложками, а не рыночными ордерами. Каким боком кратность должна быть?

 
Viktar Dzemikhau:

Иногда в журнале вижу такую ошибку. Меня это удивляет т.к. цены нормализованы, и, соот-но в этом всё чётко. Стопы тоже проверяю все, хотя.. если бы было дело в стопах, ошибка была бы другой.

Вот у меня нормализуется цена:

Функция нормализации вот:

В чём причина может быть?

Нормализация цены: CSymbolInfo -> NormalizePrice:

//+------------------------------------------------------------------+
//| Normalize price                                                  |
//+------------------------------------------------------------------+
double CSymbolInfo::NormalizePrice(const double price) const
  {
   if(m_tick_size!=0)
      return(NormalizeDouble(MathRound(price/m_tick_size)*m_tick_size,m_digits));
//---
   return(NormalizeDouble(price,m_digits));
  }
 
Viktar Dzemikhau:

Так я торгую отложками, а не рыночными ордерами. Каким боком кратность должна быть?

Таковы правила OrderCheck.

 
Viktar Dzemikhau:

Так я торгую отложками, а не рыночными ордерами. Каким боком кратность должна быть?

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

 

Получаю ошибку invalid price при попытке открытия позиции с рынка и использовании метода NormalizePrice. Не по всем инструментам. По большинству ошибки нет. Весь код приводить не буду, выложу тестовый скрипт для проверки.

#include <Trade\SymbolInfo.mqh>  
CSymbolInfo     m_symbol;       // symbol info object

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   double price=iClose(NULL,0,10);
   Print("   ***   price="+DoubleToString(price,5));
   Print("   ***   m_symbol.NormalizePrice(price)="+DoubleToString(m_symbol.NormalizePrice(price),5));

  }
//+------------------------------------------------------------------+

Результаты прогона.


Объясните чайнику в чем причина.

 
Grigori.S.B:

Получаю ошибку invalid price при попытке открытия позиции с рынка и использовании метода NormalizePrice. Не по всем инструментам. По большинству ошибки нет. Весь код приводить не буду, выложу тестовый скрипт для проверки.

Результаты прогона.


Объясните чайнику в чем причина.

Надо проинициализировать  m_symbol.Name(Symbol());

CSymbolInfo     m_symbol;
 
Grigori.S.B:

Получаю ошибку invalid price при попытке открытия позиции с рынка и использовании метода NormalizePrice. Не по всем инструментам. По большинству ошибки нет. Весь код приводить не буду, выложу тестовый скрипт для проверки.

Результаты прогона.


Объясните чайнику в чем причина.

В момент открытия нового бара все его цены (O,H,L,C) равны цене открытия. Цена открытия фиксируется сразу. Дальше начинается формирование бара: цены H, L, C фиксируются в момент его закрытия. Дальше думайте сами,- обнародованной Вами информации недостаточно. 

 
Давно хотел сказать - жутко неудобна стала документация. Проблема найти нужную функцию. Поиск мог бы исправить ситуацию. 
 
Алексей Тарабанов:

В момент открытия нового бара все его цены (O,H,L,C) равны цене открытия. Цена открытия фиксируется сразу. Дальше начинается формирование бара: цены H, L, C фиксируются в момент его закрытия. Дальше думайте сами,- обнародованной Вами информации недостаточно. 

Да нее, это ни при чём. Всё понятно там как я писал выше. У него цена до целого округлилась, значит m_digits там равен 0, т.к. не инициализирован  m_symbol