Errori, bug, domande - pagina 2823

 
Nikolai Semko:

ha deciso di controllare la versione divagante della velocità.
E il risultato è stato sorprendente.
Il confronto anche del doppio pre-normalizzato è in media ancora più lento che se il doppio è confrontato attraverso l'epsilon o attraverso la conversione in int

Il risultato:

Non escludo che molto dipenda dalla novità e dall'architettura del processore e alcuni programmatori potrebbero ottenere un risultato diverso.

Sorprendentemente, la funzione di arrotondamento all'intero restituisce un numero reale, non un intero, bisogna arrotondare anche il tipo a un intero. Dov'è la logica del linguaggio?
 
Nikolai Semko:

La performance dell'operazione che confronta due doppi dipende dai valori delle variabili stesse? Ne dubito.

Sembra essere così. È piuttosto strano.
Se si sostituisce la linea nell'esempio precedente

double test = 1.11;

a

double test = NormalizeDouble(1.11,2);

il semplice confronto di due doppi inizia a funzionare più velocemente di altre opzioni. Anche se può essere doppio o doppio. Che differenza c'è? Ma la performance risultante è due volte più veloce. È come un miracolo.

2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 1 - 552 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 2 - 954 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через эпсилон                             - 778 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через преобразование в int                - 854 микросекунд, всего совпадений = 507
File:
 
Alexey Navoykov:

Il test non è corretto. Perché dividete per 100000.0 solo una volta alla fine? Dovrebbe essere eseguito ad ogni iterazione e poi sommato. Questo è un confronto corretto. Ma questa non è affatto una normalizzazione - avete appena ottimizzato il vostro algoritmo di test. Naturalmente sarà più veloce e più preciso (poiché l'errore accumulato è ridotto).

Sì, hai ragione. La precisione sarà la stessa di NormalizeDouble se si divide ad ogni iterazione. Ma la velocità sarà ancora maggiore che con NormalizeDouble.

2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   простая сумма                            - 1394 микросекунд, сумма = -3604329.1567609389312565
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма с NormalizeDouble                  - 5861 микросекунд, сумма = -3604329.1543100476264954
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма, нормализированная через int       - 2179 микросекунд, сумма = -3604329.1543100476264954

Grazie.

 

In generale, dopo aver arrotondato a un numero intero, restituire un numero non intero non va bene. In precedenza nelle stampanti ho visto numeri quasi interi con zeri dopo il punto decimale e uno alla fine, o con nove dopo il punto decimale. Ho pensato che fosse un bug. Risulta essere una posizione poco chiara degli sviluppatori. Beh, arrotondando all'intero, si dovrebbe rimuovere il resto dopo il punto decimale in forma binaria, ma apparentemente è difficile/impossibile azzerare la mantissa. A proposito di normalizzazione è ancora più complicato, anche se spostiamo una virgola a 5 cifre e intero in binario, l'arrotondamento inverso al doppio darà una differenza con il tipo intero.

Purtroppo, ci si deve appigliare a operazioni di confronto apparentemente semplici.

Non python.))))

 
Valeriy Yastremskiy:

In generale, dopo aver arrotondato a un numero intero, restituire un numero non intero non va bene. In precedenza nelle stampanti ho visto numeri quasi interi con zeri dopo il punto decimale e uno alla fine, o con nove dopo il punto decimale. Pensavo fosse un bug. Si scopre che gli sviluppatori di una posizione incomprensibile. Beh, arrotondando all'intero, si dovrebbe rimuovere il resto dopo il punto decimale in forma binaria, ma apparentemente è difficile/impossibile azzerare la mantissa. A proposito di normalizzazione è ancora più complicato, anche se spostiamo una virgola a 5 cifre e intero in binario, l'arrotondamento inverso al doppio darà una differenza con il tipo intero.

Purtroppo, dobbiamo scricchiolare su operazioni di confronto apparentemente semplici.

Le espressioni dopo l'arrotondamento possono contenere alcune altre operazioni sui dati risultanti, e non necessariamente interi. Poi dovremo riconvertirlo in double da int, creando un overhead sul posto.

Nessuno vi impedisce di creare le vostre funzioni RoundInt o RoundLong, che restituiranno il tipo richiesto.

 

C'è un problema con il tester sul mercato.

Se provo un EA multivaluta, il tester si blocca.

Il motivo: durante l'analisi dello strumento finanziario, l'Expert Advisor inciampa sugli strumenti senza storia o lo strumento non è progettato correttamente.

Nel terminale standard si blocca per 29 secondi, questo è sicuro ed è controllato.

Il tester del Mercato riporta test troppo lunghi.

Suppongo che l'Expert Advisor incontri diversi strumenti finanziari rotti.

Questo problema è stato scritto più volte e un anno fa, ma è ancora lì....

 
Vladimir Pastushak:

Questo problema è stato scritto più volte e un anno fa, ma è ancora lì....

Non funziona per me. Si prega di allegare il codice sorgente.

 

Potete commentare perché la funzione non funziona? Non passa al grafico 0.

ChartSetInteger(0,CHART_BRING_TO_TOP,0,true);

La seconda e ulteriore applicazione del modello duplica le finestre

ChartApplyTemplate(0,"Template.tpl");

Queste funzioni funzionavano prima dell'aggiornamento.

 
fxsaber:

Non sta giocando per me. Allega il tuo codice sorgente.

Test sui server demo di Metakvotes

void OnStart()
  {
   int m_all_symbols = SymbolsTotal(false);
   string m_sym_name = "";
   for(int i = 0; i < m_all_symbols; i++)
     {
      // ======================================================================
      // === Получили имя символа
      if((m_sym_name = SymbolName(i, false)) != NULL)
        {
         // ======================================================================
         // === Если символ не выбран в окне маркет ватч
         if(!SymbolInfoInteger(m_sym_name, SYMBOL_SELECT))
            if(!SymbolSelect(m_sym_name, true))
               Print(" SymbolSelect " + m_sym_name);
         ulong get = GetMicrosecondCount();
         MqlRates rateM1[1440];
         if(CopyRates(m_sym_name, PERIOD_M1, 0, 1440, rateM1) > 0)
           {
            Print(m_sym_name, "  ", (GetMicrosecondCount() - get));
           }
         else
            Print("Error  ",m_sym_name, "  ", (GetMicrosecondCount() - get));
        }
     }
  }


2020.08.11 20:20:55.657 test (EURUSD,M15) MXNJPY 1998

2020.08.11 20:20:55.659 test (EURUSD,M15) NZDMXN 1979

2020.08.11 20:20:55.661 test (EURUSD,M15) USDCOP 1973

2020.08.11 20:20:55.663 test (EURUSD,M15) USDARS 2093

2020.08.11 20:20:55.665 test (EURUSD,M15) USDCLP 1929

2020.08.11 20:21:25.259 test (EURUSD,M15) Errore AUS200 29593673

2020.08.11 20:21:54.837 test (EURUSD,M15) Errore FCHI40 29578404

2020.08.11 20:22:24.336 test (EURUSD,M15) Errore GDAXIm 29498485

2020.08.11 20:22:53.949 test (EURUSD,M15) Errore HSI50 29612968

2020.08.11 20:23:23.458 test (EURUSD,M15) Errore Jap225 29509059

2020.08.11 20:23:52.919 test (EURUSD,M15) Errore ND100m 29461316

2020.08.11 20:24:22.425 test (EURUSD,M15) Errore SP500m 29505571

2020.08.11 20:24:51.860 test (EURUSD,M15) Errore SPN35 29435460

2020.08.11 20:25:21.273 test (EURUSD,M15) Errore STOX50 29412578

2020.08.11 20:25:50.663 test (EURUSD,M15) Errore UK100 29389644

2020.08.11 20:26:20.205 test (EURUSD,M15) Errore Brent 29542597

2020.08.11 20:26:49.667 test (EURUSD,M15) Error Crude 29462066

2020.08.11 20:27:19.194 test (EURUSD,M15) Errore NatGas 29526780




 
Vladimir Pastushak:

Test su server Metacvots demo

Mi scusi, si sta riattaccando ora....

Questo script non ha causato il blocco del terminale sulla mia macchina.