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.
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

- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
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