Pergunta para os mestres da MQL4. Novamente sobre Double Compare. - página 3

 
komposter:

E, de forma simplificada, funciona tão rápido quanto o ComparePrice:
Mas não tão preciso :)
Se os valores diferirem por ponto, isso dará resultados falsos pela metade do tempo.

E o que o modo simplificado tem a ver com isso de qualquer maneira? O ComparePrice de forma simplificada pode ser tão lento quanto o igual não simplificado.
 
Irtron:
Inteiro:

Primeiro, escreva alguns Expert Advisors em seu próprio pedido, sinta a tempestade de um cliente que de repente o stop-loss estava 1 ponto errado... E então explique sobre o absurdo da função NormalizeDouble(), eu me pergunto como isso funcionará para você=)

Deixe-me contar-lhe um segredo.
Escrevi muito mais Expert Advisors personalizados do que o necessário para começar. Nunca senti a necessidade de comprá-los porque nunca dei nenhuma razão para isso. A perda de tempo em meus programas é garantida (e não "aparece") onde deveria estar. Assim, não tenho que explicar nada do tipo para o cliente, especialmente sobre alguma função muito específica. Parece-me que o objetivo de escrever uma EA é se livrar de tais perguntas e explicações para o cliente.

E como pode ser localizado de forma confiável onde deveria estar sem a função NormalizeDouble()? E como você se livra de explicações sem usar o NormalizeDouble()?
 
Irtron:
VBAG:
E acontece que mesmo o preço retirado do servidor de seu pedido ainda precisa ser normalizado!!!
Isso é improvável. As tripas da MT já estão quase além da normalização.
Houve e há muitas conversas sobre o desempenho incompreensível do consultor especializado quando testado em dados históricos incompreensíveis.
Exatamente, havia uma história incorreta, eu me lembro. Mas era a falta de normalização que era crítica para o testador. Tanto faz.
E como você lida com os dubs indicadores quando comparados a 0 etc. sem normalizar. Muito interessante.
 
VBAG:
E como você lida com os dubs indicadores quando comparados a 0 etc. sem normalizar. Muito interessante.
Você não vai acreditar :)
    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:
E como você lida com os dubs indicadores quando comparados a 0 etc. sem normalizar. Muito interessante.
Você não vai acreditar :)
    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");
Sim, bem... - isso é compreensível. Entendi sua abordagem, que em cada situação específica se busca a solução mais simples.


 
VBAG olhe para este roteiro
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);
  }

e os resultados de seu trabalho

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

Decida por si mesmo qual aritmética você prefere.

Ao determinar o cruzamento da linha indicadora (por exemplo MA) com o preço (do tipo Price_Now>MA_Now e Previous_Price<=Previous_MA), você deve sempre normalizar para 8 dígitos.

 
Integer:

é obrigatório normalizar para 8 dígitos.


Não, por que até 8? :) Há também um 7, 9, ou 6. Algumas pessoas optam por 4.
Realmente, por que um 8? Quais são os critérios?
 
VBAG:
Entendo sua abordagem para buscar a solução mais simples em cada situação.

Correção. O mais adequado e, se possível, eficaz. Infelizmente, nem sempre é o mais fácil.
 
Irtron:
Inteiro:

é obrigatório normalizar para 8 dígitos.


Não, por que até 8? :) Há também um 7, 9, ou 6. Algumas pessoas optam por 4.
Realmente, por que um 8? Quais são os critérios?

Suponha que

preço = 1.1111

ma = 1.11110001

Se você normalizar para 8 dígitos, ma>preço está correto. Normalizando para um número menor de dígitos os tornará iguais - incorretos. Desta forma, obtém-se a máxima precisão.

A normalização para 9 dígitos não funciona. É como se o preço tivesse 9 dígitos e o acusador tivesse 8 ou vice-versa (não me lembro), em suma, é coberto pelo mistério do desconhecido.

 
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!");

Este método passa. Até agora, ninguém notou a margem de erro resultante).