iGator

La funzione restituisce l'handle dell'indicatore Gator. L'oscillatore mostra la differenza tra le linee blu e rossa di Alligator (istogramma superiore) e la differenza tra le linee rossa e verde (istogramma inferiore).

int  iGator(
   string              symbol,            // nome del simbolo
   ENUM_TIMEFRAMES     period,            // periodo
   int                 jaw_period,        // periodo per il calcolo di jaws
   int                 jaw_shift,         // slittamento orizzontale jaws
   int                 teeth_period,      // periodo per il calcolo di teeth
   int                 teeth_shift,       // slittamento orizzontale teeth
   int                 lips_period,       // periodo per il calcolo di lips
   int                 lips_shift,        // slittamento orizzontale lips
   ENUM_MA_METHOD      ma_method,         // tipo di smussamento
   ENUM_APPLIED_PRICE  applied_price      // tipo di prezzo o handle
   );

Parametri

symbol

[in] Il nome del simbolo dello strumento finanziario, i cui dati devono essere utilizzati per calcolare l'indicatore. Il valore NULL significa il simbolo corrente.

period

[in] Il valore del periodo può essere uno dei valori ENUM_TIMEFRAMES, 0 significa il corrente timefreame.

jaw_period

[in] Periodo di mediazione per la linea blu (mascella dell'Alligatore, _* Alligator's Jaw).

jaw_shift

[in] Lo shift per la linea blu relativa al grafico dei prezzi. Non è direttamente collegato con lo slittamento visivo dell'istogramma dell'indicatore.

teeth_period

[in] Periodo medio per la linea rossa (Alligator's Teeth, _*denti dell'alligatore).

teeth_shift

[in] The shift of the red line relative to the price chart. Non è direttamente collegato con lo slittamento visivo dell'istogramma dell'indicatore.

lips_period

[in] Periodo medio per la linea verde (labbra dell'Alligatore, _*Alligator's lips).

lips_shift

[in] Lo slittamento della linea verde rispetto al grafico prezzi. Non è direttamente collegato con lo slittamento visivo dell'istogramma dell'indicatore.

ma_method

[in]  Tipo di smussamento. Può essere uno dei valori di ENUM_MA_METHOD.

applied_price

[in] Il prezzo utilizzato. Può essere una qualsiasi delle costanti ENUM_APPLIED_PRICE o un handle di un altro indicatore.

Valore restituito

Restituisce l'handle di un indicatore tecnico specificato, in caso di fallimento restituisce INVALID_HANDLE. La memoria del computer può essere liberata da un indicatore che non è più utilizzato, utilizzando la funzione IndicatorRelease(), al quale l'handle indicatore viene passato.

Nota

Numeri di buffer: 0 -, UPPER_HISTOGRAM 1 - buffer colore dell'istogramma superiore, 2 - LOWER_HISTOGRAM, 3 - buffer colore dell'istogramma inferiore.

Esempio:

//+--------------------------------------------------------------------------------+
//|                                                                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("");
  }