Округление (обрезка) значения размера лота

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Sergey
169
Sergey  

Доброго времени суток. 

Пишу блок расчета мани-менеджмента на MQL5. Возникла сложность с округлением рассчитанного лота до второго знака. NormalizeDouble не помогает. Прошу подсказать решение задачи.

double LotMin       = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);          // объем минимального лота 
 double LotMax       = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);          // объем максимального лота 
 double LotStep      = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);         // минимальный шаг изменения объема для заключения сделки
 double PricePoint_EURUSD = 0.10; // мин. стоимость 1 пункта
 double PricePoint_USDJPY = 0.09; // мин. стоимость 1 пункта
 int risk = 3;
 int SL =  17;
 double lot = 0;

 lot = AccountInfoDouble(ACCOUNT_BALANCE) * risk / 100 / SL; // стоимость 1 пункта относительно заданного % риска и размера стоп-лосса
 
 if (_Symbol == "EURUSD")
 {
  lot = NormalizeDouble(lot / PricePoint_EURUSD,2);
 }
 else
  lot = NormalizeDouble(lot / PricePoint_USDJPY,2);
  
  lot = NormalizeDouble((lot * LotStep),2);
Sergey
169
Sergey  
Renat Akhtyamov
15715
Renat Akhtyamov  

Print("lot="+lot);

что выводит?

Sergey
169
Sergey  
Sergey
169
Sergey  
Renat Akhtyamov:

Print("lot="+lot);

что выдает?

0.050000000000000003. Нужно получить 0.05

Renat Akhtyamov
15715
Renat Akhtyamov  
Sergey:

0.050000000000000003. Нужно получить 0.05

это понятно

почему то не происходит нормализация...

не факт, но попробовать можно следующее:

if (_Symbol == "EURUSD")
 {
  lot = NormalizeDouble(lot / PricePoint_EURUSD,2);
 }
 else
{
  lot = NormalizeDouble(lot / PricePoint_USDJPY,2);
}
  
  lot = NormalizeDouble((lot * LotStep),2);
Print(_Symbol+" lot="+lot);

Интересно, что выведет в принт?
Nikolai Semko
6551
Nikolai Semko  
Sergey:

0.050000000000000003. Нужно получить 0.05

С точки зрения типа double это и есть 0.05:
https://ru.m.wikipedia.org/wiki/Число_двойной_точности
Число в дробной части (точнее в мантиссе) может быть дробно значению 2 в степени  минус 52=2,2204460493e-16
Поэтому ошибки нет. Так и должно быть.
Dmitiry Ananiev
9278
Dmitiry Ananiev  

А как же вариации на тему 

MormalixeDouble (NormalizeDouble (((lot * 100,0) )/100)/100,2) ? 

А еще можно в цикле замутить сравнение double пока не будет равно ! 

Sergey
169
Sergey  
Renat Akhtyamov:

это понятно

почему то не происходит нормализация...

не факт, но попробовать можно следующее:

Интересно, что выведет в принт?

Проверить получится только завтра, когда рынок начнет работать. По результату отпишусь

Renat Akhtyamov
15715
Renat Akhtyamov  
Dmitiry Ananiev:

А как же вариации на тему 

MormalixeDouble (NormalizeDouble (((lot * 100,0) )/100)/100,2) ? 

А еще можно в цикле замутить сравнение double пока не будет равно ! 

еще интереснее сравнить

if(0.05 == NormalizeDouble(lot,2))

все таки так не должно быть по моему, т.к. условие не будет работать

Renat Akhtyamov
15715
Renat Akhtyamov  
Sergey:

Проверить получится только завтра, когда рынок начнет работать. По результату отпишусь

тестер же есть
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий