MQL4 - automated forex trading   /  

Форум

Сравнение вещественных чисел

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

avatar
127
Sergo 16.10.2006 21:33 
Уважаемые разработчики!

Ответьте, пожалуйста, на такой вопрос. Корректно ли проверять равенство двух чисел типа double после их нормализации функцией NormalizeDouble до одинакового количества знаков после запятой?

Дело в том, что функция, приводящая оба числа к целому виду перед сравнением, которая используется у меня в эксперте, занимает довольно много процессорного времени. Хотелось бы сделать максимально быстро, но правильно. Что посоветуете?

Конечно, при каждом тике в реал-тайме это малозаметно. Но тестер начинает довольно долго рассчитывать при моделировании. Хочется писать как можно более грамотнее. Так мне приятнее как программисту.

Очень надеюсь на ответ!

Бесплатная Groupware для групп разработчиков

Установите систему групповой работы TeamWox и объедините усилия всех разработчиков. Это поможет вашей команде работать быстрее и организованнее. Благодаря TeamWox станет намного проще ставить задачи и контролировать их выполнение.


avatar
Модератор
3651
Renat 16.10.2006 22:17 
Лучше всего сравнивать дельту после вычитания или делать сравнение на допустимую дельту. У нас в стандартной поставке в stdlib.mq4 есть специальная функция:

//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }

avatar
127
Sergo 16.10.2006 22:22 
Всё предельно ясно!

Спасибо!

avatar
21
alex_ant 21.08.2008 22:17 
Renat писал (а) >>
Лучше всего сравнивать дельту после вычитания или делать сравнение на допустимую дельту. У нас в стандартной поставке в stdlib.mq4 есть специальная функция:

Значит ли это, что вместо цифры 8 в NormalizeDouble можно указать встроенную переменную Digits, привязав тем самым точность вычисления к используемой валютной паре?


Например так:

bool Equal(double FirstValue, double SecondValue) {
    if (NormalizeDouble(FirstValue - SecondValue, Digits) == 0) {
        return(true);
    } else {
        return(false);
    }
}

Смогу ли я с помощью этой функции сравнивать к примеру StopLoss разных ордеров, и при этом забыв о разрядности различных валютных пар?


avatar
21
alex_ant 21.08.2008 22:34 

Я тут немного развил тему... пригодно ли это для использования?


bool Equal(double FirstValue, double SecondValue) {
    if (NormalizeDouble(FirstValue - SecondValue, Digits) == 0) {
        return(true);
    } else {
        return(false);
    }
}
 
bool LessOrEqual(double FirstValue, double SecondValue) {
    if ((FirstValue < SecondValue) || Equal(FirstValue, SecondValue)) {
        return(true);
    } else {
        return(false);
    }
}
 
bool GreaterOrEqual(double FirstValue, double SecondValue) {
    if ((FirstValue > SecondValue) || Equal(FirstValue, SecondValue)) {
        return(true);
    } else {
        return(false);
    }
}
 
bool Less(double FirstValue, double SecondValue) {
    if ((FirstValue < SecondValue) && !Equal(FirstValue, SecondValue)) {
        return(true);
    } else {
        return(false);
    }
}
 
bool Greater(double FirstValue, double SecondValue) {
    if ((FirstValue > SecondValue) && !Equal(FirstValue, SecondValue)) {
        return(true);
    } else {
        return(false);
    }
}
К списку тем  

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