prev_calcolato

 
I commenti non relativi a "Bug, bug, problemi" sono stati spostati in questo thread.
 

MT5 build 1455

Indicatore per il test:

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

int OnCalculate(const int rates_total,
  const int prev_calculated,
  const datetime &Time[],
  const double &Open[],
  const double &High[],
  const double &Low[],
  const double &Close[],
  const long &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Mettere l'indicatore sul grafico

2. Chiudere il terminale

3. terminale aperto

Diario:

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

Mi manca qualcosa o è impossibile fidarsi della variabile prev_calculated, devo sgranocchiare la stampella?

 
Alexander Puzanov:

MT5 build 1455

Indicatore per il test:

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

int OnCalculate(const int rates_total,
  const int prev_calculated,
  const datetime &Time[],
  const double &Open[],
  const double &High[],
  const double &Low[],
  const double &Close[],
  const long &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Mettere l'indicatore sul grafico

2. Chiudere il terminale

3. terminale aperto

Diario:

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

Mi manca qualcosa o è impossibile fidarsi della variabile prev_calculated, devo sgranocchiare la stampella?

La variabile prev_calculated può essere resettata a 0 anche senza paginazione della storia se il checksum è cambiato (questa è una risposta approssimativa di servicedesk).
 
Alexey Kozitsyn:
La variabile prev_calculated può essere riportata a 0 anche senza paginazione della storia se il checksum è cambiato (questa è una risposta approssimativa di servicedesk).
Capito, grazie. Quindi al falegname...
 
Alexander Puzanov:
Capisco, grazie. Quindi al falegname...
Non c'è bisogno di esagerare - il ritorno zero da prev_calculate è un evento molto comune. Il compito del programmatore è quello di catturare un tale evento e riempire correttamente i buffer degli indicatori in questo caso. Né più né meno.
 
Ilyas:

Aggiunti gli operatori *(Dereference/Inderection) e &(Address-of), non sono previste ulteriori modifiche alla lingua

Si prega di chiarire quanto segue:

* ottenere una variabile per riferimento - si applica solo a:

1. oggetti di classe

2. oggetti della struttura

3. Tipi fondamentali

In questo contesto, è solo rlvalue o anche lvalue?

 
Karputov Vladimir:
Il compito del programmatore è di catturare un tale evento

Quindi non sono un programmatore - i miei compiti sono diversi. Carpenter, immagino che - 'crutch the crutch' e pensare che sto 'catturando l'evento'.

E non sto esagerando, perché lo scopo dichiarato di questa variabile:

prev_calculated  // обработано баров на предыдущем вызове

Oltre a questo scopo, si suppone che sia anche una bandiera di cambiamento nella storia, inoltre si suppone che tracci alcuni altri cambiamenti. Tutto questo è utile ma non possiamo usarlo per il suo scopo diretto - mostrare quante "barre sono state elaborate durante la chiamata precedente" - prev_calculated.

 
Alexander Puzanov:

Quindi non sono un programmatore - i miei compiti sono diversi. Carpenter, immagino che - io 'crutch the crutch' e penso che sto 'catturando l'evento'.

E non sto esagerando, perché lo scopo dichiarato di questa variabile:

prev_calculated  // обработано баров на предыдущем вызове

Oltre a questo scopo, si suppone che sia anche una bandiera di cambiamento nella storia, inoltre si suppone che tracci alcuni altri cambiamenti. Tutto questo è utile ma non potete usarlo per il suo scopo diretto - mostrare quante 'barre sono state processate alla chiamata precedente' - prev_calculated

E se ricalcoliamo semplicemente l'intero indicatore quando 0? Mi sembra la soluzione migliore.
 
Alexander Puzanov:

Quindi non sono un programmatore - i miei compiti sono diversi. Carpenter, immagino che - io 'crutch the crutch' e penso che sto 'catturando l'evento'.

E non sto esagerando, perché lo scopo dichiarato di questa variabile:

prev_calculated  // обработано баров на предыдущем вызове

Oltre a questo scopo, si suppone che sia anche una bandiera di cambiamento nella storia, inoltre si suppone che tracci alcuni altri cambiamenti. Tutto questo è utile ma non possiamo usarlo per il suo scopo diretto - mostrare quante barre sono state 'processate nella chiamata precedente' - prev_calculated

Se prev_calculated=0, significa che deve essere eseguito un ricalcolo completo. Tutti gli indicatori standard sono completamente ricalcolati in questo caso.

Cosa non è chiaro?

Si dice che il checksum sia cambiato nella storia. Sarebbe più economico ricalcolare l'indicatore che scoprire perché il checksum è cambiato.

La documentazione menziona esplicitamente che

Notate la connessione tra il valore di ritorno di OnCalculate() e il secondo parametro di input prev_calculated. Il parametro prev_calculated nella chiamata di funzione contiene un valore restituito da OnCalculate() nella chiamata precedente.Questo permette algoritmi economici per il calcolo dell'indicatore personalizzato al fine di evitare calcoli ripetuti per quelle barre che non sono cambiate dalla precedente chiamata di questa funzione.

Per questo, di solito è sufficiente restituire il valore del parametro rates_total, che contiene il numero di barre nella chiamata di funzione corrente. Se dall'ultima chiamata di OnCalculate() i dati sui prezzi sono cambiati (è stata pompata una storia più profonda o sono stati riempiti gli spazi vuoti della storia), allora il valore del parametro di input prev_calculate sarà impostato a zero dal terminale.

 
Alexey Kozitsyn:
Che ne dite di ricalcolare l'intero indicatore quando è 0? A mio parere, la soluzione migliore.
Questo è esattamente quello che dovresti fare: quando ottieni prev_calculate==0 dovresti ricalcolare l'intero indicatore. Poiché rev_calculate==0 è di solito un cambio di storia. E se la storia viene scambiata, significa che ci possono essere nuove barre che sono state mancate o che non sono state calcolate prima - cioè le letture dell'indicatore saranno già sbagliate.
 
Karputov Vladimir:
Questo è esattamente quello che dovreste fare: quando prev_calculate==0 è ricevuto, dovreste ricalcolare l'INTERO indicatore. Poiché rev_calculate==0 è di solito un cambio di storia. E se la storia viene scambiata, significa che ci possono essere nuove barre che sono state mancate o che non sono state calcolate prima - cioè le letture dell'indicatore saranno errate.
:) Questo è quello che faccio...
Motivazione: