DRAW_COLOR_ARROW

Lo stile DRAW_COLOR_ARROW disegna frecce colorate (simboli del set Wingdings) basati sui valori del buffer indicatore. In contrasto a DRAW_ARROW, in questo stile è possibile impostare un colore da un insieme predefinito di colori specificato dalle proprietà di indicator_color1 per ogni simbolo.

La larghezza ed il colore dei simboli possono essere specificati come per lo stile DRAW_ARROW - utilizzando le direttive del compilatore o in modo dinamico utilizzando la funzione PlotIndexSetInteger(). Cambiamenti dinamici delle proprietà di plotting permettono di cambiare l'aspetto di un indicatore sulla base della situazione attuale.

Il codice simbolo viene impostato utilizzando la proprietà PLOT_ARROW

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_COLOR_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(индекс_построения_DRAW_COLOR_ARROW,PLOT_EMPTY_VALUE,0);

Il numero di buffer necessari per il plotting di DRAW_COLOR_ARROW è 2.

  • un buffer per memorizzare il valore del prezzo che viene utilizzato per disegnare il simbolo (più uno slittamento in pixel, dato nella proprietà PLOT_ARROW_SHIFT);
  • un buffer per memorizzare l'indice di colore, che viene utilizzato per disegnare una freccia (ha senso impostare solo valori non vuoti).

Un esempio di indicatore, che disegna frecce su ciascuna barra con il prezzo close superiore al prezzo di chiusura della barra precedente. La larghezza, slittamento e codice simbolo di tutte le frecce vengono cambiate in modo casuale ogni N ticks. Il colore del simbolo dipende dal numero della barra su cui è disegnato.

Un esempio di stile DRAW_COLOR_ARROW

Nell'esempio, per plot1 con lo stile DRAW_COLOR_ARROW, la proprietà, il colore e le dimensioni vengono specificate 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).

Si prega di notare che inizialmente vengono impostati 8 colori utilizzando la direttiva del compilatore #property, e poi nella funzione OnCalculate(), il colore viene impostato in modo casuale da 14 colori che sono memorizzati nella matrice colors[].

//+--------------------------------------------------------------------------------+
//|                                                           DRAW_COLOR_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_COLOR_ARROW"
#property description "Disegna varie frecce-colore impostate da caratteri Unicode, su un grafico"
#property description "Il colore, grandezza, slittamento e codice del simbolo delle frecce vengono cambiati"
#property description "dinamicamente ogni N ticks"
#property description "Il parametro code imposta il valore base: code=159 (un cerchio)"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorArrow
#property indicator_label1  "ColorArrow"
#property indicator_type1   DRAW_COLOR_ARROW
//--- Definisce 8 colori per colorare l'istogramma in base ai giorni della settimana (che sono memorizzati nell'array speciale)
#property indicator_color1  clrRed,clrBlue,clrSeaGreen,clrGold,clrDarkOrange,clrMagenta,clrYellowGreen,clrChocolate
#property indicator_style1  STYLE_SOLID
#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
int            color_sections;
//--- Un buffer indicatore per il disegno
double         ColorArrowBuffer[];
//--- Un buffer per memorizzare gli indici di colore
double         ColorArrowColors[];
//--- Un array per memorizzare i colori contiene 14 elementi
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- mappatura buffers indicatore
   SetIndexBuffer(0,ColorArrowBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorArrowColors,INDICATOR_COLOR_INDEX);
//--- 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);   
//---- Il numero di colori per colorare la sinusoide
   color_sections=8;   // vedere il commento di #property indicator_color1 
//---
   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à delle frecce
      ChangeLineAppearance();
      //--- Cambia i colori usati per disegnare l'istogramma
      ChangeColors(colors,color_sections);
      //--- 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])
         ColorArrowBuffer[i]=close[i];
      //--- In caso contrario, specificare il valore null
      else
         ColorArrowBuffer[i]=0;
      //--- Colore freccia
      int index=i%color_sections;
      ColorArrowColors[i]=index;
     }
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }
//+--------------------------------------------------------------------------------+
//| Cambia il colore dei segmenti della linea                                      |
//+--------------------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
  {
//--- Il numero dei colori
   int size=ArraySize(cols);
//--- 
   string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- Per ogni indice colore definisce un nuovo colore casualmente
   for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
     {
      //--- Ottiene un valore casuale
      int number=MathRand();
      //--- Ottiene un indice nell'array col[] come resto della divisione dell'intero
      int i=number%size;
      //--- Imposta il colore per ogni indice che ha proprietà PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  Il numero di stili grafici
                          PLOT_LINE_COLOR,      //  Identificatore proprietà
                          plot_color_ind,       //  Lìindice del colore, dove scriviamo il colore
                          cols[i]);             //  Un nuovo colore
      //--- Scrivi i colori
      comm=comm+StringFormat("ArrowColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
      ChartSetString(0,CHART_COMMENT,comm);
     }
//---
  }
//+--------------------------------------------------------------------------------+
//| Cambia l'apparenza di una linea visualizzata nell'indicatore                   |
//+--------------------------------------------------------------------------------+
void ChangeLineAppearance()
  {
//--- Una stringa per la formazione di informazioni sulle proprietà di linea
   string comm="";
//--- Un blocco per modificare la larghezza della linea
   int number=MathRand();
//--- Ottiene la larghezza del resto della divisione intera
   int width=number%5; // Lo spessore è impostato 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+" Width="+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
   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);
  }