//--- descrizione #property description "Lo script crea una freccia casuale nella finestra chart." #property description "Le coordinate del punto di ancoraggio sono impostate in" #property description "percentuale della grandezza della finestra 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="Arrow"; // Nome della freccia input int InpDate=50; // data del punto di ancoraggio in % input int InpPrice=50; // prezzo del punto di ancoraggio, in % input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Tipo di ancoraggio input color InpColor=clrDodgerBlue; // Colore della Freccia ingressoENUM_LINE_STYLE InpStyle=STYLE_SOLID; // Confine stile di linea input int InpWidth=10; // Grandezza della Freccia input bool InpBack=false; // Sottofondo Freccia input bool InpSelection=false; // Evidenzia di movimento input bool InpHidden=true; // Nascosta nella lista oggetti input long InpZOrder=0; // Priorità per il click del mouse //+--------------------------------------------------------------------------------+ //| Crea la freccia | //+--------------------------------------------------------------------------------+ bool ArrowCreate(const long chart_ID=0, // ID del chart const string name="Arrow", // nome della freccia const int sub_window=0, // indice sottofinestra datetime time=0, // punto di ancoraggio tempo double price=0, // prezzo punto di ancoraggio const uchar arrow_code=252, // codice freccia const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // posizione punto di ancoraggio const color clr=clrRed, // colore freccia const ENUM_LINE_STYLE style=STYLE_SOLID, // stile del bordo della linea const int width=3, // grandezza della freccia arrow const bool back=false, // in sottofondo const bool selection=true, // evidenzia del 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 ChangeArrowEmptyPoint(time,price); //--- resetta il valore dell' errore ResetLastError(); //--- creare una freccia if(!ObjectCreate(chart_ID,name,OBJ_ARROW,sub_window,time,price)) { Print(__FUNCTION__, ": fallimento nel creare la freccia! Error code = ",GetLastError()); return(false); } //--- imposta il codice freccia ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,arrow_code); //--- imposta il tipo di ancora ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); //--- imposta il colore della freccia ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- imposta lo stile del bordo linea ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- imposta la grandezza della freccia 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 spostare la freccia con il mouse //--- 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); } //+--------------------------------------------------------------------------------+ //| Sposta il punto di ancoraggio | //+--------------------------------------------------------------------------------+ bool ArrowMove(const long chart_ID=0, // ID del chart const string name="Arrow", // nome dell'oggetto datetime time=0, // coordinate orario, del punto di ancoraggio double price=0) // coordinate 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,0,time,price)) { Print(__FUNCTION__, ": fallimento nello spostare il punto di ancoraggio! Error code = ",GetLastError()); return(false); } //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //| Modifica il codice freccia | //+--------------------------------------------------------------------------------+ bool ArrowCodeChange(const long chart_ID=0, // ID del chart const string name="Arrow", // nome dell'oggetto const uchar code=252) // codice freccia { //--- resetta il valore dell' errore ResetLastError(); //--- cambia il codice freccia if(!ObjectSetInteger(chart_ID,name,OBJPROP_ARROWCODE,code)) { Print(__FUNCTION__, ": fallimento nel cambiare il codice freccia! Error code = ",GetLastError()); return(false); } //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //| Cambia il tipo di ancoraggio | //+--------------------------------------------------------------------------------+ bool ArrowAnchorChange(const long chart_ID=0, // ID del chart const string name="Arrow", // nome dell'oggetto const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // tipo di ancoraggio { //--- resetta il valore dell' errore ResetLastError(); //--- cambia il tipo di ancora if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor)) { Print(__FUNCTION__, ": fallimento nel cambiare il tipo di ancora! Error code = ",GetLastError()); return(false); } //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //--- creare una freccia | //+--------------------------------------------------------------------------------+ bool ArrowDelete(const long chart_ID=0, // ID del chart const string name="Arrow") // nome della freccia { //--- resetta il valore dell' errore ResetLastError(); //--- elimina la freccia if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": fallimento nell'eliminare la freccia! Error code = ",GetLastError()); return(false); } //--- esecuzione avvenuta return(true); } //+--------------------------------------------------------------------------------+ //| Controlla i valori di punto di ancoraggio ed imposta i valori di default | //| per quelli vuoti | //+--------------------------------------------------------------------------------+ void ChangeArrowEmptyPoint(datetime &time,double &price) { //--- se il tempo del punto non è impostato, sarà sulla barra corrente if(!time) time=TimeCurrent(); //--- se il prezzo del punto non è impostato, avrà un valore Bid if(!price) price=SymbolInfoDouble(Symbol(),SYMBOL_BID); } //+--------------------------------------------------------------------------------+ //| Funzione di avvio del programma Script | //+--------------------------------------------------------------------------------+ voidOnStart() { //--- imposta la correttezza dei parametri di input if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>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 del segno di ancoraggio 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 la freccia int d=InpDate*(bars-1)/100; int p=InpPrice*(accuracy-1)/100; //--- crea la freccia sul grafico if(!ArrowCreate(0,InpName,0,date[d],price[p],32,InpAnchor,InpColor, InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder)) { return; } //--- redisegna il chart ChartRedraw(); //--- considera tutti i casi di creazione delle frecce in loop for(int i=33;i<256;i++) { if(!ArrowCodeChange(0,InpName,(uchar)i)) return; //--- controlla se l'operazione dello script è stata disabilitata per forza if(IsStopped()) return; //--- ridisegna il chart ChartRedraw(); // ritardo di mezzo secondo Sleep(500); } //--- 1 secondo di ritardo Sleep(1000); //--- elimina la freccia dal grafico ArrowDelete(0,InpName); ChartRedraw(); //--- 1 secondo di ritardo Sleep(1000); //--- } |