iBarShift

Cerca la barra per orario. La funzione restituisce l'indice della barra corrispondente al tempo/orario specificato.

int  iBarShift(
   const string        symbol,          // Simbolo
   ENUM_TIMEFRAMES     timeframe,       // Periodo
   datetime            time,            // Orario
   bool                exact=false      // Modalità
   );

Parametri

symbol

[in] Il nome simbolico dello strumento finanziario. NULL significa il simbolo corrente.

timeframe

[in]  Periodo. Può essere uno dei valori dell'enumerazione ENUM_TIMEFRAMES. PERIOD_CURRENT significa il periodo chart corrente.

time

[in] Valore temporale da cercare.

exact=false

[in] Un valore di ritorno, nel caso in cui la barra con l'ora specificata non venga trovata. Se exact=false, iBarShift restituisce l'indice della barra più vicina, l'orario Open (di apertura) è inferiore all'orario specificato (time_open<time). Se tale barra non viene trovata (lo storico prima dell'orario specificato non è disponibile), la funzione restituisce -1. Se exact=true, iBarShift non cerca la barra più vicina, ma restituisce immediatamente -1.

Valore di ritorno

L'indice della barra corrispondente all'orario specificato. Se la barra corrispondente all'orario specificato non viene trovata (c'è una lacuna nello storico), la funzione restituisce -1 o l'indice della barra più vicina (a seconda del parametro 'exact').

Esempio:

//+------------------------------------------------------------------+
//| Funzione Start programma Script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- La data è domenica
   datetime time=D'2002.04.25 12:00';
   string symbol="GBPUSD";
   ENUM_TIMEFRAMES tf=PERIOD_H1;
   bool exact=false;
//--- Se non c'è alcuna barra all'ora specificata, iBarShift restituirà l'indice della barra più vicina
   int bar_index=iBarShift(symbol,tf,time,exact);
//--- Controlla il codice di errore dopo la chiamata di iBarShift()
   int error=GetLastError();
   if(error!=0)
     {
      PrintFormat("iBarShift(): GetLastError=%d - La data richiesta %s "+
                  "per %s %s non è stata trovata nello storico disponibile",
                  error,TimeToString(time),symbol,EnumToString(tf));
      return;
     }
//--- La funzione iBarShift() è stata eseguita correttamente, restituisce un risultato per exact=false
   PrintFormat("1. %s %s %s(%s): l'indice della barra è %d (exact=%s)",
               symbol,EnumToString(tf),TimeToString(time),
               DayOfWeek(time),bar_index,string(exact));
   datetime bar_time=iTime(symbol,tf,bar_index);
   PrintFormat("L'orario della barra #%d è %s (%s)",
               bar_index,TimeToString(bar_time),DayOfWeek(bar_time));
//--- Richiede l'indice della barra con l'orario specificato; se non ci sono barre, verrà restituito -1
   exact=true;
   bar_index=iBarShift(symbol,tf,time,exact);
//--- La funzione iBarShift() è stata eseguita correttamente, restituisce un risultato per 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));
  }
//+------------------------------------------------------------------+
//| Restituisce il nome del giorno della settimana                   |
//+------------------------------------------------------------------+
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;
  }
//+------------------------------------------------------------------+
/* Risultato dell'esecuzione
   1. GBPUSD PERIOD_H1 2018.06.10 12:00(SUNDAY): l'indice della barra è 64 (exact=false)
   Orario della barra #64 è 2018.06.08 23:00 (FRIDAY)
   2. GBPUSD PERIOD_H1 2018.06.10 12:00 (SUNDAY):l'indice della barra è -1 (exact=true)
*/