OBJ_ARROW

Oggetto Freccia.

ObjArrow

Nota

La posizione del punto di ancoraggio relativa all'oggetto può essere selezionata da ENUM_ARROW_ANCHOR.

Frecce grandi (più di 5) possono essere create solo impostando l'appropriato valore della proprietà OBJPROP_WIDTH quando si scrive un codice MetaEditor.

Il tipo freccia necessaria può essere selezionata impostando uno dei codici simbolo del carattere Wingdings.

Esempio

Lo script che segue crea un oggetto Arrow sul grafico e cambia il suo tipo. Funzioni speciali sono state sviluppate per creare e modificare le proprietà dell'oggetto grafico. È possibile utilizzare queste funzioni "come è" nelle proprie applicazioni.

 

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