ObjectGetDouble

이 함수는 해당 개체 속성의 값을 반환합니다. 개체 속성은 double 유형이어야 합니다. 이 함수에는 두 가지 변수가 있습니다.

1. 속성 값을 즉시 반환합니다.

double  ObjectGetDouble(
   long                            chart_id,          // 차트 식별자
   string                          name,              // 개체명
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // 속성 식별자
   int                             prop_modifier=0    // 속성 한정자(필요한 경우)
   );

2. 함수의 성공 여부에 따라 참 또는 거짓을 반환합니다. 성공하면 속성 값이 마지막 매개 변수로 참조로 전달된 수신 변수에 배치됩니다.

bool  ObjectGetDouble(
   long                            chart_id,          // 차트 식별자
   string                          name,              // 개체명
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // 속성 식별자
   int                             prop_modifier,     // 속성 한정자
   double&                         double_var         // 여기서 우리는 속성 값을 받아들입니다
   );

Parameter

chart_id

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

name

[in]  객체명.

prop_id

[in]  개체 속성의 ID. 이 값은 ENUM_OBJECT_PROPERTY_DOUBLE 열거값 중 하나일 수 있습니다.

prop_modifier

[in]  지정한 속성의 한정자. 첫번째 변수의 경우 기본 한정자 값은 0과 같습니다. 대부분의 속성에는 한정자가 필요하지 않습니다. 피보나치 툴과 그래픽 객체 앤드류의 피치포크에서 레벨 수를 나타냅니다. 수준 수는 0부터 시작합니다.

double_var

[out]  요청한 속성 값을 수신한 double 유형의 변수입니다.

반환값

첫 번째 변수 호출에 대한 double 유형 값입니다.

두 번째 변수의 경우 함수는 true를 반환하며, 이 속성이 유지되고 값이 double_var 변수에 배치된 경우, 그렇지 않으면 false를 반환합니다. 에러에 대한 자세한 내용은 GetLastError()를 참조하십시오.

참고

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

 

예:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetDouble"   // Object name
#define   WND        0                       // 차트 하단 창
#define   EXT        " (%$)"                 // 레벨별 가격 값을 표시하기 위한 형식 문자열
 
/+------------------------------------------------------------------+
//| Script program start function                                   |
/+------------------------------------------------------------------+
void OnStart()
  {
//--- 현재 차트 ID, 차트 심볼 및 심볼 Digits
   long   chart_idChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- 보이는 차트의 최대 및 최소 가격으로 피보나치 레벨 그래픽 객체를 구성합니다.
   if(!CreateFibo(chart_id))
      return;
      
//--- 객체 레벨의 수
   int total=(int)ObjectGetInteger(chart_idOBJ_NAMEOBJPROP_LEVELS);
   double value =0;
   double price0=0;
   double price1=0;
   
//--- 앵커 포인트 가격
   price0=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE0);
   price1=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE1);
   
//--- 객체 레벨 수에 따른 루프
   for(int i=0i<totali++)
     {
//--- 현재 레벨에 설정된 값을 가져옵니다.
      ResetLastError();
      if(!ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_LEVELVALUEivalue))
        {
         Print("ObjectGetDouble() failed. Error "GetLastError());
         return;
        }
      
//--- 객체 바인딩의 최대 및 최소 가격과 이 두 가격 사이의 거리를 가격 값으로 가져옵니다.
      double max=fmax(price0price1);
      double min=fmin(price0price1);
      double range=max-min;
      
//--- 객체의 현재 레벨에 대한 가격 값을 계산합니다.
      double level_price=min+range*value;
      
//--- 차트의 어두운 배경과 밝은 배경 모두에서 볼 수 있도록 레벨의 색상을 설정합니다.
      ObjectSetInteger(chart_idOBJ_NAMEOBJPROP_LEVELCOLORiclrRed);
      
