Indicatore che si corrompe - pagina 6

 
Rosh:
Ok, aspetterò

Dopo più di 20 ore l'indicatore funziona correttamente. Non so cosa dire.


 

Rosh, Zoom in/Out, scorri a sinistra/destra. Su quale piattaforma stai testando a 64/32 bit?

 
AnkaSoftware:

Rosh, Zoom in/Out, scorri a sinistra/destra. Quale piattaforma stai testando su 64/32 bit?

Posso replicare il problema generale su 32-bit. L'unico modo in cui l'O/S sembra essere rilevante è la questione del perché il tuo sistema a 64 bit sembra ricevere periodicamente nuovi dati all'inizio o a metà della sua storia delle barre, mentre il tuo sistema a 32 bit (e quello a 64 bit di RaptorUK) no. In ogni caso, sembra che tu abbia intenzione di dare il tuo indicatore ad altre persone, e le modifiche alla storia delle barre sono problemi che sicuramente incontrerai poi nella vita reale, se non altro perché i tuoi utenti subiscono disconnessioni dal broker che portano all'inserimento di barre mancanti nel mezzo della storia al momento della riconnessione.

Come ho già cercato di spiegare, è discutibile se questo "bug" sia nel vostro codice o in MT4. C'è un'aspettativa su come gli indicatori si comportano in MT4, e il tuo indicatore non si comporta così. Per esempio, quando crei un nuovo indicatore usando MetaEditor, inserisce per te la linea "int counted_bars=IndicatorCounted();". Tu stai rimuovendo questo e ignorando IndicatorCounted().

Posso replicare il problema generale usando il seguente indicatore che disegna semplicemente una linea tra le ultime 10 barre alte quando si avvia per la prima volta:

#property indicator_chart_window
#property indicator_color1 Red
#property indicator_buffers 1

double indicatorvalues[];

void init()
{
   SetIndexBuffer(0, indicatorvalues);
}

void start()
{
   static bool IsFirstCall = true;
   if (IsFirstCall) {
      IsFirstCall = false;
      for (int i = 0; i < 10; i++) {
         indicatorvalues[i] = High[i];      
      }
   }
}

Puoi quindi replicare lo stesso tipo di problema facendo quanto segue:

* Aprire un grafico per qualsiasi simbolo

* Aggiungere l'indicatore al grafico

* Disattivate "Chart autoscroll" (solo per facilitare i seguenti passi; non perché abbia un impatto sul problema)

* Andare all'inizio del grafico, premendo Home

* Premere Page Up per forzare il download di dati extra. (N.B. Non c'è alcun problema, a meno che qualche dato extra venga effettivamente aggiunto al grafico a questo punto).

* Vai alla fine del grafico, premendo End. La linea rossa tra i massimi sarà ora fuori posizione. Sarà stata spostata indietro nel tempo.

[Tutto questo è solo un approfondimento di ciò che RaptorUK ha già identificato].

 

OK, puoi confermare che IndicatorCounted() restituirà un numero -ve, in questo caso di barre mancanti / indicatori corrotti? Lasciatemi provare a reinizializzare gli array di indicatori e a ridisegnare le mosse dalla barra di lookback.

 
AnkaSoftware:

OK, potete confermare che IndicatorCounted() restituirà un numero -ve, in questo caso di barre mancanti / indicatori corrotti?

No, quello che succede - come ho già detto a pagina 5, e come puoi facilmente testare da solo - è che MT4 azzera IndicatorCounted() quando vengono aggiunte nuove barre all'inizio dello storico utilizzando un metodo come quello sopra. Questo farà sì che un normale indicatore ridisegni tutti i suoi valori storici, perché in genere utilizza la differenza tra Bars e IndicatorCounted() per determinare quali barre sono "sporche" e devono essere aggiornate. Se IndicatorCounted() è zero, l'indicatore ricalcola quindi ogni barra storica, cioè perché Bars - 0 = Bars.

La documentazione di IndicatorCounted()(https://docs.mql4.com/customind/IndicatorCounted) fornisce un esempio di come fare questo, e ci sono versioni alternative come https://www.mql5.com/en/forum/132447 che mirano a migliorare molto marginalmente le prestazioni perché il codice standard di https://docs.mql4.com/customind/IndicatorCounted ricalcola inutilmente una barra che è "pulita".
 

Aggiungendo i controlli di IndicatorCounted() e reinizializzando gli indicatori quando IndicatorCounted() restituisce il valore 0, si risolve il problema dello spostamento degli indicatori che è causato dall'inserimento della storia o di barre aggiuntive.

Tuttavia, c'è un altro problema di corruzione degli indicatori, che sembra non essere causato dall'inserimento di barre storiche. Il codice di esempio allegato per riprodurre il problema, è necessario eseguirlo per 10+hrs, fino ad almeno due reinizializzazione degli indicatori cioè IndicatorCounted() che restituisce 0 (post inizio indicatore).

File: