DRAW_ARROW

Lo stile DRAW_ARROW disegna frecce del colore specificato (simboli del set Wingdings) in base al valore del buffer dell'indicatore. La larghezza ed il colore dei simboli può essere specificata come per lo stile DRAW_LINE - utilizzando le direttive del compilatore o in modo dinamico con la funzione PlotIndexSetInteger(). I cambiamenti dinamici delle proprietà di plottaggio permettono di cambiare l'aspetto di un indicatore sulla base della situazione attuale.

Il codice simbolo viene impostato utilizzando la proprietà PLOT_ARROW

//--- Definisce il codice simbolo dal carattere Wingdings per disegnare in PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,code);

Il valore predefinito di PLOT_ARROW=159 (un cerchio).

Ogni freccia è in realtà un simbolo che ha l'altezza ed il punto di ancoraggio, e può coprire alcune importanti informazioni su un grafico (per esempio, il prezzo di chiusura alla bar). Quindi, possiamo anche specificare lo slittamento verticale in pixel, che non dipende dalla scala del grafico. Le frecce saranno spostate verso il basso per il numero di pixel specificato, anche se i valori dell'indicatore rimarranno gli stessi:

//--- Imposta lo spostamento verticale di frecce in pixel
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);

Un valore negativo di PLOT_ARROW_SHIFT significa lo spostamento delle frecce verso l'alto, un valore positivo slitta la freccia verso il basso.

Lo stile DRAW_ARROW può essere utilizzato in una sottofinestra separata di un grafico e nella sua finestra principale. Valori vuoti non vengono disegnati e non compaiono nella "Finestra Dati"; tutti i valori dei buffer indicatori devono essere impostati in modo esplicito. I buffer non vengono inizializzati con un valore zero.

//--- Imposta un valore vuoto
   PlotIndexSetDouble(index_of_plot_DRAW_ARROW,PLOT_EMPTY_VALUE,0);

Il numero di buffer necessari per il plotting di DRAW_ARROW è 1.

Un esempio di indicatore, che disegna frecce su ciascuna barra con il prezzo close superiore al prezzo di chiusura della barra precedente. Il colore, spessore, slittamento e codice simbolo di tutte le frecce vengono cambiati in modo casuale ogni N ticks.

Un esempio di stile DRAW_ARROW

Nell'esempio, per Plot1 con lo stile DRAW_ARROW, la proprietà, il colore e la grandezza vengono specificati utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate() le proprietà sono 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_ARROW.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 mostrare DRAW_ARROW"
#property description "Disegna frecce impostate da caratteri Unicode, su un grafico"
#property description "Il colore, grandezza, slittamento e codice del smbolo vengono cambiati in modo casuale"
#property description "dopo ogni N ticks"
#property description "Il parametro code imposta il valore base: code=159 (un cerchio)"
 
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- disegna Frecce
#property indicator_label1  "Arrows"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen
#property indicator_width1  1
//--- parametri di input
input int      N=5;         // Numero di ticks da cambiare 
input ushort   code=159;    // Codice simbolo da disegnare in DRAW_ARROW
//--- Un buffer indicatore per il disegno
double         ArrowsBuffer[];
//--- Un array per salvare i colori
color colors[]={clrRed,clrBlue,clrGreen};
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura buffers indicatore
   SetIndexBuffer(0,ArrowsBuffer,INDICATOR_DATA);
//--- Definisce il codice simbolo per il disegnamento in PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,code);
//--- Imposta lo spostamento verticale di frecce in pixel
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,5);
//--- Imposta come un valore vuoto 0
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
   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 il colore, la grandezza , slittamento e codice della freccia
   ticks++;
//--- Se un numero critico di ticks è stato accumulato
   if(ticks>=N)
     {
      //--- Cambia le proprietà della linea
      ChangeLineAppearance();
      //--- Resetta il contatore dei ticks a zero
      ticks=0;
     }
 
//--- Blocco per il calcolo dei valori dell'indicatore
   int start=1;
   if(prev_calculated>0) start=prev_calculated-1;
//--- Ciclo del calcolo
   for(int i=1;i<rates_total;i++)
     {
      //--- Se il prezzo Close corrente è maggiore di quello precedente, disegna una freccia
      if(close[i]>close[i-1])
         ArrowsBuffer[i]=close[i];
      //--- Altrimenti specifica il valore zero
      else
         ArrowsBuffer[i]=0;
     }
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }
//+--------------------------------------------------------------------------------+
//| Modifica l'aspetto dei simboli nell' indicatore                                |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Una stringa per la formazione di informazioni sulle proprietà degli indicatori
   string comm="";
//--- Un blocco per il cambio del colore della freccia
   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 cambiare la dimensione delle frecce
   number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
   int width=number%5;   // La grandezza è impostata da 0 a 4
//--- Imposta il colore come proprietà PLOT_LINE_WIDTH
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,width);
//--- Scrive la grandezza della freccia
   comm=comm+"\r\nWidth="+IntegerToString(width);
 
//--- Un blocco per il cambio del codice della freccia (PLOT_ARROW)
   number=MathRand();
//--- Ottiene il resto della divisione intera per calcolare un nuovo codice della freccia (da 0 a 19)
   int code_add=number%20;
//--- Imposta il nuovo codice simbolo come il risultato di code+code_add
   PlotIndexSetInteger(0,PLOT_ARROW,code+code_add);
//--- Scrive il codice simbolo PLOT_ARROW
   comm="\r\n"+"PLOT_ARROW="+IntegerToString(code+code_add)+comm;
 
//--- Un blocco per cambiare lo slittamento verticale delle frecce in pixel
   number=MathRand();
//--- Prende lo slittamento come il resto della divisione intera
   int shift=20-number%41;
//--- Imposta il nuovo slittamento da -20 a 20
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,shift);
//--- Scrive lo slittamento di PLOT_ARROW_SHIFT
   comm="\r\n"+"PLOT_ARROW_SHIFT="+IntegerToString(shift)+comm;
 
//--- Imposta le informazioni del grafico usando un commento
   Comment(comm);
  }