//+--------------------------------------------------------------------------------+ //| DRAW_SECTION.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_SECTION" #property description "Disegna sezioni dritte ogni N barre" #property description "Il colore, spessore e stile delle sezioni vengono cambiati in modo casuale" #property description "dopo ogni N ticks" #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 //--- plot Section #property indicator_label1 "Section" #property indicator_type1 DRAW_SECTION #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- parametri input input int bars=5; // La lunghezza della sezione in barre input int N=5; // Il numero di ticks per cambiare lo stile delle sezioni //--- Un buffer indicatore per il disegno double SectionBuffer[]; //--- Una variabile ausiliaria per calcolare la fine delle sezioni int divider; //--- 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() { //--- Associa un array e un buffer indicatore SetIndexBuffer(0,SectionBuffer,INDICATOR_DATA); / / --- Il valore 0 (vuoto) parteciperà al disegno PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); //--- Controllare il parametro indicatore if(bars<=0) { PrintFormat("Valore non valido del parametro barra=%d",bars); return(INIT_PARAMETERS_INCORRECT); } else divider=2*bars; //---+ 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 critico di ticks è stato accumulato if(ticks>=N) { //--- Cambia le proprietà della linea ChangeLineAppearance(); //--- Resetta il contatore dei ticks a zero ticks=0; } //--- Il numero della barra da cui inizia il calcolo dei valori degli indicatori int start=0; //--- Se l'indicatore è stato calcolato prima, allora impostare l'inizio sulla barra precedente if(prev_calculated>0) start=prev_calculated-1; //--- Qui ci sono tutti i calcoli dei valori degli indicatori for(int i=start;i<rates_total;i++) { / / --- Ottiene il resto della divisione del numero di barre di 2*barre int rest=i%divider; //--- Se il numero di barre è divisibile per 2*barre if(rest==0) { //--- Imposta la fine della sezione presso il prezzo elevato di questo bar SectionBuffer[i]=high[i]; } //--- Se il resto della divisione è pari a barre, else { //--- Imposta la fine della sezione presso il prezzo elevato di questo bar if(rest==bars) SectionBuffer[i]=low[i]; //--- Se non è successo niente, ignora bar - set 0 else SectionBuffer[i]=0; } } //--- Restituisce il valore prev_calculated per la successiva chiamata della funzione return(rates_total); } //+--------------------------------------------------------------------------------+ //| Modifica l'aspetto delle sezioni dell'indicatore | //+--------------------------------------------------------------------------------+ void ChangeLineAppearance() { //--- Una stringa per la formazione di informazioni sulle proprietà di linea string comm=""; //--- Un blocco del cambiamento del colore della linea 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 la larghezza 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 lo stile della linea PlotIndexSetInteger(0,PLOT_LINE_STYLE,styles[style_index]); //--- Scrive lo stile della linea comm="\r\n"+EnumToString(styles[style_index])+""+comm; //--- Imposta le informazioni del grafico usando un commento Comment(comm); } |