ObjectGetDouble

この関数は、対応するオブジェクトプロパティの値を返します。オブジェクトプロパティは double 型でなければなりません。この関数には 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]  オブジェクトプロパティ識別子。値は ENUM_OBJECT_PROPERTY_DOUBLE 列挙のいずれかです。

prop_modifier

[in]  指定されたプロパティの修飾子。1 番目のバージョン例では、デフォルト修飾子の値が 0 に等しいです。ほとんどのプロパティは修飾子を必要としません。修飾子はフィボナッチツールのレベル数及びグラフィックオブジェクトのアンドリューズピッチフォークを示します。 レベルの番号付けは0から始まります。

double_var

[out]  リクエストされたプロパティの値を受け取ったdouble 型の変数

戻り値

最初の呼び出しバージョン例では、double 型の値

2 番目の呼び出しバージョン例では、指定されたプロパティが維持され、その値がdouble_var 変数に置かれている場合には true, それ以外の場合は false。エラーの詳細を読むには 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_id= ChartID();
  string symbol  = ChartSymbol(chart_id);
  int   digits  = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
 
//--- 可視チャートの最大値・最小値にフィボナッチレベルのグラフィックオブジェクトを作成する
  if(!CreateFibo(chart_id))
    return;
     
//--- オブジェクトレベルの数
  int total=(int)ObjectGetInteger(chart_id, OBJ_NAME, OBJPROP_LEVELS);
  double value =0;
  double price0=0;
  double price1=0;
 
//--- アンカーポイント価格
  price0=ObjectGetDouble(chart_id, OBJ_NAME, OBJPROP_PRICE, 0);
  price1=ObjectGetDouble(chart_id, OBJ_NAME, OBJPROP_PRICE, 1);
 
//--- オブジェクトレベルの数によるループ
  for(int i=0; i<total; i++)
    {
    //--- 現在のレベルに設定された値を取得する
    ResetLastError();
    if(!ObjectGetDouble(chart_id, OBJ_NAME, OBJPROP_LEVELVALUE, i, value))
       {
        Print("ObjectGetDouble() failed. Error ", GetLastError());
        return;
       }
     
    //--- オブジェクトのバインディングの最大値・最小値と、その価格差を取得する
    double max=fmax(price0, price1);
    double min=fmin(price0, price1);
    double range=max-min;
     
    //--- オブジェクトの現在レベルの価格を計算する
    double level_price=min+range*value;
     
    //--- レベルの色を設定し、チャートのダーク/ライト背景の両方で見やすくする
    ObjectSetInteger(chart_id, OBJ_NAME, OBJPROP_LEVELCOLOR, i, clrRed);
     
    //--- レベルのフォーマット文字列を設定し、価格とレベル値を同時に表示する
    string level_text=ObjectGetString(chart_id, OBJ_NAME, OBJPROP_LEVELTEXT, i);
    if(StringFind(level_text, EXT)<0)
       {
        level_text+=EXT;
        ObjectSetString(chart_id, OBJ_NAME, OBJPROP_LEVELTEXT, i, level_text);
       }
     
    //--- レベル番号とそのデータ(レベル値と価格)を操作ログに出力する
    PrintFormat("Fibo level [%d] value: %.3f,  price: %.*f", i, value, digits, level_price);
    }
  /*
   結果:
  Fibo level [0] value: 0.000, price: 0.61989
  Fibo level [1] value: 0.236, price: 0.62533
  Fibo level [2] value: 0.382, price: 0.62869
  Fibo level [3] value: 0.500, price: 0.63140
  Fibo level [4] value: 0.618, price: 0.63412
  Fibo level [5] value: 1.000, price: 0.64292
  Fibo level [6] value: 1.618, price: 0.65715
  Fibo level [7] value: 2.618, price: 0.68018
  Fibo level [8] value: 4.236, price: 0.71745
  */
 }
//+------------------------------------------------------------------+
//| 指定チャートにフィボナッチレベルのグラフィックオブジェクトを作成する                     |
//+------------------------------------------------------------------+
bool CreateFibo(const long chart_id)
 {
//--- チャート上の可視価格の最高値から最安値までフィボナッチレベルを描画して取得する
  double   price_high=0, price_low=0;
  datetime time_high =0, time_low =0;
 
  if(!GetChartExtremums(chart_id, price_high, price_low, time_high, time_low))
    return(false);
 
//--- 検出された価格/時間座標にフィボナッチレベルオブジェクトを作成する
  if(!ObjectCreate(chart_id, OBJ_NAME, OBJ_FIBO, WND, time_high, price_high, time_low, price_low))
    {
    PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__, GetLastError());
    return(false);
    }
   
//--- すべて正常。チャートを更新して「true」を戻す
  ChartRedraw();
  return(true);
 }
//+------------------------------------------------------------------+
//| チャート上の最大値・最小値とその時間を戻す                                  |
//+------------------------------------------------------------------+
bool GetChartExtremums(const long chart_id, double &price_high, double &price_low, datetime &time_high, datetime &time_low)
 {
//--- 変数をリセットする
  price_high=price_low=0;
  time_high =time_low =0;
//--- チャートシンボル
  string symbol = ChartSymbol(chart_id);
 
//--- 最初の可視バー番号とチャート上のバー数に基づき、コピーする時系列の範囲の開始位置を計算する
  int first = (int)ChartGetInteger(chart_id, CHART_FIRST_VISIBLE_BAR);
  int count = (int)ChartGetInteger(chart_id, CHART_VISIBLE_BARS);
  int start = first+1-count;
 
//--- 時系列をコピーする配列
  double   array_high[];
  double   array_low[];
  datetime array_time[];
  int     index;
 
//--- 3つの時系列を配列にコピーする(count件、startから開始)
  ResetLastError();
  if(CopySeries(symbol, PERIOD_CURRENT, start, count, COPY_RATES_TIME|COPY_RATES_HIGH|COPY_RATES_LOW, array_time, array_high, array_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);
 }