OBJ_FIBOFAN

Fibonacci-Fan.

ObjFiboFan

Hinweis

Für "Fibonacci Fan" können Sie die Anzahl der Linien-Ebenen, ihre Werte und Farben angeben.

Beispiel

Das folgende Skript erstellt und bewegt auf dem Chart Objekt "Fibonacci-Fan". Um die Eigenschaften eines grafischen Objekts zu erstellen und ändern, gibt es speziale Funktionen, die Sie "wie es ist" für Ihre eigenen Programme verwenden können.

 

//--- Beschreibung
#property description "Das Skript erstellt ein graphisches Objekt \"Fibonacci-Fan\"."
#property description "Koordinaten des Bezugspunktes werden in Prozent von"
#property description "der Größe des Chartfensters eingegeben."
//--- Zeigen den Fenster von Eingabeparametern in der Skript-Startup
#property script_show_inputs
//--- Eingangsparameter von Skript
input string          InpName="FiboFan";         // Name
input int             InpDate1=10;               // Datum des ersten Punktes in %
input int             InpPrice1=25;              // Preis des ersten Punktes in %
input int             InpDate2=30;               // Datum des zweiten Punktes in %
input int             InpPrice2=50;              // Preis des zweiten Punktes in %
input color           InpColor=clrRed;           // Linienfarbe
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT// Linienstil
input int             InpWidth=2;                // Linienbreite
input bool            InpBack=false;             // Objekt im Hintergrund
input bool            InpSelection=true;         // Wählen um zu bewegen
input bool            InpHidden=true;            // Ausgeblendet in der Objektliste
input long            InpZOrder=0;               // Priorität auf Mausklick
//+------------------------------------------------------------------+
//| Erstellt Objekt Fibonacci-Fan auf angegebenen Koordinaten        |
//+------------------------------------------------------------------+
bool FiboFanCreate(const long            chart_ID=0,        // ID des Charts
                   const string          name="FiboFan",    // Name von Fan
                   const int             sub_window=0,      // Nummer des Unterfensters 
                   datetime              time1=0,           // Zeit des ersten Punktes
                   double                price1=0,          // Preis des ersten Punktes
                   datetime              time2=0,           // Zeit des zweiten Punktes
                   double                price2=0,          // Preis des zweiten Punktes
                   const color           clr=clrRed,        // Fan Linienfarbe
                   const ENUM_LINE_STYLE style=STYLE_SOLID// Fan Linienstil
                   const int             width=1,           // Fan Linienbreite
                   const bool            back=false,        // Im Hintergrund
                   const bool            selection=true,    // Auswählen um zu bewegen
                   const bool            hidden=true,       // Ausgeblendet in der Objektliste
                   const long            z_order=0)         // Priorität auf Mausklick
  {
//--- Die Koordinaten der Bezugspunkte angeben, wenn sie nicht gesetzt sind
   ChangeFiboFanEmptyPoints(time1,price1,time2,price2);
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- "Fibonacci Fan" auf angegebenen Koordinaten erstellen
   if(!ObjectCreate(chart_ID,name,OBJ_FIBOFAN,sub_window,time1,price1,time2,price2))
     {
      Print(__FUNCTION__,
            ": Objekt \" Fibonacci Fan\" konnte nicht erstellt werden! Fehlercode = ",GetLastError());
      return(false);
     }
//--- Farbe setzen
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- Linienstil setzen
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- Linienbreite setzen
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- Im Vordergrund (false) oder Hintergrund (true) anzeigen
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- aktivieren (true) oder deaktivieren (false) Wählen von Fan für Bewegung
//--- Wenn Sie ein grafisches Objekt durch Funktion ObjectCreate erstellen, das Objekt
//--- kann nicht ausgewählt und verschoben werden. Innerhalb dieser Methode ist der Standardwert des Parameters selection
//--- true, was Sie das Objekt auswählen und verschieben erlaubt
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- Verbergen (true) oder Anzeigen (false) den Namen des graphischen Objektes in der Objektliste
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- setzen die Priorität für eine Mausklick-Ereignisse auf dem Chart
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- die erfolgreiche Umsetzung
   return(true);
  }
//+------------------------------------------------------------------+
//| Gibt die Anzahl der Ebenen und ihren Parameter an                |
//+------------------------------------------------------------------+
bool FiboFanLevelsSet(int             levels,         // Anzahl der Ebenelinien
                      double          &values[],      // Werte der Linien
                      color           &colors[],      // Farbe der Ebenelinien
                      ENUM_LINE_STYLE &styles[],      // Stil der Ebenelinien
                      int             &widths[],      // Breite der Linien
                      const long      chart_ID=0,     // ID des Charts
                      const string    name="FiboFan"// Name von Fan
  {
//--- Überprüfen wir die Größe des Arrays
   if(levels!=ArraySize(colors) || levels!=ArraySize(styles) ||
      levels!=ArraySize(widths) || levels!=ArraySize(widths))
     {
      Print(__FUNCTION__,": Länge des Arrays entspricht nicht der Anzahl der Ebenen, Fehler!");
      return(false);
     }
//--- Die Anzahl der Ebenen angeben
   ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- die Eigenschaften der Ebenen im Zyklus angeben
   for(int i=0;i<levels;i++)
     {
      //--- Wert der Ebene
      ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
      //--- Farbe der Ebene
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]);
      //--- Stil der Ebene
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]);
      //--- Stärke der Ebene
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]);
      //--- Beschreibung der Ebene
      ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
     }
//--- die erfolgreiche Umsetzung
   return(true);
  }
