#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);
}
|