DRAW_ZIGZAG

Lo stile DRAW_ZIGZAG disegna segmenti di un colore specificato in base ai valori dei due buffer indicatori. Questo stile è molto simile a DRAW_SECTION, ma a differenza di quest'ultimo, permette di disegnare segmenti verticali all'interno di una barra, se i valori di entrambi i buffer indicatori sono impostati per questa barra. I segmenti vengono tracciati da un valore nel primo buffer di un valore nel secondo buffer indicatore. Nessuno dei buffer può contenere solo valori vuoti, perché in questo caso nulla è tracciato.

La larghezza, il colore e lo stile della linea possono essere specificati come per lo stile DRAW_SECTION - con le direttive del compilatore o dinamicamente utilizzando la funzione PlotIndexSetInteger(). Cambiamenti dinamici delle proprietà di plotting permettono di "animare" gli indicatori, in modo che il loro aspetto cambi a seconda della situazione attuale.

Le sezioni vengono disegnate da un valore non vuoto di un buffer ad un valore non vuoto di un altro buffer indicatore. Per specificare quale valore deve essere considerato come "vuoto", impostare questo valore nella proprietà PLOT_EMPTY_VALUE:

/ / --- Il valore 0 (vuoto) parteciperà al disegno
   PlotIndexSetDouble(index_of_plot_DRAW_ZIGZAG,PLOT_EMPTY_VALUE,0);

Riempie esplicitamente i valori dei buffer indicatori, imposta un valore vuoto in un buffer per saltare le barre.

Il numero di buffer necessari per tracciare DRAW_ZIGZAG è 2.

Un esempio di indicatore che traccia una sega sulla base dei prezzi High e Low. Il colore, la larghezza e lo stile delle linee a zig-zag cambiano in modo casuale ogni N ticks.

Un esempio di DRAW_ZIGZAG

Notare che inizialmente per Plot1 con DRAW_ZIGZAG le proprietà vengono impostate utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() queste proprietà vengono impostate in modo casuale. Il parametro N è impostato in parametri esterni dell'indicatore per la possibilità di configurazione manuale (la scheda Parametri nella finestra Proprietà del indicatore).

//+--------------------------------------------------------------------------------+
//|                                                                DRAW_ZIGZAG.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 "Un indicatore per dimostrare DRAW_ZIGZAG"
#property description "Esso disegna una sega come segmenti dritti, saltando le barre di un giorno"
#property description "Il giorno da saltare è selezionato a caso durante l'avvio dell' indicatore"
#property description "Il colore, spessore e stile dei segmenti vengono cambiati in modo casuale"
#property description " ogni N ticks"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ZigZag
#property indicator_label1  "ZigZag"
#property indicator_type1   DRAW_ZIGZAG
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- parametri di input
input int      N=5;              // Numero di ticks da cambiare 
//--- buffers indicatore
double         ZigZagBuffer1[];
double         ZigZagBuffer2[];
//--- Il giorno della settimana per il quale l'indicatore non viene tracciato
int invisible_day;
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen};
//--- Un array per memorizzare gli stili di linea
ENUM_LINE_STYLE styles[]={STYLE_SOLID,STYLE_DASH,STYLE_DOT,STYLE_DASHDOT,STYLE_DASHDOTDOT};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- Legatura Array e buffer indicatore
   SetIndexBuffer(0,ZigZagBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ZigZagBuffer2,INDICATOR_DATA);
//--- Ottiene un valore casuale da 0 a 6, per questo giorno l'indicatore non è tracciato
   invisible_day=MathRand()%6;
/ / --- Il valore 0 (vuoto) parteciperà al disegno
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
/ / --- Il valore 0 (vuoto) parteciperà al disegno
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag1;ZigZag2");
//---
   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[])
  {
   static int ticks=0;
//--- Calcola i ticks per cambiare lo stile, il colore e lo spessore della linea
   ticks++;
//--- Se un numero sufficiente di ticks è stato accumulato
   if(ticks>=N)
     {
      //--- Cambia le proprietà della linea
      ChangeLineAppearance();
      //--- Resetta il contatore dei ticks a zero
      ticks=0;
     }
 
//--- La struttura del tempo è richiesta per ottenere il giorno della settimana di ogni barra
   MqlDateTime dt;
 
//--- La posizione di partenza dei calcoli
   int start=0;
//--- Se l'indicatore è stato calcolato sulla tick precedente, allora avviare il calcolo con il penultimo tick
   if(prev_calculated!=0) start=prev_calculated-1;
//--- Ciclo del calcolo
   for(int i=start;i<rates_total;i++)
     {
      //--- Scrive il tempo di apertura della barra nella struttura
      TimeToStruct(time[i],dt);
      //--- Se il giorno della settimana di questa barra è pari ad invisible_day
      if(dt.day_of_week==invisible_day)
        {
         //--- Scrive i valori vuoti per i buffer per questa barra
         ZigZagBuffer1[i]=0;
         ZigZagBuffer2[i]=0;
        }
      //--- Se il giorno della settimana è ok, riempire i buffer
      else
        {
         //--- Se il numero di barre è pari
         if(i%2==0)
           {
            //---  Write High in the 1st buffer and Low in the 2nd one
            ZigZagBuffer1[i]=high[i];
            ZigZagBuffer2[i]=low[i];
           }
         //--- Il numero di barre è dispari
         else
           {
            //--- Compila le barre in un ordine inverso
            ZigZagBuffer1[i]=low[i];
            ZigZagBuffer2[i]=high[i];
           }
        }
     }
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }
//+--------------------------------------------------------------------------------+
//| Modifica l'aspetto dei segmenti a zig-zag                                      |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Una stringa per la formazione di informazioni sulle proprietà ZigZag
   string comm="";
//--- Un blocco per cambiare il colore del ZigZag
   int number=MathRand(); // Ottiene un numero casuale
//--- Il divisore è uguale alla grandezza dell'array colors [] 
   int size=ArraySize(colors);
//--- Ottiene l'indice per selezionare un nuovo colore, come il resto della divisione intera
   int color_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- Scrive il colore della linea
   comm=comm+"\r\n"+(string)colors[color_index];
 
//--- Un blocco per modificare la larghezza della linea
   number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
   int width=number%5;   // La larghezza è impostata da 0 a 4
//--- Imposta il colore come proprietà PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Scrive lo spessore della linea
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Un blocco per cambiare lo stile della linea
   number=MathRand();
//--- Il divisore è uguale alla grandezza dell'array styles
   size=ArraySize(styles);
//--- Ottiene l'indice per selezionare un nuovo stile, come resto della divisione intera
   int style_index=number%size;
//--- Imposta il colore come la proprietà PLOT_LINE_COLOR
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]);
//--- Scrive lo stile della linea
   comm="\r\n"+EnumToString(styles[style_index])+""+comm;
//--- Aggiunge le informazioni sul giorno che viene omesso nei calcoli
   comm="\r\nNot plotted day - "+EnumToString((ENUM_DAY_OF_WEEK)invisible_day)+comm;
//--- Imposta le informazioni del grafico usando un commento
   Comment(comm);
  }