iBarShift

Recherche une barre par son heure. La fonction retourne l'indice de la barre correspondant à l'heure spécifiée.

int  iBarShift(
   const string        symbol,          // Symbole
   ENUM_TIMEFRAMES     timeframe,       // Période
   datetime            time,            // Heure
   bool                exact=false      // Mode
   );

Parameters

symbol

[in]  Le nom du symbole de l'instrument financier. NULL signifie le symbole courant.

timeframe

[in]  Période. Peut être l'une des valeurs de l'énumération ENUM_TIMEFRAMES. PERIOD_CURRENT signifie la période actuelle du graphique.

time

[in]  Valeur de la date/heure à rechercher.

exact=false

[in]  Une valeur de retour, dans le cas où aucune barre n'est trouvée pour l'heure spécifiée. Si exact=false, iBarShift retourne l'indice de la barre la plus proche, dont l'heure d'ouverture est inférieure à l'heure spécifiée (time_open<time). Si une telle barre n'est pas trouvée (l'historique n'est pas disponible avant l'heure spécifiée), alors la fonction retourne -1. Si exact=true, iBarShift ne recherche pas la barre la plus proche mais retourne immédiatement -1.

Valeur de Retour

L'indice de la barre correspondant à la date/heure spécifiée. Si la barre correspondant à l'heure spécifiée n'est pas trouvée (il y a un trou dans l'historique), la fonction retourne -1 ou l'indice de la barre la plus proche (suivant le paramètre 'exact').

Exemple :

//+------------------------------------------------------------------+
//| Fonction de démarrage du script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- La date est un dimanche
   datetime time=D'2002.04.25 12:00';
   string symbol="GBPUSD";
   ENUM_TIMEFRAMES tf=PERIOD_H1;
   bool exact=false;
//--- S'il n'y a pas de barre à l'heure spécifiée, iBarShift retournera l'indice de la barre la plus proche
   int bar_index=iBarShift(symbol,tf,time,exact);
//--- Vérification du code d'erreur après l'appel à iBarShift()
   int error=GetLastError();
   if(error!=0)
     {
      PrintFormat("iBarShift(): GetLastError=%d - La date demandée %s "+
                  "pour %s %s n'est pas trouvée dans l'historique disponible",
                  error,TimeToString(time),symbol,EnumToString(tf));
      return;
     }
//--- La fonction iBarShift() a été exécutée avec succès, retourne un résultat pour exact=false
   PrintFormat("1. %s %s %s(%s): l'indice de la barre est %d (exact=%s)",
               symbol,EnumToString(tf),TimeToString(time),
               DayOfWeek(time),bar_index,string(exact));
   datetime bar_time=iTime(symbol,tf,bar_index);
   PrintFormat("L'heure de la barre #%d est %s (%s)",
               bar_index,TimeToString(bar_time),DayOfWeek(bar_time));
//--- Demande l'indice de la barre à la date spécifiée : s'il n'y a pas de barre, -1 est retourné
   exact=true;
   bar_index=iBarShift(symbol,tf,time,exact);
//--- La fonction iBarShift() a été exécutée avec succès, retourne un résultat pour exact=true
   PrintFormat("2. %s %s %s (%s):l'indice de la barre est %d (exact=%s)",
               symbol,EnumToString(tf),TimeToString(time)
               ,DayOfWeek(time),bar_index,string(exact));
  }
//+------------------------------------------------------------------+
//| Retourne le nom du jour de la semaine                            |
//+------------------------------------------------------------------+
string DayOfWeek(const datetime time)
  {
   MqlDateTime dt;
   string day="";
   TimeToStruct(time,dt);
   switch(dt.day_of_week)
     {
      case 0: day=EnumToString(DIMANCHE);
      break;
      case 1: day=EnumToString(LUNDI);
      break;
      case 2: day=EnumToString(MARDI);
      break;
      case 3: day=EnumToString(MERCREDI);
      break;
      case 4: day=EnumToString(JEUDI);
      break;
      case 5: day=EnumToString(VENDREDI);
      break;
      default:day=EnumToString(SAMEDI);
      break;
     }
//---
   return day;
  }
//+------------------------------------------------------------------+
/*  Résultat de l'exécution
   1. GBPUSD PERIOD_H1 2018.06.10 12:00(SUNDAY): l'indice de la barre est 64 (exact=false)
   L'heure de la barre #64 est 2018.06.08 23:00 (FRIDAY)
   2. GBPUSD PERIOD_H1 2018.06.10 12:00 (SUNDAY): l'indice de la barre est -1 (exact=true)
*/