ObjectGetDouble

La funzione restituisce il valore della proprietà dell'oggetto corrispondente. La proprietà dell' oggetto deve essere di tipo double. Ci sono due varianti della funzione.

1. Restituisce immediatamente il valore della proprietà.

double  ObjectGetDouble(
   long                            chart_id,          // identificatore del grafico
   string                          name,              // nome dell'oggetto
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // identificatore proprietà
   int                             prop_modifier=0    // modificatore proprietà, se richiesto
   );

2. Restituisce true o false, a seconda del successo della funzione. In caso di successo, il valore della proprietà è posto in una variabile passata per riferimento, dall'ultimo parametro.

bool  ObjectGetDouble(
   long                            chart_id,          // identificatore del grafico
   string                          name,              // nome dell'oggetto
   ENUM_OBJECT_PROPERTY_DOUBLE     prop_id,           // identificatore proprietà
   int                             prop_modifier,     // modificatore proprietà
   double&                         double_var         // qui si accetta il valore della proprietà
   );

Parametri

chart_id

[in] Identificatore del Grafico. 0 significa il grafico corrente.

name

[in] Nome dell'oggetto.

prop_id

[in] ID della proprietà dell'oggetto. Il valore può essere uno dei valori dell'enumerazione ENUM_OBJECT_PROPERTY_DOUBLE.

prop_modifier

[in] Modificatore della proprietà specificata. Per la prima variante, il valore del modificatore di default è uguale a 0. La maggior parte delle proprietà non richiedono un modificatore. Esso denota il numero del livello negli strumenti di Fibonacci e nell'oggetto grafico Forche di Andrew's. La numerazione dei livelli parte da zero.

double_var

[Out] Variabile del tipo double, che ha ricevuto il valore della proprietà richiesta.

Valore restituito

Valore del tipo double per la prima variante convocata.

Per la seconda variante la funzione restituisce true, se la proprietà è mantenuta ed il valore è stato inserito nella variabile double_var, altrimenti restituisce false. Per saperne di più sull' errore chiamare GetLastError().

Note

La funzione utilizza una chiamata sincrona, il che significa che la funzione attende l'esecuzione di tutti i comandi che sono stati accodati per questo chart prima della sua chiamata, per cui questa funzione può richiedere molto tempo. Questa funzione deve essere presa in considerazione quando si lavora con un gran numero di oggetti su un chart.

 

Esempio:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectGetDouble"   // Nome dell'oggetto
#define   WND        0                       // Sottofinestra del grafico
#define   EXT        " (%$)"                 // Stringa formattata per la visualizzazione dei valori dei prezzi ai livelli
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- ID grafico corrente, simbolo del grafico e Cifre del simbolo
   long   chart_idChartID();
   string symbol  = ChartSymbol(chart_id);
   int    digits  = (int)SymbolInfoInteger(symbolSYMBOL_DIGITS);
   
//--- costruire l'oggetto grafico Livelli di Fibonacci ai prezzi massimo e minimo del grafico visibile
   if(!CreateFibo(chart_id))
      return;
      
//--- numero dei livelli degli oggetti
   int total=(int)ObjectGetInteger(chart_idOBJ_NAMEOBJPROP_LEVELS);
   double value =0;
   double price0=0;
   double price1=0;
   
//--- prezzi dei punti di ancoraggio
   price0=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE0);
   price1=ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_PRICE1);
   
