#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_id= ChartID();
string symbol = ChartSymbol(chart_id);
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_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_id, OBJ_NAME, OBJPROP_LEVELS);
double value =0;
double price0=0;
double price1=0;
//--- prezzi dei punti di ancoraggio
price0=ObjectGetDouble(chart_id, OBJ_NAME, OBJPROP_PRICE, 0);
price1=ObjectGetDouble(chart_id, OBJ_NAME, OBJPROP_PRICE, 1);
//--- in un ciclo in base al numero di livelli degli oggetti
for(int i=0; i<total; i++)
{
//--- ottenere il valore impostato per il livello corrente
ResetLastError();
if(!ObjectGetDouble(chart_id, OBJ_NAME, OBJPROP_LEVELVALUE, i, value))
{
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(price0, price1);
double min=fmin(price0, price1);
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_id, OBJ_NAME, OBJPROP_LEVELCOLOR, i, clrRed);
//--- 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_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);
}
//--- 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", i, value, digits, level_price);
}
/*
risultato:
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
*/
}
//+---------------------------------------------------------------------------------------+
//| 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=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);
//--- costruisci l'oggetto Livelli di Fibo sulle coordinate prezzo/tempo trovate
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);
}
//--- 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_id, double &price_high, double &price_low, datetime &time_high, datetime &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_id, CHART_FIRST_VISIBLE_BAR);
int count = (int)ChartGetInteger(chart_id, CHART_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(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);
}
//--- 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);
}
|