MetaTrader 5 herunterladen

OBJ_EXPANSION

Fibonacci Expansion.

ObjFiboExpansion

Hinweis

Für das Objekt "Fibonacci Expansion" können Sie die weitere Anzeige nach rechts und/oder nach links (Eigenschaften OBJPROP_RAY_RIGHT und OBJPROP_RAY_LEFT jeweils) angeben.

Sie können auch die Anzahl der Linien-Ebenen, ihre Werte und Farben angeben.

Beispiel

Das folgende Skript erstellt und bewegt auf dem Chart Objekt "Fibonacci Expansion". 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 Expansion\"."
#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="FiboExpansion";   // Objektname
input int             InpDate1=10;               // Datum des ersten Punktes in %
input int             InpPrice1=55;              // Preis des ersten Punktes in %
input int             InpDate2=30;               // Datum des zweiten Punktes in %
input int             InpPrice2=10;              // Preis des zweiten Punktes in %
input int             InpDate3=80;               // Datum des dritten Punktes in %
input int             InpPrice3=75;              // Preis des dritten Punktes in %
input color           InpColor=clrRed;           // Objektfarbe
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            InpRayLeft=false;          // Fortsetzung des Objekts nach links
input bool            InpRayRight=false;         // Fortsetzung des Objekts nach rechts
input bool            InpHidden=true;            // Ausgeblendet in der Objektliste
input long            InpZOrder=0;               // Priorität auf Mausklick
//+------------------------------------------------------------------+
//| Erstellt Objekt Fibonacci Expansion auf angegebenen Koordinaten |
//+------------------------------------------------------------------+
bool FiboExpansionCreate(const long            chart_ID=0,           // ID des Charts
                         const string          name="FiboExpansion"// Name
                         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
                         datetime              time3=0,              // Zeit des dritten Punktes
                         double                price3=0,             // Preis des dritten Punktes
                         const color           clr=clrRed,           // Objektfarbe
                         const ENUM_LINE_STYLE style=STYLE_SOLID,    // Linienstil
                         const int             width=1,              // Linienbreite
                         const bool            back=false,           // Im Hintergrund
                         const bool            selection=true,       // Wählen um zu bewegen
                         const bool            ray_left=false,       // Fortsetzung des Objekts nach links
                         const bool            ray_right=false,      // Fortsetzung des Objekts nach rechts
                         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
   ChangeFiboExpansionEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- "Fibonacci Expansion" auf angegebenen Koordinaten erstellen
   if(!ObjectCreate(chart_ID,name,OBJ_EXPANSION,sub_window,time1,price1,time2,price2,time3,price3))
     {
      Print(__FUNCTION__,
            ": Objekt \" Fibonacci Expansion\" konnte nicht erstellt werden! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- Objektfarbe setzen
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- Linienstil setzen
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- Linienbreite angeben
   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) Bewegung des Objekts 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);
//--- aktivieren (true) oder deaktivieren (false) Fortsetzung des Objekts nach links
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- aktivieren (true) oder deaktivieren (false) Fortsetzung des Objekts nach rechts
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- 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 FiboExpansionLevelsSet(int             levels,               // Anzahl der Ebenelinien
                            double          &values[],            // Werte der Linien
                            color           &colors[],            // Farbe der Linien
                            ENUM_LINE_STYLE &styles[],            // Linienstil
                            int             &widths[],            // Breite der Linien
                            const long      chart_ID=0,           // ID des Charts
                            const string    name="FiboExpansion"// Objektname
  {
//--- Ü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,"FE "+DoubleToString(100*values[i],1));
    ;}
//--- die erfolgreiche Umsetzung
   return(true);
 ;}
//+------------------------------------------------------------------+
//| Verschiebt den Ankerpunkt von Fibonacci Expansion                |
//+------------------------------------------------------------------+
bool FiboExpansionPointChange(const long   chart_ID=0,           // ID des Charts
                              const string name="FiboExpansion"// Objektname
                              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 Expansion"                        |
//+------------------------------------------------------------------+
bool FiboExpansionDelete(const long   chart_ID=0,           // ID des Charts
                         const string name="FiboExpansion"// Objektname
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- das Objekt löschen
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": Objekt \" Fibonacci Expansion\" konnte nicht gelöscht werden! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- die erfolgreiche Umsetzung
   return(true);
 ;}
//+------------------------------------------------------------------+
//| Überprüft die Werte der Ankerpunkten von Fibonacci Expansion und |
//| setzt Standardwerte für leere Werte                     |
//+------------------------------------------------------------------+
void ChangeFiboExpansionEmptyPoints(datetime &time1,double &price1,datetime &time2,
                                    double &price2,datetime &time3,double &price3)
  {
//--- wenn die Zeit des dritten (rechten) Punktes nicht angegeben ist, wird sie auf dem aktuellen Bar sein
   if(!time3)
      time3=TimeCurrent();
//--- wenn der Preis des dritten Punktes nicht angegeben ist, wird er dem Bid-Wert gleich sein
   if(!price3)
      price3=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- wenn die Zeit des ersten (linken) Punktes nicht angegeben ist, wird sie auf 9 Baren nach links von drittem sein
//--- Array um die Zeit der Öffnung der letzten 10 Bars zu empfangen 
   datetime temp[];
   ArrayResize(temp,10);
   if(!time1)
     {
      CopyTime(Symbol(),Period(),time3,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, wird er dem Preis des dritten Punktes gleich sein
   if(!price1)
      price1=price3;
//--- wenn die Zeit des zweiten Punktes nicht angegeben ist, wird sie auf 7 Baren von drittem nach links sein
   if(!time2)
      time2=temp[2];
//--- wenn der Preis des zweiten Punktes nicht angegeben ist, bewegen wir ihn 250 Punkte niedriger als der erste
   if(!price2)
      price2=price1-250*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 || 
      InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>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 des Objekts 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 Expansion zu zeichnen
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int d3=InpDate3*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
   int p3=InpPrice3*(accuracy-1)/100;
//--- Fibonacci Expansion erstellen
   if(!FiboExpansionCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
      InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
    ;}
//--- den Chart neu zeichnen und 1 Sekunde warten
   ChartRedraw();
   Sleep(1000);
//--- jetzt bewegen wir die Ankerpunkte
//--- Schleifenzähler
   int v_steps=accuracy/10;
//--- den ersten Punkt bewegen
   for(int i=0;i<v_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(p1>1)
         p1-=1;
      //--- den Punkt bewegen
      if(!FiboExpansionPointChange(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
   v_steps=accuracy/2;
//--- den dritten Punkt bewegen
   for(int i=0;i<v_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(p3>1)
         p3-=1;
      //--- den Punkt bewegen
      if(!FiboExpansionPointChange(0,InpName,2,date[d3],price[p3]))
         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
   v_steps=accuracy*4/5;
//--- den zweiten Punkt bewegen
   for(int i=0;i<v_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(p2<accuracy-1)
         p2+=1;
      //--- den Punkt bewegen
      if(!FiboExpansionPointChange(0,InpName,1,date[d2],price[p2]))
         return;
 //--- Überprüfen die Fakten von Zwangsabschaltung der Skript
      if(IsStopped())
         return;
      //--- den Chart neu zeichnen
      ChartRedraw();
    ;}
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//--- das Objekt aus dem Chart löschen
   FiboExpansionDelete(0,InpName);
   ChartRedraw();
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//---
 ;}