Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2548 1...254125422543254425452546254725482549255025512552255325542555...2747 Новый комментарий Aleksey Nikolayev 2025.02.20 09:07 #25471 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);Так? Alexey Viktorov 2025.02.20 09:28 #25472 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); }/******************************************************************/ Tretyakov Rostyslav 2025.02.20 10:30 #25473 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; Vitaly Muzichenko 2025.02.20 16:00 #25474 Alexey Viktorov #: Используйте функцию MathFloor() или просто floor(). Выдал не то NormalizePrice(0.0151,NULL) // 0.015 Vitaly Muzichenko 2025.02.20 16:02 #25475 Tretyakov Rostyslav #: Также не тот результат, выдал 0.02 double lotStep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP); double lots = NormalizeDouble(0.0151/lotStep-lotStep/2,0)*lotStep; Vitaly Muzichenko 2025.02.20 16:06 #25476 Aleksey Nikolayev #: Так? Да, работает правильно Aleksandr Slavskii 2025.02.20 16:13 #25477 Vitaly Muzichenko #: Да, работает правильно Ещё так можно double x = 0.012; x = double(int(x * 100)) / 100; // 0.01Тут даже нормализация не нужна. Но это не точно. Alexey Viktorov 2025.02.20 16:13 #25478 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); }/******************************************************************/ Vitaly Muzichenko 2025.02.20 16:18 #25479 Aleksandr Slavskii #: У него задача немного другая. Ну я понял, что ему не надо нормализовать лот. У него задача округлить его до сотых. ... в меньшую сторону Это вроде как выполняет задачу nLot = int(AccountInfoDouble(ACCOUNT_BALANCE)/5000)*0.01 Aleksandr Slavskii 2025.02.20 16:24 #25480 Vitaly Muzichenko #: ... в меньшую сторону Это вроде как выполняет задачу Возможно, но она не соответствует поставленному изначально вопросу. Задача получить меньшее 0.0151 = 0.01 0.0192 = 0.01 0.0201 = 0.02 0.0349 = 0.03 Мой ответ, отвечает на этот вопрос. Ваш нет))) 1...254125422543254425452546254725482549255025512552255325542555...2747 Новый комментарий
Как округлить число к ближайшему лоту?
Задача получить меньшее
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
Как округлить число к ближайшему лоту?
Задача получить меньшее
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 lotStep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP); double lots = NormalizeDouble(0.0151/lotStep,0)*lotStep; // Print = 0.02
Используйте функцию MathFloor() или просто floor().
Выдал не то
Также не тот результат, выдал 0.02
Так?
Да, работает правильно
Да, работает правильно
Ещё так можно
Тут даже нормализация не нужна. Но это не точно.Выдал не то
А зачем NULL? Параметр по умолчанию указывать не надо.
Да, извини. Это функция для нормализации цен, а не лотов.
Вот эта для лотов.
У него задача немного другая. Ну я понял, что ему не надо нормализовать лот. У него задача округлить его до сотых.
... в меньшую сторону
Это вроде как выполняет задачу
... в меньшую сторону
Это вроде как выполняет задачу
Возможно, но она не соответствует поставленному изначально вопросу.
Задача получить меньшее
0.0151 = 0.01
0.0192 = 0.01
0.0201 = 0.02
0.0349 = 0.03
Мой ответ, отвечает на этот вопрос. Ваш нет)))