Вопрос к мастерам MQL4. Опять про Double Compare. - страница 4

 
Integer:
VBAG посмотрите этот скрипт
И Вы тоже по ночам работаете.., спасибо за поддержку, too mach information, теперь надо это все переварить.
 
Integer:

цена = 1.1111

ма = 1.11110001

При норамализации на 8 знаков ма>цены - правильно. При нормализации на меньшее количество знаков получится что равны - неправильно. Такми образом достигается максимальная точность.

Это шутка, да? :)
Вообще без нормализации ма > цены - тоже, ведь, правильно. Зачем достигать максимальной точности, если она уже есть, и уже заведомо больше достижимой?

Нормализация до 9 знаков не работает. Такое впечатление что у цены вроде как 9 знаков, а у индиктаора 8 или наоборот (не помню), короче покрыто тайной неизвестности.


Да, скорее всего, это в самой NormalizeDouble счетчик только до 8 знаков. Говорю же, нелепая функция, как ее не крути.
 
komposter:

А в упрощенном виде она работает так же быстро как и ComparePrice:
2007.09.10 03:19:24 CheckCompareDoubleSpeed GBPUSD,Daily: ComparePrice: 20922, equal: 20453
А в исходном виде просто песня :)
int start()
{
    double a, b;
    int start1, start2, end, c;
    
    a = 1.23450001;
    b = 1.23449999;
    
    start1 = GetTickCount();
    
    for (c = 100000000; c > 0; c--)
        ComparePrice(a, b);
    
    start2 = GetTickCount();
    
    for (c = 100000000; c > 0; c--)
        equal(a, b);
    
    end = GetTickCount();
 
    Print("ComparePrice: ", start2 - start1, ", equal: ", end - start2);
 
    return(0);
}
 
int ComparePrice(double a, double b)
{
    a -= b;
    b = Point / 2.;
    if (a > b)
        return (1);
    if (a < -b)
        return (-1);
    return (0);
}
 
bool equal(double value1, double value2, int precision = 8)
{
    return (NormalizeDouble(MathAbs(NormalizeDouble(value1, precision) - NormalizeDouble(value2, precision)), precision) < NormalizeDouble(MathPow(0.1, precision), precision));
}
2007.09.10 02:39:57 testScript USDJPYm,H4: ComparePrice: 23843, equal: 178704
Эх, зато у komposter'а машина лучше!
 
Irtron:
А в исходном виде просто песня :)
Ну да, за универсальность приходится платить.
Или ComparePrice тоже подходит для сравнения любых чисел с любой заданной точностью?
 
komposter:

Или ComparePrice тоже подходит для сравнения любых чисел с любой заданной точностью?
Ну конечно! Если точность известна, что как раз и имеет место при работе с торговыми величинами. Fixed point.
 
Irtron:
Ну конечно! Если точность известна, что как раз и имеет место при работе с торговыми величинами. Fixed point.
Согласен.
Только объяснять это надо многочисленным авторам тем "о сравнении double-ов".
Поэтому я и предложил _универсальный_ (но далеко не оптимальный) вариант сравнения.
И он работает. Медленно, но надежно. И во всех случаях.

А когда появится тема "Об оптимизации сравнения double-ов", тогда можно будет развить тему ;)
 

Нужна ли нормализация цен где-нибудь?

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

В ветке 'Ненормализованная история и открытие позиций' же написано следующее:

Renat 16.02.2007 10:01
Мы специально добавили принудительную нормализацию цены в торговых заявках, чтобы не слать на сервер заведомо ошибочные цены.
 
Хочу выразить огромную благодарность всем профи за ликбез!

Irtron, выбрал для себя Ваш вариант, ну очень он мне понравился. Чутка подправил для общих случаев, проверил - работает как часы:

int ComparePrice(double a, double b, double digit)
{
a -= b;
b = digit;
if (a > b)
return (1);
if (a < -b)
return (-1);
return (0);
}
Спасибо.
 
При digit=0 будут проблемы. Ктому же функция работает медленнее, чем однократный вызов NormalizeDouble()
 
Integer:
При digit=0 будут проблемы.

При любом digit будут проблемы. Я вообще не понял, что такое digit, и в чем смысл модификации.

Integer:
Ктому же функция работает медленнее, чем однократный вызов NormalizeDouble()
А еще она будет наверняка медленнее, чем MathAbs, 2+3, и т.д. :)

Что за тема сравнивать функции с разной функциональностью? То equal упрощенный (неработоспособный, правда), теперь вот NormalizeDouble.
Что и кому Вы хотите доказать такой откровенной... (слово поставьте сами)?