//--- in un ciclo in base al numero di livelli degli oggetti
   for(int i=0i<totali++)
     {
      //--- ottenere il valore impostato per il livello corrente
      ResetLastError();
      if(!ObjectGetDouble(chart_idOBJ_NAMEOBJPROP_LEVELVALUEivalue))
        {
         Print("ObjectGetDouble() failed. Error "GetLastError());
         return;
        }
      
      //--- ottenere i prezzi massimo e minimo dell'oggetto vincolante e la distanza tra loro in valore di prezzo
      double max=fmax(price0price1);
      double min=fmin(price0price1);
      double range=max-min;
      
      //--- calcolare il valore del prezzo per il livello corrente dell'oggetto
      double level_price=min+range*value;
      
      //--- impostare il colore per il livello in modo che sia visibile sia sugli sfondi scuri che su quelli chiari del grafico
      ObjectSetInteger(chart_idOBJ_NAMEOBJPROP_LEVELCOLORiclrRed);
      
      //--- impostare una stringa di formattazione per il livello in modo che il suo valore di prezzo venga visualizzato insieme al valore del livello
      string level_text=ObjectGetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTi);
      if(StringFind(level_textEXT)<0)
        {
         level_text+=EXT;
         ObjectSetString(chart_idOBJ_NAMEOBJPROP_LEVELTEXTilevel_text);
        }
      
      //--- stampare il numero del livello e i suoi dati - il valore del livello e il suo prezzo - nel journal
      PrintFormat("Fibo level [%d] value: %.3f,  price: %.*f"ivaluedigitslevel_price);
     }
   /*
   risultato:
   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
   */
  }
//+---------------------------------------------------------------------------------------+
//| Creare l'oggetto grafico dei livelli di Fibo sul grafico specificato                  |
//+---------------------------------------------------------------------------------------+
bool CreateFibo(const long chart_id)
  {
//--- disegna i livelli di Fibo dai valori di prezzo visibili più alti a quelli più bassi sul grafico e ottienili
   double   price_high=0price_low=0;
   datetime time_high =0time_low =0;
   
   if(!GetChartExtremums(chart_idprice_highprice_lowtime_hightime_low))
      return(false);
 
//--- costruisci l'oggetto Livelli di Fibo sulle coordinate prezzo/tempo trovate
   if(!ObjectCreate(chart_idOBJ_NAMEOBJ_FIBOWNDtime_highprice_hightime_lowprice_low))
     {
      PrintFormat("%s: ObjectCreate() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
     
//--- tutto è andato bene - aggiorna il grafico e restituisci 'true
   ChartRedraw();
   return(true);
  }
//+------------------------------------------------------------------------------------+
//| Restituire i prezzi massimi e minimi sul grafico e il loro orario                  |
//+------------------------------------------------------------------------------------+
bool GetChartExtremums(const long chart_iddouble &price_highdouble &price_lowdatetime &time_highdatetime &time_low)
  {
//--- reimposta le variabili
   price_high=price_low=0;
   time_high =time_low =0;
//--- simbolo del grafico
   string symbol = ChartSymbol(chart_id);
 
//--- calcola l'inizio dell'intervallo delle serie temporali copiate in base al numero della prima barra visibile e al numero di barre sul grafico
   int first = (int)ChartGetInteger(chart_idCHART_FIRST_VISIBLE_BAR);
   int count = (int)ChartGetInteger(chart_idCHART_VISIBLE_BARS);
   int start = first+1-count;
   
//--- array in cui le serie temporali devono essere copiate
   double   array_high[];
   double   array_low[];
   datetime array_time[];
   int      index;
   
//--- copiare tre serie temporali in array nella quantità di 'count' e a partire da '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);
     }
   
//--- cercare l'indice di prezzo massimo nell'array array_high
   index=ArrayMaximum(array_high);
   if(index<0)
     {
      PrintFormat("%s: ArrayMaximum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- ricordare il prezzo più alto sul grafico visibile e il valore temporale della barra su cui si trova questo prezzo
   price_high=array_high[index];
   time_high=array_time[index];
   
//--- cerca l'indice del prezzo minimo nell'array array_low
   index=ArrayMinimum(array_low);
   if(index<0)
     {
      PrintFormat("%s: ArrayMinimum() failed. Error %d",__FUNCTION__GetLastError());
      return(false);
     }
//--- ricordare il prezzo più basso sul grafico visibile e il valore temporale della barra su cui si trova questo prezzo
   price_low=array_low[index];
   time_low=array_time[index];
   
//--- tutto è andato bene
   return(true);
  }