//--- descrizione #property description "Lo Script disegna l'oggetto grafico \"Canale di Deviazione Standard\"." #property description "Le coordinate del punto di ancoraggio sono impostate in percentuale della grandezza della" #property description "finestra del chart." //--- mostra la finestra dei parametri di input durante il lancio dello script #property script_show_inputs //--- parametri di input dello script input string InpName="StdDevChannel"; // Nome del Canale input int InpDate1=10; // data del 1mo punto, % input int InpDate2=40; // data del 2ndo punto, % input double InpScale=1.0; // Deviazione input color InpColor=clrRed; // Colore del canale input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Stile delle linee del canale input int InpWidth=2; // Spessore delle linee del canale input bool InpFill=false; // Riempie il canale con colore input bool InpBack=false; // Canale di sottofondo input bool InpSelection=true; // Evidenzia movimento input bool InpRayLeft=false; // Continuazione del canale a sinistra input bool InpRayRight=false; // Continuazione del canale a destra input bool InpHidden=true; // Nascosto nella lista oggetti input long InpZOrder=0; // Priorità per il click del mouse //+--------------------------------------------------------------------------------+ //| Crea il canale di deviazione standard dalle coordinate fornite | //+--------------------------------------------------------------------------------+ bool StdDevChannelCreate(const long chart_ID=0, // ID del chart const string name="Channel", // nome del canale const int sub_window=0, // indice sottofinestra datetime time1=0, // orario del primo punto datetime time2=0, // orario del secondo punto const double deviation=1.0, // deviazione const color clr=clrRed, // colore del canale const ENUM_LINE_STYLE style=STYLE_SOLID, // stile delle linee del canale const int width=1, // spessore delle linee del canale const bool fill=false, // riempie il canale con colore const bool back=false, // in sottofondo const bool selection=true, // evidenzia movimento const bool ray_left=false, // continuazione del canale sulla sinistra const bool ray_right=false, // continuazione del canale sulla destra const bool hidden=true, // nascosto nella lista oggetti const long z_order=0) // priorità per il click del mouse { //--- imposta coordinate punto di ancoraggio se non sono impostate ChangeChannelEmptyPoints(time1,time2); //--- resetta il valore dell' errore ResetLastError(); //--- crea il canale dalle coordinate date if(!ObjectCreate(chart_ID,name,OBJ_STDDEVCHANNEL,sub_window,time1,0,time2,0)) { Print(__FUNCTION__, ": fallimento nel creare il canale di deviazione strandard! Error code = ",GetLastError()); return(false); } //--- imposta i valori di deviazione che interessano lo spessore del canale ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation); //--- imposta il colore del canale ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- imposta lo stile delle linee del canale ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- imposta lo spessore delle linee del canale ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- abilita (true) o disabilita (false) la modalità di riempimento del canale ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill); //--- mostra in primo piano (false) o sottofondo (true) ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- abilita (true) o disabilita (false) la modalità di evidenzia del canale per lo spostamento //--- quando si crea un oggetto grafico utilizzando la funzione ObjectCreate, l'oggetto non può esser //--- evidenziato e mosso, per default. All'interno di questo metodo, la selezione dei parametri //--- è true per default, il che consente di evidenziare e spostare l'oggetto ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- abilita (true) o disabilita (false) la modalità di continuazione del display del canale a sinistra ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left); //--- abilita (true) o disabilita (false) la modalità di continuazione del display del canale a destra ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right); //--- nascondi (true) o mostra (falso) il nome di oggetto grafico nella lista degli oggetti ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- imposta la priorità per ricevere l'evento di un clic del mouse nel grafico ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //| Sposta il punto di ancoraggio del canale | //+--------------------------------------------------------------------------------+ bool StdDevChannelPointChange(const long chart_ID=0, // ID del chart const string name="Channel", // nome del canale const int point_index=0, // indice del punto di ancoraggio datetime time=0, // coordinate tempo, del punto di ancoraggio { //--- se l'orario non è impostato, sposta il punto sulla barra corrente if(!time) time=TimeCurrent(); //--- resetta il valore dell' errore ResetLastError(); //--- sposta il punto di ancoraggio if(!ObjectMove(chart_ID,name,point_index,time,0)) { Print(__FUNCTION__, ": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError()); return(false); } //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //| Cambia la deviazione del canale | //+--------------------------------------------------------------------------------+ bool StdDevChannelDeviationChange(const long chart_ID=0, // ID del chart const string name="Channel", // nome del canale const double deviation=1.0) // deviation { //--- resetta il valore dell' errore ResetLastError(); //--- cambia l'angolo di pendenza della trendline if(!ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation)) { Print(__FUNCTION__, ": fallimento nel cambiare la deviazione del canale! Error code = ",GetLastError()); return(false); } //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //| Elimina il canale | //+--------------------------------------------------------------------------------+ bool StdDevChannelDelete(const long chart_ID=0, // ID del chart const string name="Channel") // nome del canale { //--- resetta il valore dell' errore ResetLastError(); //--- elimina il canale if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": fallimento nell'eliminare il canale! Error code = ",GetLastError()); return(false); } //--- esecuzione avvenuta return(true); } //+---------------------------------------------------------------------------------------+ //| Controlla i valori dei punti di ancoraggio del canale ed impostare i valori di default| //| per quelli vuoti | //+---------------------------------------------------------------------------------------+ void ChangeChannelEmptyPoints(datetime &time1,datetime &time2) { //--- se l'orario del secondo punto non è impostato, sarà sulla barra corrente if(!time2) time2=TimeCurrent(); //--- se l'orario del primo punto non è impostato, è posizionato 9 barre meno dalla seconda if(!time1) { //--- array per la ricezione dell'orario di apertura delle ultime 10 barre datetime temp[10]; CopyTime(Symbol(),Period(),time2,10,temp); //--- imposta il primo punto 9 barre a sinistra dalla seconda time1=temp[0]; } } //+--------------------------------------------------------------------------------+ //| Funzione di avvio del programma Script | //+--------------------------------------------------------------------------------+ voidOnStart() { //--- imposta la correttezza dei parametri di input if(InpDate1<0 || InpDate1>100 || InpDate2<0 || InpDate2>100) { Print("Error! Valori non corretti dei parametri di input!"); return; } //--- Numero di barre visibili nella finestra del chart int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS); //--- grandezza dell'array prezzo int accuracy=1000; //--- array per la memorizzazione dei valori di data e prezzo da essere usati //--- per impostare e modificare le coordinate dei punti di ancoraggio del canale" datetime date[]; double price[]; //--- allocazione della memoria ArrayResize(date,bars); ArrayResize(price,accuracy); //--- riempie l'array delle date ResetLastError(); if(CopyTime(Symbol(),Period(),0,bars,date)==-1) { Print("Fallimento nella copia dei valori tempo! Error code = ",GetLastError()); return; } /--- riempie l'array dei prezzi //--- trova i valori più alti e più bassi del chart double max_price=ChartGetDouble(0,CHART_PRICE_MAX); double min_price=ChartGetDouble(0,CHART_PRICE_MIN); //--- definisce un cambio di step del prezzo e riempie l'array double step=(max_price-min_price)/accuracy; for(int i=0;i<accuracy;i++) price[i]=min_price+i*step; //--- definisce i punti per disegnare il canale int d1=InpDate1*(bars-1)/100; int d2=InpDate2*(bars-1)/100; //--- crea la deviazione standard del canale if(!StdDevChannelCreate(0,InpName,0,date[d1],date[d2],InpDeviation,InpColor,InpStyle, InpWidth,InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder)) { return; } //--- redisegna il chart ed attende per 1 secondo ChartRedraw(); Sleep(1000); //--- ora, il canale orizzontalmente sulla destra ed espanso //---contatore del ciclo int h_steps=bars/2; //--- sposta il canale for(int i=0;i<h_steps;i++) { //--- usa i seguenti valori if(d1<bars-1) d1+=1; if(d2<bars-1) d2+=1; //--- move the anchor points if(!StdDevChannelPointChange(0,InpName,0,date[d1])) return; if(!StdDevChannelPointChange(0,InpName,1,date[d2])) return; //--- controlla se l'operazione dello script è stata disabilitata per forza if(IsStopped()) return; //--- ridisegna il chart ChartRedraw(); // 0.05 secondi di ritardo Sleep(50); } //--- 1 secondo di ritardo Sleep(1000); //---contatore del ciclo double v_steps=InpDeviation*2; //--- espande il canale for(double i=InpDeviation;i<v_steps;i+=10.0/accuracy) { if(!StdDevChannelDeviationChange(0,InpName,i)) return; //--- controlla se l'operazione dello script è stata disabilitata per forza if(IsStopped()) return; //--- ridisegna il chart ChartRedraw(); } //--- 1 secondo di ritardo Sleep(1000); //--- elimina il canale dal chart StdDevChannelDelete(0,InpName); ChartRedraw(); //--- 1 secondo di ritardo Sleep(1000); //--- } |