Математическое округление. - страница 6

 
double GetLotClose(double lot)
{
  double clot = 0;
  while(clot<lot)
  {
    clot+=0.25; 
  }
  
  clot-=0.25;
return (clot);
}
Не проверял, но должно работать быстро.  И код более понятный.
Вставить вместо NormalizeDouble  - GetLotClose
 
double NormalizeVolume(double fVolume,string fSymbol=NULL,bool fMinIsAlways=true){
   double lotStep=SymbolInfoDouble(fSymbol,SYMBOL_VOLUME_STEP),
          lotMax=SymbolInfoDouble(fSymbol,SYMBOL_VOLUME_MAX),
          lotMin=SymbolInfoDouble(fSymbol,SYMBOL_VOLUME_MIN);
   int lotDigits=-(int)MathFloor(MathLog10(lotStep));
   if (lotDigits<0) lotDigits=0;
   double x=MathPow(10,lotDigits);
   fVolume=MathFloor(MathRound(fVolume/lotStep*x)/x)*lotStep;
   if (fVolume<lotMin) return fMinIsAlways?lotMin:0.0;
   else if (fVolume>lotMax) return lotMax;
   else return NormalizeDouble(fVolume,lotDigits);}
Как-то так.
 
на самом деле терминал на хреново округлённый лот не ругается, главное чтоб он был больше или равен минимальному и меньше максимального, не проверял на счёт разрешённого шага, но на четвёрке - съест без ошибки и 3 и 5 знаков после запятой в лоте - это кстати очень сильно влияет на пример на расчёт мартингейла в серии потому как терминал некорректный лот сам не округляет, а просто отрезает всё лишнее, точнее округляет всегда в меньшую сторону, лучше бы терминал такой самодеятельностью не занимался
 
Aleksey Semenov:
на самом деле терминал на хреново округлённый лот не ругается, главное чтоб он был больше или равен минимальному и меньше максимального, не проверял на счёт разрешённого шага, но на четвёрке - съест без ошибки и 3 и 5 знаков после запятой в лоте - это кстати очень сильно влияет на пример на расчёт мартингейла в серии потому как терминал некорректный лот сам не округляет, а просто отрезает всё лишнее, точнее округляет всегда в меньшую сторону, лучше бы терминал такой самодеятельностью не занимался

Ну, так это защита от дураков... Как иначе?

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