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