ObjectGetTimeByValue

이 함수는 지정된 개체의 지정된 가격 값에 대한 시간 값을 반환합니다.

datetime  ObjectGetTimeByValue(
   long    chart_id,     // 차트 식별자
   string  name,         // 오브젝트명
   double  value,        // 가격
   int     line_id       // 라인 번호
   );

Parameter

chart_id

[in]  차트 식별자. 0은 현재 차트를 의미합니다.

name

[in]  객체명.

value

[in]  가격 값.

line_id

[in]  라인 식별자.

반환값

지정한 개체의 지정된 가격 값에 대한 시간 값입니다.

참고

이 함수는 동기식 호출을 사용합니다. 이는 이 함수가 호출하기 전에 이 차트에 대해 대기한 모든 명령의 실행을 대기하므로 이 함수는 시간이 많이 걸릴 수 있습니다. 차트에서 많은 개체로 작업할 때는 이 기능을 고려해야 합니다.

객체는 하나의 가격 좌표에 여러 개의 값을 가질 수 있으므로 라인 번호를 지정해야 합니다. 이 함수는 다음 개체에만 적용됩니다.

  • 추세선 (OBJ_TREND)
  • 각도별 추세선 (OBJ_TRENDBYANGLE)
  • Gann line (OBJ_GANNLINE)
  • 등거리 채널 (OBJ_CHANNEL) - 2 lines
  • 선형 회귀 채널 (OBJ_REGRESSION) - 3 lines
  • 표준편차 채널 (OBJ_STDDEVCHANNEL) - 3 lines
  • 애로우드 라인 (OBJ_ARROWED_LINE)

 

예:

#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_symbolSYMBOL_POINT);
   if(point==0)
     {
      PrintFormat("Failed to get the Point value of the \"%s\" symbol. Error %d"chart_symbolGetLastError());
      return;
     }
     
//--- 왼쪽의 보이는 바의 High에서 오른쪽 보이는 막대의 Low까지의 등거리 채널을 구축합니다.
   if(!CreateChannel(chart_id))
      return;
   
//--- 차트 최대 및 최소, 차트 심볼 Digits
   double chart_max=ChartGetDouble(chart_idCHART_PRICE_MAX);
   double chart_min=ChartGetDouble(chart_idCHART_PRICE_MIN);
   int    digits=(int)SymbolInfoInteger(chart_symbolSYMBOL_DIGITS);
 
//--- 계산된 가격이 차트의 최소 가격 값보다 큰 경우,
//--- STEP을 사용하여 차트 가격을 루프로 돌면서 시간 값을 얻습니다.
//--- 등거리 채널의 각 라인의 계산된 가격 값입니다.
//--- 저널에 각 라인에 대한 수신 시간을 출력합니다.
   int index=0;
   double price=chart_max;
   do
     {
      price=chart_max-STEP*index*point;
      datetime time0=ObjectGetTimeByValue(chart_idOBJ_NAMEprice0);
      datetime time1=ObjectGetTimeByValue(chart_idOBJ_NAMEprice1);
      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"idxdigitspricetime0_strtime1_str);
      index++;
     }
   while(!IsStopped() && price>=chart_min);
   
//--- 5초간 기다렸다가 정리
      Sleep(5000);
   ObjectDelete(chart_idOBJ_NAME);
   ChartRedraw(chart_id);
   /*
   결과:
   [00For price 1.26110 the time value at line 0No value at this price,  at line 1No value at this price
   [01For price 1.26010 the time value at line 02024.12.30 17:00at line 1No value at this price
   [02For price 1.25910 the time value at line 02024.12.30 22:30at line 1No value at this price
   [03For price 1.25810 the time value at line 02024.12.31 04:00at line 12024.12.30 16:30
   [04For price 1.25710 the time value at line 02024.12.31 10:00at line 12024.12.30 22:00
   [05For price 1.25610 the time value at line 02024.12.31 15:30at line 12024.12.31 03:30
   [06For price 1.25510 the time value at line 02024.12.31 21:00at line 12024.12.31 09:00
   [07For price 1.25410 the time value at line 02025.01.02 03:30at line 12024.12.31 14:30
   [08For price 1.25310 the time value at line 0No value at this priceat line 12024.12.31 20:30
   [09For price 1.25210 the time value at line 0No value at this priceat line 12025.01.02 03:00
   [10For price 1.25110 the time value at line 0No value at this priceat line 1No value at this price
   [11For price 1.25010 the time value at line 0No value at this priceat line 1No value at this price
   [12For price 1.24910 the time value at line 0No value at this priceat line 1No value at this price
   [13For price 1.24810 the time value at line 0No value at this priceat line 1No value at this price
   */
  }
//+--------------------------------------------------------------------------------------------+
//| 왼쪽의 바의 고점에서 오른쪽 바의 저점까지 등거리 채널을 구성합니다.                                |
//+--------------------------------------------------------------------------------------------+
bool CreateChannel(const long chart_id=0)
  {
   long     bar1  =0bar2  =0visible=0;
   datetime time1 =0time2 =0;
   double   price1=0price2=0;
 
//--- 차트의 첫 번째 바를 왼쪽에 표시
   ResetLastError();
   if(!ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR0bar1))
     {
      PrintFormat("%s: ChartGetInteger() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- 차트에 보이는 바의 수
   if(!ChartGetInteger(chart_idCHART_VISIBLE_BARS0visible))
     {
      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(symbolPERIOD_CURRENT, (int)bar11time_array)!=1)
     {
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   time1=time_array[0];
   
//--- 오른쪽에 보이는 차트의 첫 번째 바의 시간을 가져옵니다.
   if(CopyTime(symbolPERIOD_CURRENT, (int)bar21time_array)!=1)
     {
      PrintFormat("%s: CopyTime() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   time2=time_array[0];
   
//--- 차트 왼쪽에 보이는 첫 번째 바의 최고가를 가져옵니다.
   double price_array[];
   if(CopyHigh(symbolPERIOD_CURRENT, (int)bar11price_array)!=1)
     {
      PrintFormat("%s: CopyHigh() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   price1=price_array[0];
   
//--- 차트 오른쪽에 보이는 첫 번째 바의 저가를 가져옵니다.
   if(CopyLow(symbolPERIOD_CURRENT, (int)bar21price_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_idOBJ_NAMEOBJ_CHANNEL0time1price1time2price2time1price1-distance))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
     
//--- 차트를 업데이트하고 'true'를 반환합니다.
   ChartRedraw(chart_id);
   return(true);
  }

 

참고 항목

객체 유형