//+------------------------------------------------------------------+
//| Verschiebt den Ankerpunkt von Fibonacci Fan                      |
//+------------------------------------------------------------------+
bool FiboFanPointChange(const long   chart_ID=0,     // ID des Charts
                        const string name="FiboFan"// Name von Fan
                        const int    point_index=0,  // Nummer des Punktes
                        datetime     time=0,         // Zeitkoordinate des Punktes
                        double       price=0)        // Preiskoordinate des Punktes
  {
//--- Wenn die Koordinaten des Punktes nicht angegeben sind, dann verschieben wir es an den aktuellen Bar mit dem Preis Bid
   if(!time)
      time=TimeCurrent();
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- bewegen den Bezugspunkt
   if(!ObjectMove(chart_ID,name,point_index,time,price))
     {
      Print(__FUNCTION__,
            ": der Bezugspunkt konnte nicht bewegt werden! Fehlercode = ",GetLastError());
      return(false);
     }
//--- die erfolgreiche Umsetzung
   return(true);
 ;}
//+------------------------------------------------------------------+
//| Löscht das Objekt "Fibonacci Fan"                                |
//+------------------------------------------------------------------+
bool FiboFanDelete(const long   chart_ID=0,     // ID des Charts
                   const string name="FiboFan"// Name von Fan
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- Fan löschen
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": Objekt \" Fibonacci Fan\" konnte nicht gelöscht werden! Fehlercode = ",GetLastError());
      return(false);
     }
//--- die erfolgreiche Umsetzung
   return(true);
  }
//+------------------------------------------------------------------+
//| Überprüft die Werte der Ankerpunkten von Fibonacci-Fan und       |
//| setzt Standardwerte für leere Werte                              |
//+------------------------------------------------------------------+
void ChangeFiboFanEmptyPoints(datetime &time1,double &price1,
                              datetime &time2,double &price2)
  {
//--- wenn die Zeit des zweiten Punktes nicht angegeben ist, wird sie auf dem aktuellen Bar sein
   if(!time2)
      time2=TimeCurrent();
//--- wenn der Preis des zweiten Punktes nicht angegeben ist, wird er dem Bid-Wert gleich sein
   if(!price2)
      price2=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- wenn die Zeit des ersten Punktes nicht angegeben ist, wird sie auf 9 Baren nach links vom zweiten sein
   if(!time1)
     {
      //--- Array um Eröffnungszeit der letzten 10 Bars aufzunehmen
      datetime temp[10];
      CopyTime(Symbol(),Period(),time2,10,temp);
      //--- stellen wir den ersten Punkt 9 Baren links dem zweiten Punkt
      time1=temp[0];
     }
//--- wenn der Preis des ersten Punktes nicht angegeben ist, bewegen wir ihn 200 Punkte niedriger als der zweite
   if(!price1)
      price1=price2-200*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Überprüfen die Richtigkeit der Eingabeparameter
   if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 || 
      InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100)
     {
      Print("Fehler! Ungültige Eingabeparameter! ");
      return;
    ;}
//--- Die Anzahl der sichtbaren Bars im Chart-Fenster
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
//--- Größe des Arrays price
   int accuracy=1000;
//--- Arrays für Werte von Daten und Preise, die für Setzung und Änderung
//--- der Koordinaten der Ankerpunkten von Fibonacci-Fan verwendet werden
   datetime date[];
   double   price[];
//--- Speicher reservieren
   ArrayResize(date,bars);
   ArrayResize(price,accuracy);
//--- Füllen die Anordnung von Daten
   ResetLastError();
   if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
     {
      Print("Kann nicht den Wert der Zeit kopieren! Fehlercode = ",GetLastError());
      return;
     }
//--- Füllen den Array der Preise
//--- den Minimal- und Maximalwert der Charts finden
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- Schritte der Preisänderung finden und das Array füllen
   double step=(max_price-min_price)/accuracy;
   for(int i=0;i<accuracy;i++)
      price[i]=min_price+i*step;
//--- Definieren die Punkte um Fibonacci-Fan zu zeichnen
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
//--- Objekt erstellen
   if(!FiboFanCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],
      InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder))
     {
      return;
     }
//--- den Chart neu zeichnen und 1 Sekunde warten
   ChartRedraw();
   Sleep(1000);
//--- jetzt bewegen wir die Ankerpunkte von Fan
//--- Schleifenzähler
   int v_steps=accuracy/2;
//--- den ersten Punkt bewegen
   for(int i=0;i<v_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(p1<accuracy-1)
         p1+=1;
      //--- den Punkt bewegen
      if(!FiboFanPointChange(0,InpName,0,date[d1],price[p1]))
         return;
 //--- Überprüfen die Fakten von Zwangsabschaltung der Skript
      if(IsStopped())
         return;
      //--- den Chart neu zeichnen
      ChartRedraw();
     }
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//--- Schleifenzähler
   int h_steps=bars/4;
//--- den zweiten Punkt bewegen
   for(int i=0;i<h_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(d2<bars-1)
         d2+=1;
      //--- den Punkt bewegen
      if(!FiboFanPointChange(0,InpName,1,date[d2],price[p2]))
         return;
 //--- Überprüfen die Fakten von Zwangsabschaltung der Skript
      if(IsStopped())
         return;
      //--- den Chart neu zeichnen
      ChartRedraw();
      // Verzögerung 0.05 Sekunden
      Sleep(50);
     }
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//--- das Objekt aus dem Chart löschen
   FiboFanDelete(0,InpName);
   ChartRedraw();
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//---
 }