iBarShift

Busca la barra según la hora y fecha. La función retorna el índice de la barra en el que entra la hora y fecha especificada.

int  iBarShift(
   const string        symbol,          // símbolo
   ENUM_TIMEFRAMES     timeframe,       // periodo
   datetime            time,            // hora y fecha
   bool                exact=false      // modo
   );

Parámetros

symbol

[in]  Nombre del símbolo del instrumento. NULL designa el símbolo actual.

timeframe

[in]  Periodo. Puede ser uno de los valores de la enumeración ENUM_TIMEFRAMES. PERIOD_CURRENT designa el periodo del gráfico actual.

time

[in]  Valor de la hora y fecha para la búsqueda.

exact=false

[in]  El valor retornado, si no se ha encontrado la barra para la hora y fecha indicadas. Con el valor exact=false iBarShift retorna el índice de la barra más próxima cuya hora y fecha de apertura sea menor a la indicada (time_open<time). Si no se ha encotrado esa barra (no hay historia posterior a la hora y fecha indicadas), la función retorna -1. Si exact=true, la barra más cercana no será buscada, y la función iBarShift retornará de inmediato -1.

Valor devuelto

índice de la barra en la que entran la hora y fecha indicadas. Si no existe ninguna barra para la hora y fecha indicadas (hay un "agujero" en la historia), la función retorna -1 o el índice de la barra más próxima (dependiendo del parámetro exact).

Ejemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- la hora y fecha cae en domingo
   datetime time=D'2002.04.25 12:00';
   string symbol="GBPUSD";
   ENUM_TIMEFRAMES tf=PERIOD_H1;
   bool exact=false;
//--- si no existe la barra de la hora y fecha indicadas, iBarShift retornará el índice a la barra más próxima
   int bar_index=iBarShift(symbol,tf,time,exact);
//--- comprobamos el código de error después de la llamada de iBarShift()
   int error=GetLastError();
   if(error!=0)
     {
      PrintFormat("iBarShift(): GetLastError=%d - fecha solicitada %s "+
                  "para %s %s no se ha encontrado en la historia disponible",
                  error,TimeToString(time),symbol,EnumToString(tf));
      return;
     }
//--- la función iBarShift() se ha ejecutado con éxito, mostramos los resultados para exact=false
   PrintFormat("1. %s %s %s(%s): bar index is %d (exact=%s)",
               symbol,EnumToString(tf),TimeToString(time),
               DayOfWeek(time),bar_index,string(exact));
   datetime bar_time=iTime(symbol,tf,bar_index);
   PrintFormat("Time of bar #%d is %s (%s)",
               bar_index,TimeToString(bar_time),DayOfWeek(bar_time));
//--- requerimos encontrar el índice de la barra para la hora y fecha especificadas, si no existe, obtendremos -1
   exact=true;
   bar_index=iBarShift(symbol,tf,time,exact);
//--- la función iBarShift() se ha ejecutado con éxtito, mostramos los resultados para exact=true
   PrintFormat("2. %s %s %s (%s):bar index is %d (exact=%s)",
               symbol,EnumToString(tf),TimeToString(time)
               ,DayOfWeek(time),bar_index,string(exact));
  }
//+------------------------------------------------------------------+
//| Retornamos el nombre para la semana                                   |
//+------------------------------------------------------------------+
string DayOfWeek(const datetime time)
  {
   MqlDateTime dt;
   string day="";
   TimeToStruct(time,dt);
   switch(dt.day_of_week)
     {
      case 0: day=EnumToString(SUNDAY);
      break;
      case 1: day=EnumToString(MONDAY);
      break;
      case 2: day=EnumToString(TUESDAY);
      break;
      case 3: day=EnumToString(WEDNESDAY);
      break;
      case 4: day=EnumToString(THURSDAY);
      break;
      case 5: day=EnumToString(FRIDAY);
      break;
      default:day=EnumToString(SATURDAY);
      break;
     }
//---
   return day;
  }
//+------------------------------------------------------------------+
/* Resultado de la ejecución
   1. GBPUSD PERIOD_H1 2018.06.10 12:00 (SUNDAY): bar index is 64 (exact=false)
   Time of bar #64 is 2018.06.08 23:00  (FRIDAY)
   2. GBPUSD PERIOD_H1 2018.06.10 12:00 (SUNDAY):bar index is -1  (exact=true)
*/