Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2548

 
Vitaly Muzichenko #:

Как округлить число к ближайшему лоту?

Задача получить меньшее

0.0151 = 0.01

0.0192 = 0.01

0.0201 = 0.02

0.0349 = 0.03

Так не получается

Срезать лишнее после сотых?

Задача:

На каждые 5000 депозита при лоте 0.01, повышать лот на 0.01

Сейчас при росте баланса до 7501, лот получается 0.02, а нужен 0.01, пока баланс не станет 10000

double lots = NormalizeDouble(MathFloor(0.0151/lotStep)*lotStep,2);
Так?
 
Vitaly Muzichenko #:

Как округлить число к ближайшему лоту?

Задача получить меньшее

0.0151 = 0.01

0.0192 = 0.01

0.0201 = 0.02

0.0349 = 0.03

Так не получается

Срезать лишнее после сотых?

Задача:

На каждые 5000 депозита при лоте 0.01, повышать лот на 0.01

Сейчас при росте баланса до 7501, лот получается 0.02, а нужен 0.01, пока баланс не станет 10000

P.S. Наверное как решение, подойдёт

Используйте функцию MathFloor() или просто floor().

/********************************************************************/
double NormalizePrice(double price, string symbol = NULL)
 {
  symbol = symbol == NULL ? _Symbol : symbol;
  double p = price;
  double tickStep = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
  p = floor(price/tickStep)*tickStep;
  return(p);
 }/******************************************************************/
 
Vitaly Muzichenko #:
  double lotStep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);   double lots = NormalizeDouble(0.0151/lotStep,0)*lotStep; // Print = 0.02
  double lotStep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
  double lots = NormalizeDouble(0.0151/lotStep-lotStep/2,0)*lotStep;
 
Alexey Viktorov #:

Используйте функцию MathFloor() или просто floor().

Выдал не то

NormalizePrice(0.0151,NULL) // 0.015
 
Tretyakov Rostyslav #:

Также не тот результат, выдал 0.02

  double lotStep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
  double lots = NormalizeDouble(0.0151/lotStep-lotStep/2,0)*lotStep;
 
Aleksey Nikolayev #:
Так?

Да, работает правильно

 
Vitaly Muzichenko #:

Да, работает правильно

Ещё так можно

   double x = 0.012;
   x = double(int(x * 100)) / 100; // 0.01
Тут даже нормализация не нужна. Но это не точно.
 
Vitaly Muzichenko #:

Выдал не то

А зачем NULL? Параметр по умолчанию указывать не надо.

double lot = NormalizePrice(0.0151);

Да, извини. Это функция для нормализации цен, а не лотов.

Вот эта для лотов.

/********************************************************************/
double NormalizePrice(double price, string symbol = NULL)
 {
  symbol = symbol == NULL ? _Symbol : symbol;
  double p = price;
  double tickStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
  p = floor(price/tickStep)*tickStep;
  return(p);
 }/******************************************************************/
 
Aleksandr Slavskii #:

У него задача немного другая. Ну я понял, что ему не надо нормализовать лот. У него задача округлить его до сотых.

... в меньшую сторону

Это вроде как выполняет задачу

nLot = int(AccountInfoDouble(ACCOUNT_BALANCE)/5000)*0.01
 
Vitaly Muzichenko #:

... в меньшую сторону

Это вроде как выполняет задачу

Возможно, но она не соответствует поставленному изначально вопросу.

Задача получить меньшее

0.0151 = 0.01

0.0192 = 0.01

0.0201 = 0.02

0.0349 = 0.03

Мой ответ, отвечает на этот вопрос. Ваш нет)))