//+--------------------------------------------------------------------------------+
//| Demo_iGator.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "L'indicatore dimostra come ottenere i dati"
#property description "dei buffers indicatore per l'indicatore tecnico iGator."
#property description "Il simbolo e timeframe usati per i calcoli dell'indicatore,"
#property description "vengono impostati dai parametri simbolo e periodo."
#property description "Il metodo per la creazione dell'handle è impostato attraverso il parametro 'type' (funzione type)."
#property description "Tutti gli altri parametri sono simili al Gator Oscillator standard."
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
//--- tracciamento GatorUp
#property indicator_label1 "GatorUp"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrGreen, clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- tracciamento GatorDown
#property indicator_label2 "GatorDown"
#property indicator_type2 DRAW_COLOR_HISTOGRAM
#property indicator_color2 clrGreen, clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//+--------------------------------------------------------------------------------+
//| Enumerazione dei metodi della creazione dell'handle |
//+--------------------------------------------------------------------------------+
enum Creation
{
Call_iGator, // usa iGator
Call_IndicatorCreate // usa IndicatorCreate
};
//--- parametri di input
input Creation type=Call_iGator; // tipo della funzione
input string symbol=" "; // simbolo
input ENUM_TIMEFRAMES period=PERIOD_CURRENT; // timeframe
input int jaw_period=13; // periodo della linea Jaw
input int jaw_shift=8; // slittamento della linea Jaw
input int teeth_period=8; // periodo della linea Teeth
input int teeth_shift=5; // slittamento della linea Teeth
input int lips_period=5; // periodo della linea Lips
input int lips_shift=3; // slittamento della linea Lips
input ENUM_MA_METHOD MA_method=MODE_SMMA; // medoto di media delle linee di Alligator
input ENUM_APPLIED_PRICE applied_price=PRICE_MEDIAN;// tipo di prezzo utilizzato per il calcolo di Alligator
//--- buffers indicatore
double GatorUpBuffer[];
double GatorUpColors[];
double GatorDownBuffer[];
double GatorDownColors[];
//--- variabile per memorizzare l'handle dell'indicatore iGator
int handle;
//--- variabile per memorizzare
string name=symbol;
//--- nome dell'indicatore sul grafico
string short_name;
//--- valori di slittamento per gli istogrammi superiore ed inferiore
int shift;
//--- manterremo il numero di valori nell'indicatore Gator Oscillator
int bars_calculated=0;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//--- assegnazione di array di buffer indicatori
SetIndexBuffer(0,GatorUpBuffer,INDICATOR_DATA);
SetIndexBuffer(1,GatorUpColors,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,GatorDownBuffer,INDICATOR_DATA);
SetIndexBuffer(3,GatorDownColors,INDICATOR_COLOR_INDEX);
/*
Tutti gli slittamenti specificati nei parametri si riferiscono all'indicatore Alligator sulla base del quale viene disegnato il Gator Oscillator!
E' per questo che non spostano l'indicatore Gator in sé, ma spostano le linee Alligator,
i cui valori sono utilizzati per il calcolo del Gator Oscillator!
*/
//--- Calcoliamo lo slittamento per gli istogrammi superiore ed inferiore, che è pari alla differenza tra la linea Jaw la linea Teeth
shift=MathMin(jaw_shift,teeth_shift);
PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//--- nonostante l'indicatore contiene due istogrammi, viene utilzzato lo stesso lo slittamento - questa è l'implementazione dell'indicatore iGator
PlotIndexSetInteger(1,PLOT_SHIFT,shift);
//--- determinare il simbolo per cui viene disegnato l'indicatore
name=symbol;
//--- eliminare gli spazi a destra e a sinistra
StringTrimRight(name);
StringTrimLeft(name);
//--- se il risultato è zero nella lunghezza della stringa 'name'
if(StringLen(name)==0)
{
//--- prende il simbolo del grafico indicatore a cui è attaccato
name=_Symbol;
}
//--- crea l'handle dell'indicatore
if(type==Call_iGator)
handle=iGator(name,period,jaw_period,jaw_shift,teeth_period,teeth_shift,
lips_period,lips_shift,MA_method,applied_price);
else
{
//--- riempie la struttura con i parametri dell'indicatore
MqlParam pars[8];
//--- pediodi e slittamenti delle linee dell' Alligator
pars[0].type=TYPE_INT;
pars[0].integer_value=jaw_period;
pars[1].type=TYPE_INT;
pars[1].integer_value=jaw_shift;
pars[2].type=TYPE_INT;
pars[2].integer_value=teeth_period;
pars[3].type=TYPE_INT;
pars[3].integer_value=teeth_shift;
pars[4].type=TYPE_INT;
pars[4].integer_value=lips_period;
pars[5].type=TYPE_INT;
pars[5].integer_value=lips_shift;
//--- tipo di smussamento
pars[6].type=TYPE_INT;
pars[6].integer_value=MA_method;
//--- tipo di prezzo
pars[7].type=TYPE_INT;
pars[7].integer_value=applied_price;
//--- crea l'handle
handle=IndicatorCreate(name,period,IND_GATOR,8,pars);
}
//--- se l'handle non viene creato
if(handle==INVALID_HANDLE)
{
//--- dice riguardo il fallimento e l'output del codice di errore
PrintFormat("Fallimento nel creare l'handle dell'indicatore iGator per il simbolo %s/%s, codice errore %d",
name,
EnumToString(period),
GetLastError());
//--- l'indicatore si ferma precocemente
return(INIT_FAILED);
}
//--- Mostra il simbolo/timeframe per cui è calcolato l'indicatore Gator Oscillator
short_name=StringFormat("iGator(%s/%s, %d, %d ,%d, %d, %d, %d)",name,EnumToString(period),
jaw_period,jaw_shift,teeth_period,teeth_shift,lips_period,lips_shift);
IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- inizializzazione normale dell'indicatore
return(INIT_SUCCEEDED);
}
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- numero di valori copiati dall' indicatore iGator
int values_to_copy;
//--- determina il numero di valori calcolati in dell'indicatore
int calculated=BarsCalculated(handle);
if(calculated<=0)
{
PrintFormat("BarsCalculated() returned %d, error code %d",calculated,GetLastError());
return(0);
}
//--- se è il primo inizio del calcolo dell'indicatore o se il numero di valori dell'indicatore iGator è cambiato
//--- o se è necessario calcolare l'indicatore per due o più barre (significa che qualcosa è cambiato nello storico prezzi)
if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
{
//--- se l' array GatorUpBuffer è maggiore del numero di valori dell'indicatore iGator per il simbolo/periodo, allora non copiamo tutto
//--- altrimenti, copiamo meno della grandezza del buffer indicatore
if(calculated>rates_total) values_to_copy=rates_total;
else values_to_copy=calculated;
}
else
{
//--- vuol dire che non è la prima volta del calcolo dell'indicatore, e dopo l'ultima chiamata di OnCalculate() )
//--- per il calcolo non viene aggiunta più di una barra
values_to_copy=(rates_total-prev_calculated)+1;
}
//--- riempie gli array con valori dell'indicatore Gator Oscillator
//--- se FillArraysFromBuffer restituisce false, significa che l'informazione non è ancora pronta, chiude l'operazione
if(!FillArraysFromBuffers(GatorUpBuffer,GatorUpColors,GatorDownBuffer,GatorDownColors,
shift,handle,values_to_copy)) return(0);
//--- forma il messaggio
string comm=StringFormat("%s ==> Valore aggiornato nell'indicatore %s: %d",
TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
short_name,
values_to_copy);
//--- visualizza il messaggio di servizio sul grafico
Comment(comm);
//--- memorizzare il numero di valori dell'indicatore Gator Oscillator
bars_calculated=calculated;
//--- restituisce il valore prev_calculated per la chiamata successiva
return(rates_total);
}
//+--------------------------------------------------------------------------------+
//| Riempie il buffer indicatore dall'indicatore iGator |
//+--------------------------------------------------------------------------------+
bool FillArraysFromBuffers(double &ups_buffer[], // buffer indicatore per l'istogramma superiore
double &up_color_buffer[], // buffer indicatore per gli indici dei prezzi dell'istogramma superiore
double &downs_buffer[], // buffer indicatore per l'istogramma inferiore
double &downs_color_buffer[], // buffer indicatore per i prezzi dell'istogramma inferiore buffer for price indexes of the lower histogram
int u_shift, // slittamento per l'istogramma superiore ed inferiore
int ind_handle, // handle dell'indicatore iGator
int amount // numero di valori copiati
)
{
//--- resetta codice errore
ResetLastError();
//--- riempie una parte dell'array GatorUpBuffer con valori dal buffer indicatore che ha indice 0
if(CopyBuffer(ind_handle,0,-u_shift,amount,ups_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iGator, codice errore %d",GetLastError());
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array GatorUpColors con valori dal buffer indicatore che ha indice 1
if(CopyBuffer(ind_handle,1,-u_shift,amount,up_color_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iGator, codice errore %d",GetLastError());
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array GatorDownBuffer con valori dal buffer indicatore che ha indice 2
if(CopyBuffer(ind_handle,2,-u_shift,amount,downs_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iGator, codice errore %d",GetLastError());
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- riempie una parte dell'array GatorDownColors con valori dal buffer indicatore che ha indice 3
if(CopyBuffer(ind_handle,3,-u_shift,amount,downs_color_buffer)<0)
{
//--- se la copia fallisce, dice il codice dell'errore
PrintFormat("Fallimento nel copiare i dati dall'indicatore iGator, codice errore %d",GetLastError());
//--- esce con risultato zero - significa che l'indicatore è considerato come non calcolato
return(false);
}
//--- tutto è ok
return(true);
}
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione indicatore |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- cancella il grafico dopo aver eliminato l'indicatore
Comment("");
}
|