ObjectGetValueByTime

この関数は、指定されたオブジェクトの指定された時間値に対応する価格値を返します。

double  ObjectGetValueByTime(
  long      chart_id,    // チャート識別子
  string    name,        // オブジェクト名
  datetime  time,        // 時間
  int      line_id      // 行番号
  );

パラメータ

chart_id

[in]  チャート識別子( 0 は現在のチャート)

name

[in]  オブジェクト名

time

[in]  時刻

line_id

[in]  線の識別子

戻り値

指定されたオブジェクトの指定された時間値に対応する価格値

注意事項

この関数は同期呼び出しを使用します。つまり、この関数が呼び出される前にこのチャートのエンキューされたすべてのコマンドの実行が待機されるため、この関数は時間がかかることがあります。チャート上で多数のオブジェクトを操作する場合は、この特徴を考慮する必要があります。

オブジェクト 1 つの価格座標で複数の値を持つことが出来るため、行番号を指定する必要があります。この関数は、次のオブジェクトにのみ適用されます。

  • トレンドライン(OBJ_TREND)
  • アングルトレンド(OBJ_TRENDBYANGLE)
  • ギャンライン(OBJ_GANNLINE)
  • 等距離チャンネル(OBJ_CHANNEL) - 2 ライン
  • 線形回帰チャンネル (OBJ_REGRESSION) - 3 ライン
  • 標準偏差チャンネル(OBJ_STDDEVCHANNEL) - 3 ライン
  • 矢印線(OBJ_ARROWED_LINE)

 

例:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link     "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetValueByTime" // グラフィックオブジェクト名
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- チャートID、シンボル
  long   chart_id=ChartID();
  string symbol=ChartSymbol(chart_id);
 
  long bar1=0, bar2=0, visible=0;
//--- 左端に表示されているチャートの最初のバーを取得する
  ResetLastError();
  if(!ChartGetInteger(chart_id, CHART_FIRST_VISIBLE_BAR, 0, bar1))
    {
    Print("ChartGetInteger() failed. Error ", GetLastError());
    return;
    }
//--- チャートで表示されているバーの数
  if(!ChartGetInteger(chart_id, CHART_VISIBLE_BARS, 0, visible))
    {
    Print("ChartGetInteger() failed. Error ", GetLastError());
    return;
    }
 
//--- 取得した値を調整し、右端に表示される最初のバーのインデックスを計算する
  bar1-=1;
  visible-=2;
  bar2=bar1-visible;
 
//--- 左端の可視バーの高値から右端の低値まで等間隔チャネルを構築する
  if(!CreateChannel(chart_id, (int)bar1, (int)bar2))
    return;
 
  int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
 
//--- チャートの左端可視バーから右端可視バーまでのループで
//--- 各等間隔チャネルラインのループバー時間に対応する価格を取得する
//--- 取得した価格を各ラインごとに操作ログに表示する
  for(int i=(int)bar1; i>=bar2 && !IsStopped(); i--)
    {
    datetime time=GetTime(symbol, i);
    if(time==0)
        continue;
     
    string time_str=TimeToString(time);
    double value0=ObjectGetValueByTime(chart_id, OBJ_NAME, time, 0);
    double value1=ObjectGetValueByTime(chart_id, OBJ_NAME, time, 1);
    string idx=StringFormat("%03d", i);
    PrintFormat("[%s] For time %s the price value at 0 line of the object: %.*f, at line 1: %.*f",
                idx, TimeToString(time), digits, value0, digits, value1);
    }
 
