OBJ_TRENDBYANGLE

Winkel Trendlinie.

ObjTrendByAngle

Hinweis

Für die Trendlinie 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 den Winkel und Koordinaten des zweiten Ankerpunktes verwenden.

Beispiel

Das folgende Skript erstellt und bewegt auf dem Chart eine Trendlinie. 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 \"Winkel Trendlinie\"."
#property description "Koordinaten der Ankerpunkten werden in Pixeln angegeben"
#property description "Chartfenster."
//--- Zeigen den Fenster von Eingabeparametern in der Skript-Startup
#property script_show_inputs
//--- Eingangsparameter von Skript
input string          InpName="Trend";     // Linienname
input int             InpDate1=50;         // Datum des ersten Punktes in %
input int             InpPrice1=75;        // Preis des ersten Punktes in %
input int             InpAngle=0;          // Winkel der Linie
input color           InpColor=clrRed;     // Linienfarbe
input ENUM_LINE_STYLE InpStyle=STYLE_DASH// Linienstil
input int             InpWidth=2;          // Linienbreite
input bool            InpBack=false;       // Die Linie im Hintergrund
input bool            InpSelection=true;   // Wählen 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 eine Winkel-Trendlinie                                  |
//+------------------------------------------------------------------+
bool TrendByAngleCreate(const long            chart_ID=0,        // ID des Charts
                        const string          name="TrendLine",  // Linienname
                        const int             sub_window=0,      // Nummer des Unterfensters
                        datetime              time=0,            // Zeit des Punktes
                        double                price=0,           // Preis des Punktes
                        const double          angle=45.0,        // Winkel
                        const color           clr=clrRed,        // Linienfarbe
                        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 der Linie nach links
                    const bool            ray_right=true,    // Fortsetzung der Linie nach rechts
                        const bool            hidden=true,       // Ausgeblendet in der Objektliste
                        const long            z_order=0)         // Priorität auf Mausklick
  {
//--- Um es bequem wäre, die Trendlinie mit dem Maus zu bewegen, erstellen wir einen zweiten Punkt
   datetime time2=0;
   double   price2=0;
//--- Die Koordinaten der Bezugspunkte angeben, wenn sie nicht gesetzt sind
   ChangeTrendEmptyPoints(time,price,time2,price2);
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- eine Trendlinie auf zwei Punkte erstellen
   if(!ObjectCreate(chart_ID,name,OBJ_TRENDBYANGLE,sub_window,time,price,time2,price2))
     {
      Print(__FUNCTION__,
            ": Trendlinie konnte nicht erstellt werden! Fehlercode = ",GetLastError());
      return(false);
     }
//--- Den Winkel der Trendlinie ändern; und in den Prozess der Veränderung des Winkels wird sie Koordinate des zweiten
//--- Punktes der Linie automatisch neu definiert in Übereinstimmung mit dem neuen Winkel
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- 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) Mausbewegung Modus
//--- 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);
  }
//+------------------------------------------------------------------+
//| Ändert die Koordinaten der Ankerpunkte der Trendlinie            |
//+------------------------------------------------------------------+
bool TrendPointChange(const long   chart_ID=0,       // ID des Charts
                      const string name="TrendLine"// Linienname
                      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();
//--- den Ankerpunkt der Trendlinie bewegen
   if(!ObjectMove(chart_ID,name,0,time,price))
     {
      Print(__FUNCTION__,
            ": der Bezugspunkt konnte nicht bewegt werden! Fehlercode = ",GetLastError());
      return(false);
     }
//--- die erfolgreiche Umsetzung
   return(true);
  }
//+------------------------------------------------------------------+
//| Ändert den Winkel der Trendlinie                                 |
//+------------------------------------------------------------------+
bool TrendAngleChange(const long   chart_ID=0,       // ID des Charts
                      const string name="TrendLine"// Name der Trendlinie
                      const double angle=45)         // Winkel der Trendlinie
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- den Winkel der Trendlinie ändern
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle))
     {
      Print(__FUNCTION__,
            ": Kann den Trendlinie Winkel nicht ändern! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- die erfolgreiche Umsetzung
   return(true);
 ;}
//+------------------------------------------------------------------+
//| Löscht die Trendlinie                                            |
//+------------------------------------------------------------------+
bool TrendDelete(const long   chart_ID=0,       // ID des Charts
                 const string name="TrendLine"// Linienname
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- eine Trendlinie löschen
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": Trendlinie konnte nicht gelöscht werden! Fehlercode = ",GetLastError());
      return(false);
     }
//--- die erfolgreiche Umsetzung
   return(true);
  }
//+------------------------------------------------------------------+
//| Überprüft die Werte der Ankerpunkten von Trendlinie              |
//| und setzt Standardwerte für leere Werte                          |
//+------------------------------------------------------------------+
void ChangeTrendEmptyPoints(datetime &time1,double &price1,
                            datetime &time2,double &price2)
  {
//--- Wenn Zeit des ersten Punktes nicht angegeben ist, wird es auf dem aktuellen Bar sein
   if(!time1)
      time1=TimeCurrent();
//--- Wenn der Preis des ersten Punktes nicht angegeben wird, dann wird es einen Wert von Bid haben
   if(!price1)
      price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- setzen wir die Koordinaten des zweiten Hilfspunktes
//--- der zweite Punkt liegt 9 Balken nach links und hat den gleichen Preis
   datetime second_point_time[10];
   CopyTime(Symbol(),Period(),time1,10,second_point_time);
   time2=second_point_time[0];
   price2=price1;
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Überprüfen die Richtigkeit der Eingabeparameter
   if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>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;
//--- Wir definieren Punkte, um die Linie zu zeichnen
   int d1=InpDate1*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
//--- eine Trendlinie erstellen
   if(!TrendByAngleCreate(0,InpName,0,date[d1],price[p1],InpAngle,InpColor,InpStyle,
      InpWidth,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder))
     {
      return;
     }
//--- den Chart neu zeichnen und 1 Sekunde warten
   ChartRedraw();
   Sleep(1000);
//--- jetzt bewegen und drehen wir die Linie
//--- Schleifenzähler
   int v_steps=accuracy/2;
//--- bewegen wir den Ankerpunkt und ändern wir den Winkel der Linie
   for(int i=0;i<v_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(p1>1)
         p1-=1;
      //--- den Punkt bewegen
      if(!TrendPointChange(0,InpName,date[d1],price[p1]))
         return;
      if(!TrendAngleChange(0,InpName,18*(i+1)))
         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
   TrendDelete(0,InpName);
   ChartRedraw();
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//---
  }