iBarShift

バーを時刻によって検索します。この関数は、指定された時刻に対応するバーのインデックスを返します。

int  iBarShift(
  const string        symbol,         // 銘柄
  ENUM_TIMEFRAMES     timeframe,      // 期間
  datetime            time,           // 時間
  bool                exact=false     // モード
  );

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。PERIOD_CURRENTは現在のチャート期間を意味します。

time

[in]  検索する時間の値

exact=false

[in]  指定された時間のバーが見つからない場合の戻り値です。. exact=falseの場合、iBarShiftは、開始時間が指定された時刻より早い(time_open<time)一番近くのバーのインデックスを返します。 そのようなバーが見つからない場合(指定された時間前の履歴が使用できない)、関数は-1を返します。exact=trueの場合、iBarShiftは一番近いバーを検索せずにすぐに-1を返します。

戻り値

指定された時刻に対応するバーのインデックスを返します。指定された時間に対応するバーが見つからない場合(履歴にギャップがある場合)、関数は'exact'に応じて、-1または最も近いバーのインデックスを返します。

例:

//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                          |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- 日曜日
  datetime time=D'2002.04.25 12:00';
  string symbol="GBPUSD";
  ENUM_TIMEFRAMES tf=PERIOD_H1;
  bool exact=false;
//--- 指定された時間に対応するバーがない場合、iBarShiftは一番近いバーのインデックスを返す
  int bar_index=iBarShift(symbol,tf,time,exact);
//--- iBarShift()呼び出しの後でエラーコードを確認する
  int error=GetLastError();
  if(error!=0)
    {
    PrintFormat("iBarShift(): GetLastError=%d - The requested date %s "+
                "for %s %s is not found in the available history",
                 error,TimeToString(time),symbol,EnumToString(tf));
    return;
    }
//--- iBarShift()関数が正常に実行されて、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));
//--- 指定された時間でバーのインデックスを要求し、バーがない場合は-1を返す
  exact=true;
  bar_index=iBarShift(symbol,tf,time,exact);
//--- iBarShift()関数が正常に実行されて、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));
 }
//+------------------------------------------------------------------+
//| 曜日名を返す                                                        |
//+------------------------------------------------------------------+
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;
 }
//+------------------------------------------------------------------+
/* 実行結果
  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)
*/