//+------------------------------------------------------------------+ //| Synchronize_Bars_Use_OnTimer.mq5 | //| Copyright 2011, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" //--- parámetros de entrada input string other_symbol="USDJPY"; //+------------------------------------------------------------------+ //| Función de inicialización del Experto | //+------------------------------------------------------------------+ int OnInit() { //--- comprueba el símbolo if(_Symbol==other_symbol) { PrintFormat("Debe especificar otro símbolo en los parámetros de entrada o seleccionar otro símbolo en el Probador de Estrategia!"); //--- forzamos la detención de la prueba return(-1); } //--- establecemos el temporizador EventSetTimer(5); //--- return(0); } //+------------------------------------------------------------------+ //| Función de deinicialización del Experto | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- pararamos el temporizador EventKillTimer(); } //+------------------------------------------------------------------+ //| Función del temporizador | //+------------------------------------------------------------------+ void OnTimer() { //--- variable estática, se usa para almacenar la hora de la última barra static datetime last_bar_time=0; //--- marca de sincronización static bool synchonized=false; //--- si la variable estática no ha sido inicializada if(last_bar_time==0) { //--- es la primera llamada, guardamos la hora de la barra y salimos last_bar_time=(datetime)SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE); PrintFormat("La variable last_bar_time ha sido inicializada con el valor %s",TimeToString(last_bar_time)); return; } //--- obtenemos la hora de apertura de la última barra del símbolo en el gráfico datetime curr_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE); //--- si las horas son diferentes if(curr_time!=last_bar_time) { //--- guardamos la hora de apertura en la variable estática last_bar_time=curr_time; //--- no están sincronizados synchonized=false; //--- imprimimos el mensaje PrintFormat("Se ha formado una nueva barra en el símbolo %s a las %s",_Symbol,TimeToString(TimeCurrent())); } //--- obtenemos la hora de apertura de la última barra del otro símbolo datetime other_time=(datetime)SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE); if(curr_time==other_time && !synchonized) { //--- los tiempos de apertura están sincronizados synchonized=true; PrintFormat("La hora de apertura de la barra del símbolo del gráfico %s: es %s",_Symbol,TimeToString(last_bar_time)); PrintFormat("La hora de apertura de la barra del símbolo %s: es %s",other_symbol,TimeToString(other_time)); //--- TimeCurrent() no es útil, use TimeTradeServer() PrintFormat("Las barras están sincronizadas a las %s",TimeToString(TimeTradeServer(),TIME_SECONDS)); } } //+------------------------------------------------------------------+