Domanda ai maestri di MQL4. Di nuovo a proposito di Double Compare. - pagina 3

 
komposter:

E in forma semplificata, funziona velocemente come ComparePrice:
Ma non così preciso :)
Se i valori differiscono di un punto, darà risultati falsi la metà delle volte.

E cosa c'entra la modalità semplificata? ComparePrice in forma semplificata può essere lento come l'uguale non semplificato.
 
Irtron:
Intero:

Per prima cosa, scrivi qualche Expert Advisors sul tuo ordine, senti la tempesta di un cliente che improvvisamente lo stop-loss era 1 punto sbagliato... E poi spiegare loro l'assurdità della funzione NormalizeDouble(), mi chiedo come funzionerà per voi=)

Lasciate che vi dica un segreto.
Ho scritto molti più Expert Advisor personalizzati di quelli necessari per iniziare e non ho mai sentito il bisogno di comprarli perché non ho mai dato motivo di farlo. Nei miei programmi, lo stoploss è garantito per essere (e non "appare") dove dovrebbe essere. Di conseguenza, non devo spiegare niente del genere al cliente, specialmente su qualche funzione molto specifica. Mi sembra che l'intero scopo di scrivere un EA sia quello di sbarazzarsi di tali domande e spiegazioni per il cliente.

E come può essere localizzato in modo affidabile dove dovrebbe essere senza la funzione NormalizeDouble()? E come ci si libera dalle spiegazioni senza usare NormalizeDouble()?
 
Irtron:
VBAG:
E si scopre che anche il prezzo preso dal server dal tuo ordine deve ancora essere normalizzato!!!
Questo è improbabile. Le budella di MT sono già quasi oltre la normalizzazione.
Si è parlato e si parla molto di prestazioni incomprensibili dell'Expert Advisor quando viene testato su dati storici incomprensibili.
Esattamente, c'era una storia sbagliata, ricordo. Ma era la mancanza di normalizzazione che era critica per il tester. Qualunque cosa.
E come si fa a trattare con gli indicatori dub quando si confronta con 0 ecc. senza normalizzare. Molto interessante.
 
VBAG:
E come si fa a trattare con gli indicatori dub quando si confronta con 0 ecc. senza normalizzare. Molto interessante.
Non ci crederete :)
    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 come si fa a trattare con gli indicatori dub quando si confronta con 0 ecc. senza normalizzare. Molto interessante.
Non ci crederete :)
    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ì, beh... - è comprensibile. Ho capito il tuo approccio, che in ogni situazione specifica si cerca la soluzione più semplice.


 
VBAG guarda questo 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);
  }

e i risultati del suo lavoro

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

Decidete voi stessi quale aritmetica preferite.

Quando si determina l'incrocio della linea dell'indicatore (per esempio MA) con il prezzo (del tipo Price_Now>MA_Now e Previous_Price<=Previous_MA), bisogna sempre normalizzare a 8 cifre.

 
Integer:

è obbligatorio normalizzare a 8 cifre.


No, perché fino a 8? :) C'è anche un 7, un 9 o un 6. Alcune persone vanno per 4.
Davvero, perché un 8? Quali sono i criteri?
 
VBAG:
Capisco il tuo approccio di cercare la soluzione più semplice in ogni situazione.

Correzione. La più adatta e, se possibile, efficace. Purtroppo, non è sempre la più facile.
 
Irtron:
Intero:

è obbligatorio normalizzare a 8 cifre.


No, perché fino a 8? :) C'è anche un 7, un 9 o un 6. Alcune persone vanno per 4.
Davvero, perché un 8? Quali sono i criteri?

Supponiamo che

prezzo = 1,1111

ma = 1,11110001

Se si normalizza a 8 cifre, ma>prezzo è corretto. Normalizzando ad un numero inferiore di cifre, essi saranno uguali - errati. In questo modo si ottiene la massima precisione.

La normalizzazione a 9 cifre non funziona. È come se il prezzo avesse 9 cifre e l'indicatore ne avesse 8 o viceversa (non ricordo), insomma è coperto dal mistero dell'ignoto.

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

Questo metodo passa. Finora, nessuno ha notato il margine di errore risultante).
Motivazione: