Teoria dell'accelerazione EA quando si usa un indicatore personalizzato (funzione - iCustom) - pagina 3

 
-Aleks-:
Quindi, il guazzabuglio di indicatori necessari funzionerà più velocemente che usare gli indicatori separatamente - le informazioni sulle quotazioni saranno richieste meno frequentemente?

Non essenziale. Assicuratevi che i calcoli non siano duplicati. Se i calcoli preliminari di due indicatori sono gli stessi, dovrebbero essere combinati in uno solo. Non dovreste semplicemente incollare tutti gli indicatori in uno solo.

Non ci sono problemi nel richiedere i preventivi. Non hanno bisogno di essere richiesti, vengono da soli.

 

Ho provato a usare un ritardo per ricalcolare l'indicatore:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
 static datetime   prevtime;
  datetime per=15; //задержка секунд
   
   if((TimeCurrent()-prevtime)<per) 
   {
   return(rates_total); //прошло мало секунд - поэтому выходим
   }
 
//--- main cycle  
....................

prevtime=TimeCurrent();
return(rates_total);
 }

Quando si testa su "OHLSnaM1" non c'è quasi nessuna differenza, forse testando su "tutte le zecche" sarà più veloce.

 

la mia impressione su come funziona iCustom (se nulla è stato cambiato negli ultimi 2 mesi)
quando si chiama l'indicatore da iCustom
tutti i buffer per una possibile storia e i risultati memorizzati nella cache saranno calcolati, e la cache sarà legata ai parametri e al nome dell'indicatore

se la prossima volta chiami lo stesso indicatore e gli stessi parametri per il secondo array di indici - il risultato ritornerà dalla cache (+ la correzione per i nuovi dati storici)
se chiamate lo stesso indicatore, ma cambiate solo un parametro - verrà eseguito il calcolo completo di tutti i buffer per l'eventuale storia e il salvataggio di un'altra cache, ma con un binding ai nuovi parametri.


Puoi specificare quanta storia dovrebbe essere scaricata dall'Expert Advisor, se crei un tale parametro nell'indicatore, ma a questa chiamata dovresti sempre passare lo stesso numero - la dimensione della storia.
(influenzerà la velocità della prima chiamata di iCustom).

Potete provare a rimuovere il calcolo dei buffer non necessari, se possibile, sia nell'indicatore che attraverso i parametri dell'indicatore, come nell'esempio con la dimensione della storia
(diminuire la dimensione della cache - aumentare la velocità di calcolo)

 

Grazie a tutti per le informazioni.

Voglio chiarire, se in un indicatore con 5 buffer grafici per utilizzare non un buffer grafico, ma un array ordinario - per emettere dati attraverso un buffer grafico, come ho suggerito, la velocità dell'indicatore durante l'ottimizzazione sarà più veloce, perché meno memoria sarà allocata per l'indicatore, e quindi meno tempo sarà speso per lavorare con esso?

Se l'ottimizzazione viene eseguita e le impostazioni dell'indicatore non vengono modificate ad ogni passaggio, l'indicatore viene ricalcolato?

 
-Aleks-:

Grazie a tutti per le informazioni.

Voglio chiarire, se in un indicatore con 5 buffer grafici per utilizzare non un buffer grafico, ma un array ordinario - per emettere dati attraverso un buffer grafico, come ho suggerito, la velocità dell'indicatore durante l'ottimizzazione sarà più veloce, perché meno memoria sarà allocata per l'indicatore, e quindi meno tempo sarà speso per lavorare con esso?

Se l'ottimizzazione viene eseguita e le impostazioni dell'indicatore non vengono modificate ad ogni passaggio, l'indicatore viene ricalcolato?

Il buffer è un array, conveniente solo per la visualizzazione dei dati.

Durante l'ottimizzazione l'indicatore viene ricalcolato ogni volta.

 
komposter:

Un buffer è un array, utile solo per visualizzare i dati.

Capisco l'array, ma l'array per il calcolo di un indicatore può essere molto più piccolo - spesso dinamico.

Per esempio nella storia di 1000 barre - l'indicatore personalizzato disegna 3 SMA - 5/8/10.

Nel caso standard avremo un buffer grafico per quasi 3000-10-8-5

E se usiamo il mio metodo

per calcolare la SMA(5) abbiamo bisogno di un array di dimensioni (scusate la terminologia) di 4 barre

per calcolare la SMA(8) ho bisogno di un array di (scusate la terminologia) 7 barre di dimensione

per calcolare la SMA(10) abbiamo bisogno di un array di (scusate la terminologia) 9 barre

e un array grafico di 1000 barre, il risultato è che avete bisogno di 1000+4+7+9 poiché gli array semplicemente li sovrascriveranno.

Dove mi sbaglio?

 
-Aleks-:

Grazie a tutti per le informazioni.

Voglio chiarire, se in un indicatore con 5 buffer grafici per utilizzare non un buffer grafico, ma un array ordinario - per emettere dati attraverso un buffer grafico, come ho suggerito, la velocità dell'indicatore durante l'ottimizzazione sarà più veloce, perché meno memoria sarà allocata per l'indicatore, e quindi meno tempo sarà speso per lavorare con esso?

Se l'ottimizzazione viene eseguita e le impostazioni dell'indicatore non vengono modificate ad ogni passaggio, l'indicatore viene ricalcolato?

È più importante capire che quando chiamate di nuovo l'indicatore, non sarà ricaricato nel segmento di memoria (overlay). Tutto il resto non è niente in confronto ad esso.
 
-Aleks-:

Capisco l'array, ma l'array per il calcolo dell'indicatore può essere molto più piccolo - spesso dinamico.

Per esempio nella storia di 1000 barre - l'indicatore personalizzato disegna 3 SMA - 5/8/10.

Nel caso standard avremo un buffer grafico per quasi 3000-10-8-5

E se usiamo il mio metodo

per calcolare la SMA(5) abbiamo bisogno di un array di dimensioni (scusate la terminologia) di 4 barre

per calcolare la SMA(8) ho bisogno di un array di (scusate la terminologia) 7 barre di dimensione

per calcolare la SMA(10) abbiamo bisogno di un array di (scusate la terminologia) 9 barre

e un array grafico di 1000 barre, il risultato è che avete bisogno di 1000+4+7+9 poiché gli array semplicemente li sovrascriveranno.

Dove mi sbaglio?

Se avete bisogno di un valore su una barra, non avete davvero bisogno di un buffer. Nemmeno l'indicatore lo è ;)

E se avete bisogno di un valore di indicatore su ogni barra, spesso è più economico calcolare tutto e poi calcolare incrementalmente solo la nuova barra.
E non tutti gli algoritmi sono semplici come la SMA, semplicemente non possono essere calcolati "per 5 barre". Dai un'occhiata allo zig-zag almeno.

Quello che mi confonde di più è che non cerchi di applicare le risposte nella pratica. Sembra che non ci sia nessun compito pratico, solo trucchi teorici.
Allora non capisco perché vi partecipo.

 

A proposito, MT4 affronta molto bene il calcolo di solo una parte della storia e non consuma memoria per tutto il buffer, se il ciclo passa attraverso le ultime 1000 barre (anche se ci sono 50000 barre "nella finestra").

Tuttavia, ho riscontrato questo problema in MT5 - alloca la memoria per tutte le 50000 barre anche se vengono contate solo le ultime 100.

 
komposter:

Se avete bisogno di un valore su una barra, non avete davvero bisogno di un buffer. Nemmeno l'indicatore lo fa ;)

Perché una barra? Stavo solo dicendo che per calcolare il valore di un indicatore raramente è necessario conoscere tutti i suoi indicatori per tutta la storia del tempo. Ecco perché ho scritto che i buffer (array) saranno usati solo per il calcolo, mentre il risultato del calcolo di 3 MA sarà memorizzato in unbuffer grafico.

Per quanto riguarda Zig-zag - questo è un mal di testa per me ora - richiede un certo numero di risposte, ma aprirò un thread separato.

komposter:

Quello che mi confonde più di tutto è che non cerchi di applicare le risposte nella pratica. Sembra che non ci sia nessun compito pratico, solo speculazioni teoriche.

Allora non capisco perché vi partecipo.

Il fatto è che io non sono un programmatore - le mie indagini mi aiuteranno a redigere la specifica dei requisiti. Ora sto sviluppando un indicatore, che sarà un componente del motore dell'EA - ha un sacco di buffer, quindi sto pensando a come velocizzare l'EA non integrando l'indicatore nel codice, ma con altri metodi.

E speravo anche che qualcuno fosse interessato a provare un tale algoritmo in pratica - per confrontare la velocità di funzionamento ...


komposter:

A proposito, MT4 è perfettamente in grado di calcolare solo una parte della storia e non mangia memoria per tutto il buffer, se il ciclo passa attraverso le ultime 1000 barre (anche se ci sono 50000 nella "finestra").

Tuttavia, ho incontrato questo problema in MT5 - alloca la memoria per tutte le 50000 barre, anche se conto solo le ultime 100.

È un fatto triste per 5. Gli sviluppatori non spiegano il sacro significato di questo?