Как правильно нормализовать цену?

 

Банальное NormalizeDouble (), очевидно, не подойдет, если к примеру имеем символ что то типа такого:

point size

Как рассчитать SL и TP для такого символа с правильной нормализацией? Всё что приходит мне на ум не выглядит надежным.


Кстати, в подобных случаях спред терминал показывает неадекватно, так как в этом примере спред 1.

 
Andrey Dik:

Банальное NormalizeDouble (), очевидно, не подойдет, если к примеру имеем символ что то типа такого:

Как рассчитать SL и TP для такого символа с правильной нормализацией? Всё что приходит мне на ум не выглядит надежным.

//+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Приведение значения к точности одного тика                                                                                                                                               |
//+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
double NP(double fValue, double fTickSize)
{
   if (fTickSize == 0.0)
      return 0.0;
      
   return MathRound(fValue / fTickSize) * fTickSize;
}
 
NormalizeDouble(MathRound(value/tick_size)*tick_size,_Digits));
 
Ihor Herasko:
Alexander Bereznyak:

Спасибо!

и, концентрат, так сказать, будет выглядеть так:


//--- input parameters
input int      TP = 1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  int    digits   = (int)SymbolInfoInteger (Symbol (), SYMBOL_DIGITS);
  double tickSize = SymbolInfoDouble       (Symbol (), SYMBOL_TRADE_TICK_SIZE);

  Print ("----------");
  Print ("digits  :", digits);
  Print ("tickSize:", tickSize);
  
  MqlTick tick;
  SymbolInfoTick (Symbol (), tick);
  
  Print (DoubleToString (tick.ask, digits));
  Print (DoubleToString (NP (tick.ask + TP * tickSize, tickSize, digits), digits));
   
}
//+------------------------------------------------------------------+

double NP(double value, double tickSize, int digits)
{
   if (tickSize == 0.0)
      return 0.0;
      
   return NormalizeDouble (MathRound (value / tickSize) * tickSize, digits);
}
 

Есть ещё ришка c шагом 10, например. Для неё пришлось добавить

if (dTickSize > 1)
    value = ((int )value) / ((int )dTickSize) * ((int )dTickSize);