Indicatori: Nuovo gestore di eventi "barra" per gli indicatori

 

Nuovo gestore di eventi "barra" per gli indicatori:

A differenza di OnCalculate(), l'indicatore viene calcolato solo quando sul grafico compare una nuova barra.

Author: Konstantin Gruzdev

 
datetime new_time=TimeCurrent()/period_seconds*period_seconds; // Ora di apertura della barra sul grafico corrente

Qui c'è un errore. Se il periodo è una settimana o un mese.

Se il periodo è una settimana, l'inizio della settimana è mercoledì, perché 1970.01.01 è giovedì.

Se il periodo è un mese e il mese corrente non ha 30 giorni, il conteggio è errato, perché period_seconds corrisponde a 30 giorni.

 
Maratori:

Qui c'è un errore. Se il periodo è di una settimana o di un mese.

Se il periodo è una settimana, l'inizio della settimana è mercoledì, poiché 1970.01.01 è giovedì.

Se il periodo è un mese e il mese corrente non ha 30 giorni, il conteggio è errato, poiché period_seconds corrisponde a 30 giorni.

Concordo. Si può usare questo in OnNewBarCalculate.mqh per questi periodi:

//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzata |
//+------------------------------------------------------------------+
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[])
  {
//---
   // Quando appare una nuova barra, eseguire il gestore dell'evento NewBar
   if(current_chart.isNewBar()>0) 
      OnNewBarCalculate(rates_total,prev_calculated,time,open,high,low,close,tick_volume,volume,spread);
   return(rates_total);
  }
 

Un po' per altri scopi, ma per ora sto usando una funzione come questa:

datetime getHTFTime(datetime time, ENUM_TIMEFRAMES highTimeFrame) {
  int periodSeconds = PeriodSeconds(highTimeFrame);
  if(periodSeconds <= 60*60*24) return datetime(time/periodSeconds*periodSeconds);
  
  MqlDateTime sTime;
  TimeToStruct(time, sTime);
  
  if(highTimeFrame == PERIOD_W1) {
    TimeToStruct(time - datetime(sTime.day_of_week * 24 * 60 * 60), sTime);
    sTime.hour = 0;
    sTime.min = 0;
    sTime.sec = 0;
  } else if(highTimeFrame == PERIOD_MN1) {
      sTime.day = 1;
      sTime.hour = 0;
      sTime.min = 0;
      sTime.sec = 0;
    }
  return StructToTime(sTime);
}

Come input vengono forniti una data/ora e un timeframe. In uscita otteniamo l'ora di inizio della barra su questo timeframe, che contiene questa ora.

Se avete suggerimenti per ottimizzare il codice, sarò lieto di ascoltarvi.

Naturalmente è possibile farlo in questo modo:

datetime timeOut[1];
CopyTime(_Symbol, highTimeFrame, timeIn, 1, timeOut);

Ma in questo caso ho avuto un problema di sincronizzazione. Cioè, è necessario attendere il caricamento della cronologia.

 

Grazie per il vostro indicatore personalizzato, ma quando lo uso, mi allerta solo una volta e smette di fare il debug! Per favore aiutatemi!

Se invece uso OnTick (e rimuovo le funzioni OnInit e OnCaculate) come questo articolo https://www.mql5.com/it/articles/159 funziona bene ma l'indicatore non viene visualizzato nelle finestre del navigatore. E non funziona quando aggiungo le funzioni OnInit e OnCaculate. Se aggiungo le funzioni OnInit e OnCaculate, l'indicatore viene visualizzato nelle finestre del navigatore?

Grazie