//--- 5秒待ってクリーンアップを行う
  Sleep(5000);
  ObjectDelete(chart_id, OBJ_NAME);
  ChartRedraw(chart_id);
  /*
   結果:
  [114] For time 2025.01.02 05:00 the price value at 0 line of the object: 1.03732, at line 1: 1.03393
  [113] For time 2025.01.02 05:30 the price value at 0 line of the object: 1.03694, at line 1: 1.03355
  [112] For time 2025.01.02 06:00 the price value at 0 line of the object: 1.03657, at line 1: 1.03318
  [111] For time 2025.01.02 06:30 the price value at 0 line of the object: 1.03619, at line 1: 1.03280
  [110] For time 2025.01.02 07:00 the price value at 0 line of the object: 1.03581, at line 1: 1.03242
  [109] For time 2025.01.02 07:30 the price value at 0 line of the object: 1.03544, at line 1: 1.03205
  [108] For time 2025.01.02 08:00 the price value at 0 line of the object: 1.03506, at line 1: 1.03167
  [107] For time 2025.01.02 08:30 the price value at 0 line of the object: 1.03468, at line 1: 1.03129
  [106] For time 2025.01.02 09:00 the price value at 0 line of the object: 1.03431, at line 1: 1.03092
  [105] For time 2025.01.02 09:30 the price value at 0 line of the object: 1.03393, at line 1: 1.03054
  [104] For time 2025.01.02 10:00 the price value at 0 line of the object: 1.03355, at line 1: 1.03016
  [103] For time 2025.01.02 10:30 the price value at 0 line of the object: 1.03318, at line 1: 1.02979
  [102] For time 2025.01.02 11:00 the price value at 0 line of the object: 1.03280, at line 1: 1.02941
  [101] For time 2025.01.02 11:30 the price value at 0 line of the object: 1.03242, at line 1: 1.02903
  [100] For time 2025.01.02 12:00 the price value at 0 line of the object: 1.03205, at line 1: 1.02866
  [099] For time 2025.01.02 12:30 the price value at 0 line of the object: 1.03167, at line 1: 1.02828
  [098] For time 2025.01.02 13:00 the price value at 0 line of the object: 1.03129, at line 1: 1.02790
  [097] For time 2025.01.02 13:30 the price value at 0 line of the object: 1.03092, at line 1: 1.02753
  [096] For time 2025.01.02 14:00 the price value at 0 line of the object: 1.03054, at line 1: 1.02715
  [095] For time 2025.01.02 14:30 the price value at 0 line of the object: 1.03016, at line 1: 1.02677
  [094] For time 2025.01.02 15:00 the price value at 0 line of the object: 1.02979, at line 1: 1.02640
  [093] For time 2025.01.02 15:30 the price value at 0 line of the object: 1.02941, at line 1: 1.02602
  [092] For time 2025.01.02 16:00 the price value at 0 line of the object: 1.02903, at line 1: 1.02564
  [091] For time 2025.01.02 16:30 the price value at 0 line of the object: 1.02866, at line 1: 1.02527
  [090] For time 2025.01.02 17:00 the price value at 0 line of the object: 1.02828, at line 1: 1.02489
  [089] For time 2025.01.02 17:30 the price value at 0 line of the object: 1.02790, at line 1: 1.02451
  [088] For time 2025.01.02 18:00 the price value at 0 line of the object: 1.02753, at line 1: 1.02414
  [087] For time 2025.01.02 18:30 the price value at 0 line of the object: 1.02715, at line 1: 1.02376
  [086] For time 2025.01.02 19:00 the price value at 0 line of the object: 1.02677, at line 1: 1.02338
  [085] For time 2025.01.02 19:30 the price value at 0 line of the object: 1.02640, at line 1: 1.02301
  [084] For time 2025.01.02 20:00 the price value at 0 line of the object: 1.02602, at line 1: 1.02263
  */
 }
//+------------------------------------------------------------------+
//| インデックスで指定されたバーの時間を返す                                     |
//+------------------------------------------------------------------+
datetime GetTime(const string symbol_name, const int index)
 {
  if(index<0)
    return(0);
  datetime array[1];
  ResetLastError();
  if(CopyTime(symbol_name, PERIOD_CURRENT, index, 1, array)!=1)
    {
    PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__, GetLastError());
    return(0);
    }
  return(array[0]);
 }
//+--------------------------------------------------------------------------------------------+
//| 左端バーの高値から右端バーの低値まで等間隔チャネルを構築する                                              |
//+--------------------------------------------------------------------------------------------+
bool CreateChannel(const long chart_id, const int bar1, const int bar2)
 {
  long     visible=0;
  datetime time1 =0, time2 =0;
  double   price1=0, price2=0;
 
//--- チャートシンボル
  string symbol=ChartSymbol(chart_id);
 
//--- チャート左端に表示されている最初のバーの時間を取得する
  ResetLastError();
  datetime time_array[1];
  if(CopyTime(symbol, PERIOD_CURRENT, (int)bar1, 1, time_array)!=1)
    {
    PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__, GetLastError());
    return(false);
    }
  time1=time_array[0];
 
//--- 右端に表示されているチャートの最初のバーの時刻を取得する
  if(CopyTime(symbol, PERIOD_CURRENT, (int)bar2, 1, time_array)!=1)
    {
    PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__, GetLastError());
    return(false);
    }
  time2=time_array[0];
 
//--- チャート左端に表示されている最初のバーの高値を取得する
  double price_array[];
  if(CopyHigh(symbol, PERIOD_CURRENT, (int)bar1, 1, price_array)!=1)
    {
    PrintFormat("%s: CopyHigh() failed. Error %d",__FUNCTION__, GetLastError());
    return(false);
    }
  price1=price_array[0];
 
//--- チャート右端に表示されている最初のバーの安値を取得する
  if(CopyLow(symbol, PERIOD_CURRENT, (int)bar2, 1, price_array)!=1)
    {
    PrintFormat("%s: CopyLow() failed. Error %d",__FUNCTION__, GetLastError());
    return(false);
    }
  price2=price_array[0];
 
//--- チャートの価格幅を計算する(ポイント単位)
//--- 等間隔チャネルの場合、2本目のラインの距離は価格幅の1/3になる
  double range=price1-price2;
  double distance=range*0.3;
 
//--- 計算された座標に、グラフィックオブジェクト(等間隔チャネル)を作成する
  if(!ObjectCreate(chart_id, OBJ_NAME, OBJ_CHANNEL, 0, time1, price1, time2, price2, time1, price1-distance))
    {
    PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__, GetLastError());
    return(false);
    }
   
//--- チャートを更新して「true」を戻す
  ChartRedraw(chart_id);
  return(true);
 }

 

参照

オブジェクト型