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

 
komposter:

А в упрощенном виде она работает так же быстро как и ComparePrice:
Зато не так точно :)
При разнице величин в Point в половине случаев будет давать ложный результат.

И, вообще, при чем здесь упрощенный вид? ComparePrice в усложненном виде может работать так же медленно, как и неупрощенный equal.
 
Irtron:
Integer:

Для начала напишите несколько экспертов на заказ, прочувствуйте на себе бурю заказчика от того что вдруг стоплосс оказался на 1 пункт не там где на надо... И потом им объясняйте про нелепость функции NormalizeDouble(), интересно как это у вас получится=)

Открою секрет.
Я написал намного больше экспертов на заказ, чем нужно для начала. Бурю заказчика не чувствовал никогда, потому что ни разу не давал повода. Стоплосс в моих программах гарантированно находится (а не "оказывается") там, где надо. Соответственно, и объяснять заказчику ничего такого не приходится, тем более про какую-то там весьма специфичную функцию. Мне как раз кажется, что смысл написания советника на заказ и заключается в избавлении заказчика от подобных вопросов и объяснений.

И как он у вас гарантированно находится там где надо без функции NormalizeDouble()? И как вы освобождаете себя от объяснений бех использования NormalizeDouble()?
 
Irtron:
VBAG:
А оказалось, что даже цену взятую с сервера со своего ордера все-равно надо нормалайзить!!!
Это вряд ли. Потроха МТ занормалайзены уже почти дальше некуда.
Разговоров было и есть много про непонятную работу советника при тестировании на непонятно каких исторических данных.
Точно, некорректная история была, вспомнил. Но для тестера оказалось критичным отсутствие нормалайза. Да ни суть.
А как Вы с индикаторными даблами справляетесь при сравнении с 0 и т.д.без нормалайза. Очень интересно.
 
VBAG:
А как Вы с индикаторными даблами справляетесь при сравнении с 0 и т.д.без нормалайза. Очень интересно.
Не поверите :)
    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");
 
Irtron:
VBAG:
А как Вы с индикаторными даблами справляетесь при сравнении с 0 и т.д.без нормалайза. Очень интересно.
Не поверите :)
    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");
Ну, да... - это понятненько. Я так понял Ваш подход, что в каждой конкретной ситуации ищется наиболее простое решение.


 
VBAG посмотрите этот скрипт
int start()
  {
//----
string str;
bool ok1,ok2;
   for(int i=0;i<10;i++){
      double NotNormPrice_1=StrToDouble("1.1111"+i);
         for(int j=0;j<10;j++){
            double NotNormPrice_2=StrToDouble("1.1111"+j);
               if(NormalizeDouble(NotNormPrice_1,4)==NormalizeDouble(NotNormPrice_2,4)){
                  str="Metod 1: "+DoubleToStr(NotNormPrice_1,5)+" = "+DoubleToStr(NotNormPrice_2,5)+" ";
                  ok1=true;
               }                 
               else{
                  str="Metod 1: "+DoubleToStr(NotNormPrice_1,5)+" != "+DoubleToStr(NotNormPrice_2,5)+" ";
                  ok1=false;
               }
               if(NormalizeDouble(NotNormPrice_1-NotNormPrice_2,4)==0.0){
                  str=str+"Metod 2: "+DoubleToStr(NotNormPrice_1,5)+" = "+DoubleToStr(NotNormPrice_2,5);
                  ok2=true;
               }         
               else{
                  str=str+"Metod 2: "+DoubleToStr(NotNormPrice_1,5)+" != "+DoubleToStr(NotNormPrice_2,5);                
                  ok2=false;
               }
            if(ok1!=ok2)Print(str);
         }
   }
//----
   return(0);
  }

и результаты его работы

09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11111 != 1.11115 Metod 2: 1.11111 = 1.11115
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11111 != 1.11116 Metod 2: 1.11111 = 1.11116
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11112 != 1.11115 Metod 2: 1.11112 = 1.11115
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11112 != 1.11116 Metod 2: 1.11112 = 1.11116
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11112 != 1.11117 Metod 2: 1.11112 = 1.11117
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11113 != 1.11115 Metod 2: 1.11113 = 1.11115
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11113 != 1.11116 Metod 2: 1.11113 = 1.11116
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11113 != 1.11117 Metod 2: 1.11113 = 1.11117
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11115 Metod 2: 1.11114 = 1.11115
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11116 Metod 2: 1.11114 = 1.11116
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11117 Metod 2: 1.11114 = 1.11117
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11118 Metod 2: 1.11114 = 1.11118
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11119 Metod 2: 1.11114 = 1.11119
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11115 != 1.11111 Metod 2: 1.11115 = 1.11111
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11115 != 1.11112 Metod 2: 1.11115 = 1.11112
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11115 != 1.11113 Metod 2: 1.11115 = 1.11113
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11115 != 1.11114 Metod 2: 1.11115 = 1.11114
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11116 != 1.11111 Metod 2: 1.11116 = 1.11111
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11116 != 1.11112 Metod 2: 1.11116 = 1.11112
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11116 != 1.11113 Metod 2: 1.11116 = 1.11113
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11116 != 1.11114 Metod 2: 1.11116 = 1.11114
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11117 != 1.11112 Metod 2: 1.11117 = 1.11112
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11117 != 1.11113 Metod 2: 1.11117 = 1.11113
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11117 != 1.11114 Metod 2: 1.11117 = 1.11114
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11118 != 1.11114 Metod 2: 1.11118 = 1.11114
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11119 != 1.11114 Metod 2: 1.11119 = 1.11114

Решайте сами, какая арифметика вам больше нравится.

При определении пересечения линии индикатора (например МА) с ценой (типа Цена_Сейчас>MA_Сейчас и Предыдущяя_Цена<=Предыдущая_МА) обязательно надо делать нормализацию до 8 знаков.

 
Integer:

обязательно надо делать нормализацию до 8 знаков.


Нет, ну почему до 8-ми? :) Есть еще 7, 9, или 6. Некоторые берут 4.
Правда, почему именно 8? Каков критерий?
 
VBAG:
Я так понял Ваш подход, что в каждой конкретной ситуации ищется наиболее простое решение.

Поправочка. Наиболее подходящее и, по возможности, эффективное. К сожалению, далеко не всегда оказывается простым.
 
Irtron:
Integer:

обязательно надо делать нормализацию до 8 знаков.


Нет, ну почему до 8-ми? :) Есть еще 7, 9, или 6. Некоторые берут 4.
Правда, почему именно 8? Каков критерий?

Допустим

цена = 1.1111

ма = 1.11110001

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

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

 
Irtron:

    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");

Такой метод проходит. Пока никто не замечал возникающей погрешности))