Linea verticale. - pagina 4

 

Sto ancora imparando la complessità degli indicatori e ho delle domande. Ho resettato il buffer dell'indicatore in OnInit(), ma per qualche motivo i buffer non vengono resettati durante la compilazione dell'indicatore. Per la logica, dopo la compilazione ci dovrebbe essere una cella piena per ogni buffer . Dove sbaglio?

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- установим пустое значение
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   ArrayInitialize(ColorHistogram_2Buffer1,0);
   ArrayInitialize(ColorHistogram_2Buffer2,0);
   ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);

   Print("-INITALIZATION-");

   false;
//---
   return(INIT_SUCCEEDED);
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
 
Nauris Zukas:

Sto ancora imparando la complessità degli indicatori e ho delle domande. Ho resettato il buffer dell'indicatore in OnInit(), ma per qualche motivo i buffer non vengono resettati durante la compilazione dell'indicatore. Per logica, ci dovrebbe essere una cella piena per ogni buffer dopo la compilazione, ma nell'immagine si può vedere che ce ne sono molte (penso che queste siano le celle del buffer precedente). Dove sbaglio?

In OnInit i buffer degli indicatori hanno lunghezza zero.


Ecco perché possono fare tutto quello che vuoi, a loro sembra tutto un lavoro da morto.

E quando l'esecuzione del codice passa a OnCalculate, la dimensione diventa immediatamente uguale a rates_total.

e c'è "spazzatura" in tutte le celle dell'array. Potrebbero esserci anche avanzi del calcolo dei vecchi indicatori.

 
Alexey Viktorov:

In OnInit, i buffer degli indicatori hanno lunghezza zero.


È per questo che si può fare tutto quello che si vuole con loro, sono una prova schiacciante.

E quando l'esecuzione del codice passa a OnCalculate, la dimensione diventa immediatamente uguale a rates_total.

e tutte le celle dell'array hanno "spazzatura" al loro interno. Potrebbe esserne rimasto un po' dal calcolo del vecchio indicatore.

Grazie mille, ho capito tutto e ha funzionato! L'ha fatto così:

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(!ResetOnInit)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
      ResetOnInit=true;
     }
  }
 
Nauris Zukas:

Grazie mille, è andato tutto bene! Ho fatto così:

Perché assegnare un valore a una variabile due volte?

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }

E una domanda: che senso ha fare tutto questo? Dopo tutto, passando attraverso tutte le barre nel ciclo, tutte le celle dell'array devono essere comunque riempite con qualcosa. A meno che l'indicatore non debba mostrare solo la posizione corrente, ma allora l'array deve essere inizializzato su ogni barra, non solo all'inizio...

 
Alexey Viktorov:

Perché assegnare un valore a una variabile due volte?

Non ero sicuro se tutte le azioni con il grafico sono imitate da OnInit(), per esempio cambiando taimfreims. Cambiando il reset di taimfreim (appena controllato), ma forse c'è qualcos'altro, così ho messo il secondo in OnInit() per essere sicuro. Ma se non è così, allora non lo metterò lì.
 
Alexey Viktorov:

E la domanda è: perché abbiamo bisogno di tutto questo? Dopo tutto, passando attraverso tutte le barre nel ciclo, tutte le celle dell'array devono essere riempite con qualcosa, comunque. A meno che l'indicatore non debba mostrare solo la posizione corrente, ma allora l'array dovrebbe essere inizializzato su ogni barra, non solo all'inizio...

In questo esempio, volevo solo capire come resettare il buffer. Ma in futuro (nell'indicatore su cui sto lavorando ora), avrò bisogno sia di lasciare le celle precedenti che di aggiungerne di nuove. E proprio su questo ho iniziato a lavorare, per così dire, le prime prove.

 
Nauris Zukas:
Non ero sicuro che tutte le azioni con il grafico siano imitate da OnInit(), per esempio il cambio di taimfreim. Cambiando il reset di taimfreim (controllato ora), ma forse c'è qualcos'altro, così ho messo il secondo in OnInit() per essere sicuro. Ma se non è così, allora non lo metterò lì.

Ahh. Ebbene sì, le variabili di livello globale non vengono inizializzate quando cambia il periodo del grafico. Credo... non riesco a ricordare esattamente.

E in generale si può fare a meno di quella variabile extra bool.

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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(prev_calculated == 0)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
     }
  }
 
Alexey Viktorov:

E in generale, si può fare a meno di questa variabile bool extra.

Sì, esattamente, ancora meglio, grazie.

 

Potete dirmi perché, se il periodo è più di 30 minuti, restituisce un numero così strano?

Print("PERIOD: ",Period()); 

KP 0 14:33:22.423 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30) PERIODO: 30

GG 0 14:33:24.402 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1) PERIOD: 16385

RJ 0 14:33:25.675 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4) PERIODO: 16388
 
Nauris Zukas:

Potete dirmi perché se il periodo è più di 30 minuti, restituisce un numero così strano?

In MT5, i valori del periodo non sono uguali al numero di minuti, come in MT4