OBJ_GANNLINE

Gann Linie.

ObjGannLine

Hinweis

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

Um die Linienneigung anzugeben, können Sie Gann Winkel mit dem Maßstab und Koordinaten des zweiten Ankerpunktes verwenden.

Beispiel

Das folgende Skript erstellt und bewegt auf dem Chart Objekt "Gann Linie". 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 \"Gann Linie\"."
#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="GannLine";        // Linienname
input int             InpDate1=20;               // Datum des ersten Punktes in %
input int             InpPrice1=75;              // Preis des ersten Punktes in %
input int             InpDate2=80;               // Datum des zweiten Punktes in %
input double          InpAngle=0.0;              // Gann Winkel
input double          InpScale=1.0;              // Maßstab
input color           InpColor=clrRed;           // Linienfarbe
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT// Linienstil
input int             InpWidth=2;                // Linienbreite
input bool            InpBack=false;             // Die Linie im Hintergrund
input bool            InpSelection=true;         // Wählen um zu bewegen
input bool            InpRayLeft=false;          // Fortsetzung der Linie nach links
input bool            InpRayRight=true;          // Fortsetzung der Linie nach rechts
input bool            InpHidden=true;            // Ausgeblendet in der Objektliste
input long            InpZOrder=0;               // Priorität auf Mausklick
//+------------------------------------------------------------------+
//| Erstellt Gann Linie auf Koordinaten, Winkel und Maßstab          |
//+------------------------------------------------------------------+
bool GannLineCreate(const long            chart_ID=0,        // ID des Charts
                    const string          name="GannLine",   // Linienname
                    const int             sub_window=0,      // Nummer des Fensters
                    datetime              time1=0,           // Zeit des ersten Punktes
                    double                price1=0,          // Preis des ersten Punktes
                    datetime              time2=0,           // Zeit des zweiten Punktes
                    const double          angle=1.0,         // Gann Winkel
                    const double          scale=1.0,         // Maßstab
                    const color           clr=clrRed,        // Linienfarbe
                    const ENUM_LINE_STYLE style=STYLE_SOLID// Linienstil
                    const int             width=1,           // Linienbreite
                    const bool            back=false,        // In der Hintergrund
                    const bool            selection=true,    // Wählen um zu bewegen
                    const bool            ray_left=false,    // Fortsetzung der Linie nach links
                    const bool            ray_right=true,    // Fortsetzung der Linie nach rechts
                    const bool            hidden=true,       // Verborgen in der Liste der Objekten
                    const long            z_order=0)         // Priorität für Mausklick
  {
//--- Die Koordinaten der Bezugspunkte angeben, wenn sie nicht gesetzt sind
   ChangeGannLineEmptyPoints(time1,price1,time2);
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- "Gann Linie" auf angegebenen Koordinaten erstellen
//--- Richtige Preiskoordinate des zweiten Ankerpunktes wird automatisch
//--- neu gesetzt nachdem Gann Winkel und (oder) Maßstab verändert ist,
   if(!ObjectCreate(chart_ID,name,OBJ_GANNLINE,sub_window,time1,price1,time2,0))
     {
      Print(__FUNCTION__,
            ": Objekt \" Gann Linie\" konnte nicht erstellt werden! Fehlercode = ",GetLastError());
      return(false);
     }
//--- Gann Winkel ändern
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- Ändern wir den Maßstab (Anzahl der Pips pro Bar)
   ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale);
//--- Farbe der Linie 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 der Linie 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 der Linie nach links
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- aktivieren (true) oder deaktivieren (false) Fortsetzung der Linie 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);
  }
//+------------------------------------------------------------------+
//| Verschiebt den Ankerpunkt von Gann Linien                        |
//+------------------------------------------------------------------+
bool GannLinePointChange(const long   chart_ID=0,      // ID des Charts
                         const string name="GannLine"// Linienname
                         const int    point_index=0,   // Nummer des Ankerpunktes
                         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 der Linie
   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);
  }
//+------------------------------------------------------------------+
//| Ändert Gann Winkel                                               |
//+------------------------------------------------------------------+
bool GannLineAngleChange(const long   chart_ID=0,      // ID des Charts
                         const string name="GannLine"// Linienname
                         const double angle=1.0)       // Gann Winkel
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- Gann Winkel ändern
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
     {
      Print(__FUNCTION__,
            ": Kann den Gann Winkel nicht ändern! Fehlercode = ",GetLastError());
      return(false);
     }
//--- die erfolgreiche Umsetzung
   return(true);
  }
//+------------------------------------------------------------------+
//| Ändert den Maßstab von "Gann Linie"                              |
//+------------------------------------------------------------------+
bool GannLineScaleChange(const long   chart_ID=0,      // ID des Charts
                         const string name="GannLine"// Linienname
                         const double scale=1.0)       // Maßstab
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- Ändern wir den Maßstab (Anzahl der Pips pro Bar)
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,scale))
     {
      Print(__FUNCTION__,
            ": Konnte nicht den Maßstab ändern! Fehlercode = ",GetLastError());
      return(false);
     }
//--- die erfolgreiche Umsetzung
   return(true);
 ;}
//+------------------------------------------------------------------+
//| Die Funktion löscht das Objekt "Gann Linie"                      |
//+------------------------------------------------------------------+
bool GannLineDelete(const long   chart_ID=0,      // ID des Charts
                    const string name="GannLine"// Linienname
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- Gann Linie löschen
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": Objekt \" Gann Linie\" konnte nicht gelöscht werden! Fehlercode = ",GetLastError());
      return(false);
     }
//--- die erfolgreiche Umsetzung
   return(true);
  }
//+------------------------------------------------------------------+
//| Überprüft die Werte der Ankerpunkten von Gann Linie              |
//| und setzt Standardwerte für leere Werte                          |
//+------------------------------------------------------------------+
void ChangeGannLineEmptyPoints(datetime &time1,double &price1,datetime &time2)
  {
//--- wenn die Zeit des zweiten Punktes nicht angegeben ist, wird sie auf dem aktuellen Bar sein
   if(!time2)
      time2=TimeCurrent();
//--- wenn die Zeit des ersten Punktes nicht angegeben ist, wird sie auf 9 Baren nach links vom ersten 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 wird, dann wird es einen Wert von Bid haben
   if(!price1)
      price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  }
//+------------------------------------------------------------------+
//| 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)
     {
      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 von Bezugspunkte der Linie 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 Gann Linie zu zeichnen
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
//--- Gann Linie erstellen
   if(!GannLineCreate(0,InpName,0,date[d1],price[p1],date[d2],InpAngle,InpScale,InpColor,
      InpStyle,InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }
//--- den Chart neu zeichnen und 1 Sekunde warten
   ChartRedraw();
   Sleep(1000);
//--- jetzt bewegen wir den Ankerpunkt von der Linie und ändern den Winkel
//--- Schleifenzähler
   int v_steps=accuracy/2;
//--- Wir bewegen den ersten Bezugspunkt vertikal
   for(int i=0;i<v_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(p1>1)
         p1-=1;
      //--- den Punkt bewegen
      if(!GannLinePointChange(0,InpName,0,date[d1],price[p1]))
         return;
 //--- Überprüfen die Fakten von Zwangsabschaltung der Skript
      if(IsStopped())
         return;
      //--- den Chart neu zeichnen
      ChartRedraw();
     }
//--- Halb-Sekunden-Verzögerung
   Sleep(500);
//--- Definieren wir den aktuellen wert des Gann-Winkels (hat
//--- nach der Bewegung des ersten Punktes geändert)
   double curr_angle;
   if(!ObjectGetDouble(0,InpName,OBJPROP_ANGLE,0,curr_angle))
      return;
//--- Schleifenzähler
   v_steps=accuracy/8;
//--- Gann Winkel ändern
   for(int i=0;i<v_steps;i++)
     {
      if(!GannLineAngleChange(0,InpName,curr_angle-0.05*i))
         return;
 //--- Überprüfen die Fakten von Zwangsabschaltung der Skript
      if(IsStopped())
         return;
      //--- den Chart neu zeichnen
      ChartRedraw();
     }
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//--- die Linie aus dem Chart löschen
   GannLineDelete(0,InpName);
   ChartRedraw();
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//---
  }