ObjectGetDouble

函数返回类似物件属性的返回值,物件属性必须是双精度类型。有2个变量函数可以使用。

1. 即时返回属性值。

double  ObjectGetDouble(
   long                            chart_id,          // 图表标识符
   string                          name,              // 物件名称
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // 属性标识符
   int                             prop_modifier=0    // 属性修饰符, 如果需要的话
   );

2. 返回 true 或者 false, 取决于函数是否成功。 如果成功,属性值通过上一参量以引用的方式传递安置接收变量。

bool  ObjectGetDouble(
   long                            chart_id,          // 图表标识符
   string                          name,              // 物件名称
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // 属性标识符
   int                             prop_modifier,     // 属性修饰符
   double&                         double_var         // 这里接受属性值
   );

参量

chart_id

[in]  图表标识符。0代表当前图表。

name

[in]  物件名称。

prop_id

[in] 物件属性ID。值可以是 ENUM_OBJECT_PROPERTY_DOUBLE 值中一个。

prop_modifier

[in]  指定属性修饰语,第一变体,默认修饰语的值是0,大多属性不要求修饰语。表示斐波纳契工具 水平线数量和安德鲁分叉图解物件,水平线编号从0开始。

double_var

[out]  双精度类型变量接收需求属性值。

返回值

第一次调用变体的双精度类型返回值。

第二变体的函数返回真值,如果该属性是被维护的并且值可以放置到double_var 中,否则返回错误值。为了阅读更多关于错误,调用GetLastError()

注意

该函数使用同步调用,这意味着这个函数等待执行在调用之前已入列图表的所有命令,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。

 

示例:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetDouble"   // 对象名称
#define   WND        0                       // 图表子窗口
#define   EXT        " (%$)"                 // 格式化用于显示价格水平的字符串
 
//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 当前图表 ID, 图表交易品种和交易品种小数位数
   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
   */
  }
//+------------------------------------------------------------------+
//| 在指定图表上创建斐波那契水平图形对象                                  |
//+------------------------------------------------------------------+
bool CreateFibo(const long chart_id)
  {
//--- 在图表上从最高到最低的可见价格值绘制斐波那契水平,并获取它们
   double   price_high=0price_low=0;
   datetime time_high =0time_low =0;
   
   if(!GetChartExtremums(chart_idprice_highprice_lowtime_hightime_low))
      return(false);
 
//--- 在找到的价格/时间坐标上构造斐波那契水平对象
   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;
   
//--- 要复制时间序列的数组
   double   array_high[];
   double   array_low[];
   datetime array_time[];
   int      index;
   
//--- 将三个时间序列复制到数组中,数量为“count”,从“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);
  }