Invalid Stops - страница 2

 
Vladimir Karputov:

Сейчас посмотрю реализацию метода 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));
  }

то есть, когда считается Sl и TP нужно просто применять NormalizePrice, а не NormalizeDouble и проблем не будет.
 

да именно так получается, я долго бился над этой проблемой и ни кто толком не знал тогда. затем появился этот метод в СБ
 

У меня получилось, да. Но можете пожалуйста объяснить еще 1 вещь.
Я изменяю SL на 5, а значение меняется на 10. В чем может быть проблема?


_Point = 1.0
TickSize = 0;
StopsLevel = 0;

Через отладчик
slOld = 103050.0
stloss = 103060.0

      double slOld = m_position.StopLoss();
      double stloss = NormalizePrice(_Symbol,m_position.StopLoss() + 5*_Point); //--- Stop Loss
P.s. меняю на 10, меняется тоже на 10.

Я понял, что у инструмента есть TRADE_TICK_SIZE = 10. Поэтому и через 10 кидает.
 

Цена округляется с учётом квантования TickSize.

Для чего это нужно: если TickSize==10, то стоп вроде 11568 будет неверным, а вот стоп 11560 и 11570 будут правильными.

 
Fresto:
Можно ли как-то график настроить, чтобы справа по вертикали были цены округленные? 
Нет, нельзя.
 
Vladimir Karputov:
Нет, нельзя.
Тогда понятно) Спасибо большое!
 

Спасибо за ответы по этой теме, но посмотрела решение и оказалось что просто округление не подходит 

double _NormalizeDouble(const double price, const string symbol, bool is_up, const int dig){
   static double ts = 0; 
   if(ts==0) ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   
   double pr = price;
   if(ts!=0) pr = (is_up?MathFloor(pr/ts):MathCeil(pr/ts))*ts; 
   return(NormalizeDouble(pr, dig));}

is_up  - зависит от уровня (ТП или СЛ) и от типа ордера

 
Galina Bobro:

Спасибо за ответы по этой теме, но посмотрела решение и оказалось что просто округление не подходит 

is_up  - зависит от уровня (ТП или СЛ) и от типа ордера

Вроде бы все верно. Разве что интуитивно читается, что если is_up равно true, то ожидается округление вверх. А по коду выходит, что округление вниз.

Также может быть, что информация по размеру тика не получена (ts равно нулю). Тогда приведение к размеру тика не произойдет.

 

А смысл в таких заморочках?

Самый простой способ:

double NormalizePrice(double price)
  {
         return(NormalizeDouble(MathRound(price/_Point)*_Point,_Digits));
  }
Причина обращения: