MetaTrader 5 herunterladen

OBJ_ELLIPSE

Ellipse.

ObjEllipse

Hinweis

Für die Ellipse, können Sie die Farbfüllung durch den Eigenschaften OBJPROP_FILL einstellen.

Beispiel

Das folgende Skript erstellt und bewegt eine Ellipse auf dem Chart. 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 Ellipse auf dem Chart."
#property description "Koordinaten der Ankerpunkten werden"
#property description "als Prozentsatz der Größe des Fensters angegeben"
//--- Zeigen den Fenster von Eingabeparametern in der Skript-Startup
#property script_show_inputs
//--- Eingangsparameter von Skript
input string          InpName="Ellipse";         // Name der Ellipse
input int             InpDate1=30;               // Datum des ersten Punktes in %
input int             InpPrice1=20;              // Preis des ersten Punktes in %
input int             InpDate2=70;               // Datum des zweiten Punktes in %
input int             InpPrice2=80;              // Preis des zweiten Punktes in %
input int             InpDate3=50;               // Datum des dritten Punktes in %
input int             InpPrice3=60;              // Preis des dritten Punktes in %
input color           InpColor=clrRed;           // Farbe der Ellipse
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT// Ellipselinienstil
input int             InpWidth=2;                // Linienbrete der Ellipse
input bool            InpFill=false;             // Farbfüllung der Ellipse
input bool            InpBack=false;             // Ellipse 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 eine Ellipse auf angegebenen Koordinaten   |
//+------------------------------------------------------------------+
bool EllipseCreate(const long            chart_ID=0,        // ID des Charts
                   const string          name="Ellipse",    // Name der Ellipse
                   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,        // Farbe der Ellipse
                   const ENUM_LINE_STYLE style=STYLE_SOLID// Ellipselinienstil
                   const int             width=1,           // Linienbreite der Ellipse
                   const bool            fill=false,        // Farbfüllung der Ellipse
                   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
   ChangeEllipseEmptyPoints(time1,price1,time2,price2,time3,price3);
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- Ellipse auf angegebenen Koordinaten erstellen
   if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2,time3,price3))
     {
      Print(__FUNCTION__,
            ": konnte nicht Ellipse erstellen! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- Ellipsefarbe setzen
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- Stil der Ellipselinien einstellen
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- Breite der Ellipselinien einstellen
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- aktivieren (true) oder deaktivieren (false) Ellipsefüllung
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//--- Im Vordergrund (false) oder Hintergrund (true) anzeigen
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- aktivieren (true) oder deaktivieren (false) Wählen der Ellipse 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);
 ;}
//+------------------------------------------------------------------+
//| Verschiebt den Ankerpunkt der Ellipse                            |
//+------------------------------------------------------------------+
bool EllipsePointChange(const long   chart_ID=0,     // ID des Charts
                        const string name="Ellipse"// Name der Ellipse
                        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 die Ellipse                                               |
//+------------------------------------------------------------------+
bool EllipseDelete(const long   chart_ID=0,     // ID des Charts
                   const string name="Ellipse"// Name der Ellipse
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- Ellipse löschen
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": Könnte nicht sie Ellipse löschen! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- die erfolgreiche Umsetzung
   return(true);
 ;}
//+------------------------------------------------------------------+
//| Überprüft Werte der Ankerpunkten der Ellipse und für Leerwerte |
//| setzt Standardwerte |
//+------------------------------------------------------------------+
void ChangeEllipseEmptyPoints(datetime &time1,double &price1,
                              datetime &time2,double &price2,
                              datetime &time3,double &price3)
  {
//--- 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 die Zeit des zweiten Punktes nicht angegeben ist, wird sie auf 9 Baren nach links 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 ist, bewegen wir ihn 300 Punkte niedriger als der erste
   if(!price2)
      price2=price1-300*SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- wenn die Zeit des dritten Punktes nicht angegeben ist, wird sie der Zeit des zweiten Punktes gleich sein
   if(!time3)
      time3=time2;
//--- wenn der Preis des dritten Punktes nicht angegeben ist, wird er dem Preis des zweiten Punktes gleich sein
   if(!price3)
      price3=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 || 
      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 der Ellipse 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 die Ellipse 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;
//--- Ellipse erstellen
   if(!EllipseCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
      InpColor,InpStyle,InpWidth,InpFill,InpBack,InpSelection,InpHidden,InpZOrder))
     {
      return;
    ;}
//--- den Chart neu zeichnen und 1 Sekunde warten
   ChartRedraw();
   Sleep(1000);
//--- jetzt bewegen wir die Ankerpunkte der Ellipse
//--- Schleifenzähler
   int v_steps=accuracy/5;
//--- den ersten und zweiten Punkt bewegen
   for(int i=0;i<v_steps;i++)
     {
      //--- die nächsten Werte nehmen
      if(p1<accuracy-1)
         p1+=1;
      if(p2>1)
         p2-=1;
      //--- Die Punkte bewegen
      if(!EllipsePointChange(0,InpName,0,date[d1],price[p1]))
         return;
      if(!EllipsePointChange(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);
//--- Schleifenzähler
   int h_steps=bars/5;
//--- den dritten Punkt bewegen
   for(int i=0;i<h_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(d3>1)
         d3-=1;
      //--- den Punkt bewegen
      if(!EllipsePointChange(0,InpName,2,date[d3],price[p3]))
         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);
//--- die Ellipse aus dem Chart löschen
   EllipseDelete(0,InpName);
   ChartRedraw();
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//---
 ;}