//--- descrizione #property description "Lo Script disegna l'oggetto grafico \"Fibonacci Time Zones\"." #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="FiboTimes"; // Nome dell'oggetto input int InpDate1=10; // data del 1mo punto, % input int InpPrice1=45; // prezzo del 1mo punto, % input int InpDate2=20; // data del 2ndo punto, % input int InpPrice2=55; // prezzo del 2ndo punto, % input color InpColor=clrRed; // Colore degli oggetti input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Stile della linea input int InpWidth=2; // Spessore della linea input bool InpBack=false; // Oggetto di sottofondo input bool InpSelection=true; // Evidenzia movimento input bool InpHidden=true; // Nascosto nella lista oggetti input long InpZOrder=0; // Priorità per il click del mouse //+--------------------------------------------------------------------------------+ //| Crea le Fibonacci Time Zones dalle coordinate fornite | //+--------------------------------------------------------------------------------+ bool FiboTimesCreate(const long chart_ID=0, // ID del chart const string name="FiboTimes", // nome dell'oggetto const int sub_window=0, // indice sottofinestra datetime time1=0, // orario del primo punto double price1=0, // prezzo del primo punto datetime time2=0, // orario del secondo punto double price2=0, // prezzo del secondo punto const color clr=clrRed, // colore dell'oggetto const ENUM_LINE_STYLE style=STYLE_SOLID, // stile del bordo della linea const int width=1, // spessore della linea const bool back=false, // in sottofondo const bool selection=true, // evidenza movimento 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 ChangeFiboTimesEmptyPoints(time1,price1,time2,price2); //--- resetta il valore dell' errore ResetLastError(); //--- crea le Fibonacci Time Zones dalle coordinate fornite if(!ObjectCreate(chart_ID,name,OBJ_FIBOTIMES,sub_window,time1,price1,time2,price2)) { Print(__FUNCTION__, ": fallimento nel creare le \"Fibonacci Time Zones\"! Error code = ",GetLastError()); return(false); } //--- imposta il colore ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- imposta lo stile della linea ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- larghezza della linea ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- 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); //--- 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); } //+--------------------------------------------------------------------------------+ //| Imposta il numero di livelli ed i loro parametri | //+--------------------------------------------------------------------------------+ bool FiboTimesLevelsSet(int levels, // numero di linee livello double &values[], // valore delle linee livello color &colors[], // colore delle linee livello ENUM_LINE_STYLE &styles[], // stile delle linee livello int &widths[], // spessore delle linee livello const long chart_ID=0, // ID del chart const string name="FiboTimes", // nome dell'oggetto { //--- verifica la grandezza dell'array if(levels!=ArraySize(colors) || levels!=ArraySize(styles) || levels!=ArraySize(widths) || levels!=ArraySize(widths)) { Print(__FUNCTION__,": la lungezza dell'array non corrisponde al numero di livelli, errore!"); return(false); } //--- set the number of levels ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels); //--- imposta le proprietà dei livelli nel loop for(int i=0;i<levels;i++) { //--- valore dei livelli ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]); //--- colore dei livelli ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]); //--- stile dei livelli ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]); //--- spessore dei livelli ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]); //--- descrizione dei livelli ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(values[i],1)); } //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //| Sposta i punti di ancoraggio delleFibonacci Time Zones | //+--------------------------------------------------------------------------------+ bool FiboTimesPointChange(const long chart_ID=0, // ID del chart const string name="FiboTimes", // nome dell'oggetto const int point_index=0, // indice del punto di ancoraggio datetime time=0, // coordinate orarie del punto di ancoraggio double price=0) // coordinate di prezzo del punto di ancoraggio { //--- se il punto della posizione non è impostato, spostarlo nella barra corrente che ha il prezzo Bid if(!time) time=TimeCurrent(); if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- resetta il valore dell' errore ResetLastError(); //--- sposta il punto di ancoraggio if(!ObjectMove(chart_ID,name,point_index,time,price)) { Print(__FUNCTION__, ": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError()); return(false); } //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //| Elimina le Fibonacci Time Zones | //+--------------------------------------------------------------------------------+ bool FiboTimesDelete(const long chart_ID=0, // ID del chart const string name="FiboTimes", // nome dell'oggetto { //--- resetta il valore dell' errore ResetLastError(); //--- elimina l'oggetto if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": fallimento nell'eliminare le \"Fibonacci Time Zones\"! Error code = ",GetLastError()); return(false); } //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //| Controlla i valori delle Fibonacci Time zones ed | //| imposta i valore di default per quelle vuote | //+--------------------------------------------------------------------------------+ void ChangeFiboTimesEmptyPoints(datetime &time1,double &price1, datetime &time2,double &price2) { //--- se l'orario del primo punto non è impostato, sarà sulla barra corrente if(!time1) time1=TimeCurrent(); //--- se il prezzo del punto non è impostato, avrà un valore Bid if(!price1) price1=SymbolInfoDouble(Symbol(),SYMBOL_BID); //--- se l'orario del secondo punto non è impostato, è posizionato 2 barre meno dalla seconda if(!time2) { //--- array per la ricezione dell'orario di apertura delle ultime 3 barre datetime temp[3]; CopyTime(Symbol(),Period(),time1,3,temp); //--- imposta il primo punto 2 barre a sinistra dalla seconda time2=temp[0]; } //--- se il prezzo del secondo punto non è impostato, è uguale a quello del primo punto if(!price2) price2=price1; } //+--------------------------------------------------------------------------------+ //| Funzione di avvio del programma Script | //+--------------------------------------------------------------------------------+ voidOnStart() { //--- imposta la correttezza dei parametri di input if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 || InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>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 cambiare le coordinate dei punti di ancoraggio delle Fibonacci Time Zones 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 le Fibonacci Time Zones int d1=InpDate1*(bars-1)/100; int d2=InpDate2*(bars-1)/100; int p1=InpPrice1*(accuracy-1)/100; int p2=InpPrice2*(accuracy-1)/100; //--- crea un oggetto if(!FiboTimesCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2], InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder)) { return; } //--- redisegna il chart ed attende per 1 secondo ChartRedraw(); Sleep(1000); //--- ora, sposta i punti di ancoraggio //---contatore del ciclo int h_steps=bars*2/5; //--- sposta il secondo punto di ancoraggio for(int i=0;i<h_steps;i++) { //--- usa il seguente valore if(d2<bars-1) d2+=1; //--- sposta il punto if(!FiboTimesPointChange(0,InpName,1,date[d2],price[p2])) 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 h_steps=bars*3/5; //--- move the first anchor point for(int i=0;i<h_steps;i++) { //--- usa il seguente valore if(d1<bars-1) d1+=1; //--- sposta il punto if(!FiboTimesPointChange(0,InpName,0,date[d1],price[p1])) 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); //--- elimina l'oggetto dal chart FiboTimesDelete(0,InpName); ChartRedraw(); //--- 1 secondo di ritardo Sleep(1000); //--- } |