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