#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#define OBJ_NAME "TestObjectGetTimeByValue" // 그래픽 객체 이름
#define STEP 100 // 가격 단계
/+------------------------------------------------------------------+
//| Script program start function |
/+------------------------------------------------------------------+
void OnStart()
{
//--- ID, 심볼
long chart_id=ChartID();
string chart_symbol=ChartSymbol(chart_id);
//--- 차트 심볼의 포인트 값을 가져옵니다
double point=SymbolInfoDouble(chart_symbol, SYMBOL_POINT);
if(point==0)
{
PrintFormat("Failed to get the Point value of the \"%s\" symbol. Error %d", chart_symbol, GetLastError());
return;
}
//--- 왼쪽의 보이는 바의 High에서 오른쪽 보이는 막대의 Low까지의 등거리 채널을 구축합니다.
if(!CreateChannel(chart_id))
return;
//--- 차트 최대 및 최소, 차트 심볼 Digits
double chart_max=ChartGetDouble(chart_id, CHART_PRICE_MAX);
double chart_min=ChartGetDouble(chart_id, CHART_PRICE_MIN);
int digits=(int)SymbolInfoInteger(chart_symbol, SYMBOL_DIGITS);
//--- 계산된 가격이 차트의 최소 가격 값보다 큰 경우,
//--- STEP을 사용하여 차트 가격을 루프로 돌면서 시간 값을 얻습니다.
//--- 등거리 채널의 각 라인의 계산된 가격 값입니다.
//--- 저널에 각 라인에 대한 수신 시간을 출력합니다.
int index=0;
double price=chart_max;
do
{
price=chart_max-STEP*index*point;
datetime time0=ObjectGetTimeByValue(chart_id, OBJ_NAME, price, 0);
datetime time1=ObjectGetTimeByValue(chart_id, OBJ_NAME, price, 1);
string time0_str=(time0>0 ? TimeToString(time0) : "No value at this price");
string time1_str=(time1>0 ? TimeToString(time0) : "No value at this price");
string idx=StringFormat("%02d", index);
PrintFormat("[%s] For price %.*f the time value at line 0: %s, at line 1: %s", idx, digits, price, time0_str, time1_str);
index++;
}
while(!IsStopped() && price>=chart_min);
//--- 5초간 기다렸다가 정리
Sleep(5000);
ObjectDelete(chart_id, OBJ_NAME);
ChartRedraw(chart_id);
/*
결과:
[00] For price 1.26110 the time value at line 0: No value at this price, at line 1: No value at this price
[01] For price 1.26010 the time value at line 0: 2024.12.30 17:00, at line 1: No value at this price
[02] For price 1.25910 the time value at line 0: 2024.12.30 22:30, at line 1: No value at this price
[03] For price 1.25810 the time value at line 0: 2024.12.31 04:00, at line 1: 2024.12.30 16:30
[04] For price 1.25710 the time value at line 0: 2024.12.31 10:00, at line 1: 2024.12.30 22:00
[05] For price 1.25610 the time value at line 0: 2024.12.31 15:30, at line 1: 2024.12.31 03:30
[06] For price 1.25510 the time value at line 0: 2024.12.31 21:00, at line 1: 2024.12.31 09:00
[07] For price 1.25410 the time value at line 0: 2025.01.02 03:30, at line 1: 2024.12.31 14:30
[08] For price 1.25310 the time value at line 0: No value at this price, at line 1: 2024.12.31 20:30
[09] For price 1.25210 the time value at line 0: No value at this price, at line 1: 2025.01.02 03:00
[10] For price 1.25110 the time value at line 0: No value at this price, at line 1: No value at this price
[11] For price 1.25010 the time value at line 0: No value at this price, at line 1: No value at this price
[12] For price 1.24910 the time value at line 0: No value at this price, at line 1: No value at this price
[13] For price 1.24810 the time value at line 0: No value at this price, at line 1: No value at this price
*/
}
//+--------------------------------------------------------------------------------------------+
//| 왼쪽의 바의 고점에서 오른쪽 바의 저점까지 등거리 채널을 구성합니다. |
//+--------------------------------------------------------------------------------------------+
bool CreateChannel(const long chart_id=0)
{
long bar1 =0, bar2 =0, visible=0;
datetime time1 =0, time2 =0;
double price1=0, price2=0;
//--- 차트의 첫 번째 바를 왼쪽에 표시
ResetLastError();
if(!ChartGetInteger(chart_id, CHART_FIRST_VISIBLE_BAR, 0, bar1))
{
PrintFormat("%s: ChartGetInteger() failed. Error %d",__FUNCTION__, GetLastError());
return(false);
}
//--- 차트에 보이는 바의 수
if(!ChartGetInteger(chart_id, CHART_VISIBLE_BARS, 0, visible))
{
PrintFormat("%s: ChartGetInteger() failed. Error %d",__FUNCTION__, GetLastError());
return(false);
}
//--- 획득한 값을 조정하고 오른쪽에 보이는 첫 번째 바의 인덱스를 계산합니다.
bar1-=1;
visible-=2;
bar2=bar1-visible;
//--- 차트 심볼
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];
//--- 차트의 가격 범위를 포인트 단위로 계산합니다.
//--- 등거리 채널의 경우 두 번째 라인의 거리는 가격 범위의 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);
}
|