MetaTrader 5 herunterladen

OBJ_ARROWED_LINE

Linie mit einem Pfeil.

ObjArrowedLine

Beispiel

Das folgende Skript erstellt und bewegt auf dem Chart eine Linie mit einem Pfeil. 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 das graphische Objekt \"Linie mit einem Pfeil\"."
#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="ArrowedLine"// Name der Linie
input int             InpDate1=35;           // Datum des ersten Punktes in %
input int             InpPrice1=60;          // Preis des ersten Punktes in %
input int             InpDate2=65;           // Datum des zweiten Punktes in %
input int             InpPrice2=40;          // Preis des zweiten Punktes in %
input color           InpColor=clrRed;       // Linienfarbe
input ENUM_LINE_STYLE InpStyle=STYLE_DASH;   // Linienstil
input int             InpWidth=2;            // Linienbreite
input bool            InpBack=false;         // Linie im Hintergrund
input bool            InpSelection=true;     // Wählen zu bewegen
input bool            InpHidden=true;        // in der Liste der Objekten ausgeblendet
input long            InpZOrder=0;           // Priorität auf Mausklick
//+------------------------------------------------------------------+
//| Erstellt eine Linie mit Pfeil auf den angegebenen Koordinaten  |
//+------------------------------------------------------------------+
bool ArrowedLineCreate(const long            chart_ID=0,         // ID des Charts
                       const string          name="ArrowedLine"// Linienname
                       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,         // 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 zu bewegen
                       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
   ChangeArrowedLineEmptyPoints(time1,price1,time2,price2);
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- Wir erstellen eine Linie mit einem Pfeil an den angegebenen Koordinaten
   if(!ObjectCreate(chart_ID,name,OBJ_ARROWED_LINE,sub_window,time1,price1,time2,price2))
     {
      Print(__FUNCTION__,
            ": Eine Linie mit dem Pfeil konnte nicht erstellt werden! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- 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);
//--- 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);
 ;}
//+------------------------------------------------------------------+
//| Bewegt den Bezugspunkt der Linie mit einem Pfeil |
//+------------------------------------------------------------------+
bool ArrowedLinePointChange(const long   chart_ID=0,         // ID des Charts
                            const string name="ArrowedLine"// Linienname
                            const int    point_index=0,      // Nummer des Bezugspunkts
                            datetime     time=0,             // Zeitkoordinate des Bezugspunkts
                            double       price=0)            // Preiskoordinate des Bezugspunkts
  {
//--- 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);
 ;}
//+------------------------------------------------------------------+
//| Die Funktion löscht die Linie mit dem Pfeil aus dem Chart          |
//+------------------------------------------------------------------+
bool ArrowedLineDelete(const long   chart_ID=0,         // ID des Charts
                       const string name="ArrowedLine"// Linienname
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- Die Linie mit einem Pfeil löschen
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": Eine Linie mit dem Pfeil konnte nicht gelöscht werden! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- die erfolgreiche Umsetzung
   return(true);
 ;}
//+------------------------------------------------------------------+
//| Überprüft die Werte der Bezugspunkte der Linie für lehre Werte |
//| setzt Standardwerte |
//+------------------------------------------------------------------+
void ChangeArrowedLineEmptyPoints(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);
//--- Wenn Zeit des zweiten Punktes nicht angegeben ist, wird er 9 Bars nach links vom ersten Punkt sein
   if(!time2)
     {
      //--- Array um Eröffnungszeit der letzten 10 Bars aufzunehmen
      datetime temp[10];
      CopyTime(Symbol(),Period(),time1,10,temp);
      //--- den zweiten Punkt 9 Bars nach links vom ersten Punkt setzen
      time2=temp[0];
    ;}
//--- Wenn der Preis des zweiten Punktes nicht angegeben wird, dann wird es der Preis des ersten Punktes gleich
   if(!price2)
      price2=price1;
 ;}
//+------------------------------------------------------------------+
//| 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 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 d2=InpDate2*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
//--- Die Linie mit einem Pfeil erstellen
   if(!ArrowedLineCreate(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 werden wir die Bezugspunkte der Linie bewegen
//--- Schleifenzähler
   int v_steps=accuracy/5;
//--- Wir bewegen den zweiten Bezugspunkt vertikal
   for(int i=0;i<v_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(p2<accuracy-1)
         p2+=1;
      //--- den Punkt bewegen
      if(!ArrowedLinePointChange(0,InpName,1,date[d2],price[p2]))
         return;
 //--- Überprüfen die Fakten von Zwangsabschaltung der Skript
      if(IsStopped())
         return;
      //--- den Chart neu zeichnen
      ChartRedraw();
    ;}
//--- 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(!ArrowedLinePointChange(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);
//--- Schleifenzähler
   int h_steps=bars/2;
//--- Wir bewegen die beiden Bezugspunkte horizontal gleichzeitig
   for(int i=0;i<h_steps;i++)
     {
      //--- die nächsten Werte nehmen
      if(d1<bars-1)
         d1+=1;
      if(d2>1)
         d2-=1;
      //--- Die Punkte bewegen
      if(!ArrowedLinePointChange(0,InpName,0,date[d1],price[p1]))
         return;
      if(!ArrowedLinePointChange(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.03 Sekunden
      Sleep(30);
    ;}
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//--- Die Linie mit einem Pfeil löschen
   ArrowedLineDelete(0,InpName);
   ChartRedraw();
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//---
 ;}