Pregunta a los maestros del MQL4. De nuevo sobre la doble comparación. - página 3

 
komposter:

Y en forma simplificada, funciona tan rápido como ComparePrice:
Pero no es tan preciso :)
Si los valores difieren en un punto, dará resultados falsos la mitad de las veces.

¿Y qué tiene que ver el modo simplificado con esto? ComparePrice en forma simplificada puede ser tan lento como igual sin simplificar.
 
Irtron:
Entero:

Primero, escribe unos cuantos Asesores Expertos en tu propia orden, siente la tormenta de un cliente que de repente el stop-loss estaba 1 punto mal... Y luego explícales lo absurdo de la función NormalizeDouble(), me pregunto cómo te funcionará=)

Déjame contarte un secreto.
He escrito muchos más Asesores Expertos personalizados de los necesarios para empezar. Nunca he sentido la necesidad de comprarlos porque nunca he dado ninguna razón para hacerlo. En mis programas, se garantiza que el stoploss está (y no "parece") donde debe estar. Por lo tanto, no tengo que explicar nada de eso al cliente, especialmente sobre alguna función muy específica. Me parece que el objetivo de escribir un EA es librarse de esas preguntas y explicaciones para el cliente.

¿Y cómo se puede localizar de forma fiable donde debe estar sin la función NormalizeDouble()? ¿Y cómo te liberas de las explicaciones sin usar NormalizeDouble()?
 
Irtron:
VBAG:
¡¡¡Y resulta que incluso el precio tomado del servidor de su pedido todavía necesita ser normalizado!!!
Eso es poco probable. Las tripas de la MT están casi más que normalizadas.
Hubo y hay muchas conversaciones sobre el rendimiento incomprensible del Asesor Experto cuando se prueba con datos históricos incomprensibles.
Exactamente, había una historia incorrecta, lo recuerdo. Pero fue la falta de normalización lo que resultó crítico para el probador. Lo que sea.
Y cómo se hace con los doblajes de los indicadores cuando se comparan con 0, etc., sin normalizar. Muy interesante.
 
VBAG:
Y cómo se trata el tema de los doblajes de los indicadores cuando se compara con 0, etc., sin normalizar. Muy interesante.
No te lo vas a creer :)
    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:
Y cómo se trata el tema de los doblajes de los indicadores cuando se compara con 0, etc., sin normalizar. Muy interesante.
No te lo vas a creer :)
    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");
Sí, bueno... - es comprensible. He entendido su planteamiento, que en cada situación concreta se busca la solución más sencilla.


 
VBAG mira este script
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);
  }

y los resultados de su trabajo

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

Decide tú mismo qué aritmética prefieres.

Cuando se determina el cruce de la línea del indicador (por ejemplo MA) con el precio (del tipo Precio_Actual>MA_Actual y Precio_Anterior<=MAAnterior), siempre se debe normalizar a 8 dígitos.

 
Integer:

es obligatorio normalizar a 8 dígitos.


No, ¿por qué bajar a 8? :) También hay un 7, un 9 o un 6. Algunos van por 4.
De verdad, ¿por qué un 8? ¿Cuáles son los criterios?
 
VBAG:
Entiendo su planteamiento de buscar la solución más sencilla en cada situación.

Corrección. La más adecuada y, a ser posible, eficaz. Por desgracia, no siempre es la más fácil.
 
Irtron:
Entero:

es obligatorio normalizar a 8 dígitos.


No, ¿por qué hasta 8? :) También hay un 7, un 9 o un 6. Algunos van por 4.
De verdad, ¿por qué un 8? ¿Cuáles son los criterios?

Supongamos que

precio = 1,1111

ma = 1,11110001

Si se normaliza a 8 dígitos, ma>price es correcto. La normalización a un número menor de dígitos los hará iguales - incorrectos. De esta manera se consigue la máxima precisión.

La normalización a 9 dígitos no funciona. Es como si el precio tuviera 9 dígitos y el indicador 8 o viceversa (no lo recuerdo), en definitiva está cubierto por el misterio de lo desconocido.

 
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 pasa. Hasta ahora, nadie ha notado el margen de error resultante).
Razón de la queja: