Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Простите, не понял Вас. Поясните, пожалуйста.
:-) Найдите какой-нибудь серьезный справочник по математике, почитайте про методы округления.
Результаты округления я приводил ранее:
SimpleRoundTo(0.33265,-4) результат: 0.3326
SimpleRoundTo(0.33245,-4) результат: 0.3325
При неизменном RoundMode.
Соответственно, непонятно, что Вы имели ввиду: "Такой метод округления - если последняя пятерка, четные вниз, нечетные вверх"
Простите, не понял Вас. Поясните, пожалуйста.
:-) Найдите какой-нибудь серьезный справочник по математике, почитайте про методы округления.
Результаты округления я приводил ранее:
SimpleRoundTo(0.33265,-4) результат: 0.3326
SimpleRoundTo(0.33245,-4) результат: 0.3325
При неизменном RoundMode.
Соответственно, непонятно, что Вы имели ввиду: "Такой метод округления - если последняя пятерка, четные вниз, нечетные вверх"
Ранее было вот так
SimpleRoundTo(0.33265,-4) результат: 0.3326
NormalizeDouble(0.33265,4) результат: 0.3327
Да, я объединил информацию из двух постов.
AlexanderD 18.04.2008 15:30правка | удалить
В большинстве случаев округляет верно, например:
SimpleRoundTo(0.33245,-4) результат:0.3325
Да, только NormalizeDouble() нет в C++, а имеющийся там SimpleRoundTo() некоторые значения округляет не по правилам.
Я и просил подсказать аналог NormalizeDouble() для C++.
Спасибо.
Здравствуйте!
Подскажите, пожалуйста, функцию для округления в c++, такую же точную, как NormalizeDouble() в MQL.
Результат SimpleRoundTo в ряде случаев не совпадает с NormalizeDouble().
Спасибо!
double NormalizeDouble(double x, int precision)
{
int sign;
double power10, temp_x, result;
/* Determine the sign of x */
if (x < 0) sign = -1 ; else sign = 1 ;
if (precision >= 0) /* good precision */
{
power10 = pow(10.0, (double)precision);
/* Work with absolute value of x so that
floor can be used regardless of x's sign */
temp_x = fabs(x) * power10;
/* Adding the 0.5 causes the rounding */
result = sign * floor(temp_x + 0.5) / power10;
return(result);
}
else /* bogus precision */
{
printf("Error: negative precision\n");
return(x);
}
}
sam ispolzuju v testovix imitacijax - bezosibocno
Спасибо. Использовал этот принцип, но более простой вариант. К сожалению, слишком медленно работает.
В dll-эксперте много сравнений расчетных уровней цен и нужно часто округлять.
Спасибо. Использовал этот принцип, но более простой вариант. К сожалению, слишком медленно работает.
В dll-эксперте много сравнений расчетных уровней цен и нужно часто округлять.
Посмотрите вот сдесь https://forum.mql4.com/ru/8314/page5. Я как раз пытался оценить для себя порядок скорости работы разных конструкций.
Спасибо. Использовал этот принцип, но более простой вариант. К сожалению, слишком медленно работает.
В dll-эксперте много сравнений расчетных уровней цен и нужно часто округлять.
Посмотрите вот сдесь https://forum.mql4.com/ru/8314/page5. Я как раз пытался оценить для себя порядок скорости работы разных конструкций.
Jesli verit, sto predlozanaja v statje NormalizeDouble takaja ze pravilnaja kak moja, togda potverzdaju, sto moja funkcija medleneje.
Test provodil tak:
{
int factor = (int)round( pow(10.0, (double)digits) ); // factor - ??? ?????????,
//? ??????? ???????? ?? ?? VALUE ??????? ????? ?????
double result = round((double)factor * value) / (double)factor;
return(result);
}
{
clock_t rstart = clock();
fprintf( stdout, "rounding test\n" );
for( int i=0; i<10000000; i++ )
double res = NormalizeDouble( rand()%1000000 / clock(), 8 );
clock_t rfinish = clock();
double round_processing_time = ((rfinish - rstart)/(double)CLOCKS_PER_SEC)*1000;
fprintf( stdout, "Test took %.2f ms\n", round_processing_time );
}
{
clock_t rstart = clock();
fprintf( stdout, "rounding test\n" );
for( int i=0; i<10000000; i++ )
double res = OtherNormalizeDouble( rand()%1000000 / clock(), 8 );
clock_t rfinish = clock();
double round_processing_time = ((rfinish - rstart)/(double)CLOCKS_PER_SEC)*1000;
fprintf( stdout, "Test took %.2f ms\n", round_processing_time );
}
rounding test - my
Test took 5027.00 ms
rounding test - other
Test took 4767.00 ms
В dll-эксперте много сравнений расчетных уровней цен и нужно часто округлять.
???????? А что мешает взять модуль разности и сравнить с половинным размером пункта (0,5*Point) ?
Успехов.