//--- 레벨 값과 함께 가격 값이 표시되도록 레벨에 대한 형식 문자열을 설정합니다.
      string level_text=ObjectGetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTi);
      if(StringFind(level_textEXT)<0)
        {
         level_text+=EXT;
         ObjectSetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTilevel_text);
        }
      
//--- 레벨 번호와 그 데이터(레벨 값과 가격)를 저널에 출력합니다.
      PrintFormat("Fibo level [%d] value: %.3f,  price: %.*f"ivaluedigitslevel_price);
     }
   /*
   결과:
   Fibo level [0value0.000,  price0.61989
   Fibo level [1value0.236,  price0.62533
   Fibo level [2value0.382,  price0.62869
   Fibo level [3value0.500,  price0.63140
   Fibo level [4value0.618,  price0.63412
   Fibo level [5value1.000,  price0.64292
   Fibo level [6value1.618,  price0.65715
   Fibo level [7value2.618,  price0.68018
   Fibo level [8value4.236,  price0.71745
   */
  }
/+------------------------------------------------------------------+
//| 지정된 차트에 Fibo 레벨 그래픽 객체를 생성합니다.                    |
/+------------------------------------------------------------------+
bool CreateFibo(const long chart_id)
  {
//---현재 보이는 차트에서 가장 높은 가격 값부터 가장 낮은 가격 값까지 Fibo 레벨을 그려서 가져옵니다.
   double   price_high=0price_low=0;
   datetime time_high =0time_low =0;
   
   if(!GetChartExtremums(chart_idprice_highprice_lowtime_hightime_low))
      return(false);
 
//--- 발견된 가격/시간 좌표에 Fibo Levels 객체를 구성합니다.
   if(!ObjectCreate(chart_idOBJ_NAMEOBJ_FIBOWNDtime_highprice_hightime_lowprice_low))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
     
//--- 모두 좋습니다 - 차트를 업데이트하고 'true'를 반환합니다.
   ChartRedraw();
   return(true);
  }
/+------------------------------------------------------------------+
//| 차트의 최대, 최소 가격과 그 시간을 반환합니다.                        |
/+------------------------------------------------------------------+
bool GetChartExtremums(const long chart_iddouble &price_highdouble &price_lowdatetime &time_highdatetime &time_low)
  {
//--- 변수 재설정
   price_high=price_low=0;
   time_high =time_low =0;
//--- 차트 심볼
   string symbol = ChartSymbol(chart_id);
 
//--- 차트에 보이는 첫 번째 바의 수와 바의 수를 기준으로 복사된 시계열 범위의 시작을 계산합니다.
   int first = (int)ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR);
   int count = (int)ChartGetInteger(chart_idCHART_VISIBLE_BARS);
   int start = first+1-count;
   
//--- timeseries가 복사될 배열
   double   array_high[];
   double   array_low[];
   datetime array_time[];
   int      index;
   
//--- 'count'만큼의 시간 시리즈 3개를 배열에 복사하고 'start'부터 시작합니다.
   ResetLastError();
   if(CopySeries(symbolPERIOD_CURRENTstartcountCOPY_RATES_TIME|COPY_RATES_HIGH|COPY_RATES_LOWarray_timearray_higharray_low)!=count)
     {
      PrintFormat("%s: CopySeries() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
   
//--- array_high 배열에서 최대 가격 지수를 찾습니다.
   index=ArrayMaximum(array_high);
   if(index<0)
     {
      PrintFormat("%s: ArrayMaximum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- 보이는 차트에서 가장 높은 가격과 이 가격이 위치한 바의 최고가를 기억합니다
   price_high=array_high[index];
   time_high=array_time[index];
   
//--- array_low 배열에서 최소 가격 지수를 찾습니다.
   index=ArrayMinimum(array_low);
   if(index<0)
     {
      PrintFormat("%s: ArrayMinimum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- 보이는 차트의 최저가와 이 가격이 위치한 바의 시간 가치를 기억합니다.
   price_low=array_low[index];
   time_low=array_time[index];
   
//--- 모든게 작동합니다
   return(true);
  }