datetime new_time=TimeCurrent()/period_seconds*period_seconds; // Hora de apertura de la barra en el gráfico actual
Aquí hay un error. Si el período es una semana o un mes.
Si el período es una semana, entonces el comienzo de la semana es el miércoles, porque 1970.01.01 es jueves.
Si el período es un mes y el mes actual no tiene 30 días, también cuenta incorrectamente, porque period_seconds corresponde a 30 días.
Aquí hay un error. Si el período es de una semana o un mes.
Si el período es una semana, el comienzo de la semana es el miércoles, ya que 1970.01.01 es jueves.
Si el periodo es un mes, y el mes actual no tiene 30 días, también cuenta incorrectamente, ya que period_seconds corresponde a 30 días.
De acuerdo. Puede utilizar esto en OnNewBarCalculate.mqh para estos periodos:
//+------------------------------------------------------------------+ //| Función de iteración del indicador personalizada | //+------------------------------------------------------------------+ 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[]) { //--- // Cuando aparece una nueva barra, ejecuta el manejador de eventos NewBar if(current_chart.isNewBar()>0) OnNewBarCalculate(rates_total,prev_calculated,time,open,high,low,close,tick_volume,volume,spread); return(rates_total); }
Un poco para otros fines, pero estoy usando una función como esta por ahora:
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); }
Una fecha/hora y un timeframe se dan como entrada. En la salida obtenemos la hora de inicio de la barra en este timeframe, que contiene esta hora.
Si tienes alguna sugerencia para optimizar el código, estaré encantado de escucharte.
Por supuesto que se puede hacer de esta manera:
datetime timeOut[1]; CopyTime(_Symbol, highTimeFrame, timeIn, 1, timeOut);
Pero en este caso tuve un problema de sincronización. Es decir, hay que esperar a que se cargue el histórico.
¡Gracias por su indicador personalizado, pero cuando lo uso, sólo alerta una vez y dejar de depuración! ¡Please help me!
Si utilizo OnTick en su lugar (y eliminar OnInit y OnCaculate funciones) como este artículo https://www.mql5.com/es/articles/159 se ejecuta bien, pero el indicador no se muestra en las ventanas del navegador. Y no funciona cuando añado las funciones OnInit y OnCaculate. ¿Si añado las funciones OnInit y OnCaculate, el indicador se mostrará en las ventanas del navegador?
Gracias
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Gestor de eventos "New bar" para indicadores:
Autor: Konstantin Gruzdev