MetaTrader 5 herunterladen

OBJ_ELLIOTWAVE5

Elliott Imoulswelle.

ObjElliotWave5

Hinweis

Für "Elliott Impulswelle" können Sie Zeichnung der Linien zwischen den Punkten (Eigenschaft OBJPROP_DRAWLINES) aktivieren/deaktivieren, und auch die Höhe der Welle Kennzeichnung (Enumeration ENUM_ELLIOT_WAVE_DEGREE) setzen.

Beispiel

Das folgende Skript erstellt und bewegt auf dem Chart Objekt "Elliott Impulswelle". 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 \"Elliott Impulswelle\"."
#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="ElliotWave5";   // Objektname
input int                     InpDate1=10;             // Datum des ersten Punktes in %
input int                     InpPrice1=90;            // Preis des ersten Punktes in %
input int                     InpDate2=20;             // Datum des zweiten Punktes in %
input int                     InpPrice2=40;            // Preis des zweiten Punktes in %
input int                     InpDate3=30;             // Datum des dritten Punktes in %
input int                     InpPrice3=60;            // Preis des dritten Punktes in %
input int                     InpDate4=40;             // Datum des vierten Punktes in %
input int                     InpPrice4=10;            // Preis des vierten Punktes in %
input int                     InpDate5=60;             // Datum des fünften Punktes in %
input int                     InpPrice5=40;            // Preis des fünften Punktes in %
input ENUM_ELLIOT_WAVE_DEGREE InpDegree=ELLIOTT_MINOR// Niveau
input bool                    InpDrawLines=true;       // Anzeige der Linien
input color                   InpColor=clrRed;         // Linienfarbe
input ENUM_LINE_STYLE         InpStyle=STYLE_DASH;     // Linienstil
input int                     InpWidth=2;              // Linienbreite
input bool                    InpBack=false;           // Objekt 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 Elliot Impulswelle auf angegebenen Koordinaten   |
//+------------------------------------------------------------------+
bool ElliotWave5Create(const long                    chart_ID=0,              // ID des Charts
                       const string                  name="ElliotWave5",      // Name der Welle
                       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
                       datetime                      time4=0,                 // Zeit des vierten Punktes
                       double                        price4=0,                // Preis des vierten Punktes
                       datetime                      time5=0,                 // Zeit des fünften Punktes
                       double                        price5=0,                // Preis des fünften Punktes
                       const ENUM_ELLIOT_WAVE_DEGREE degree=ELLIOTT_MINUETTE// Grad
                       const bool                    draw_lines=true,         // Anzeige der Linien
                       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                    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
   ChangeElliotWave5EmptyPoints(time1,price1,time2,price2,time3,price3,time4,price4,time5,price5);
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- erstellt Elliott Impulswelle auf angegebenen Koordinaten
   if(!ObjectCreate(chart_ID,name,OBJ_ELLIOTWAVE5,sub_window,time1,price1,time2,price2,time3,
      price3,time4,price4,time5,price5))
     {
      Print(__FUNCTION__,
            ": Objekt \"Elliott Impulswelle\" konnte nicht erstellt werden! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- Grad (Wellengröße) setzen
   ObjectSetInteger(chart_ID,name,OBJPROP_DEGREE,degree);
//--- aktivieren (true) oder deaktivieren (false) Anzeige der Linien
   ObjectSetInteger(chart_ID,name,OBJPROP_DRAWLINES,draw_lines);
//--- 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);
//--- 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 "Elliott Impulswelle"       |
//+------------------------------------------------------------------+
bool ElliotWave5PointChange(const long   chart_ID=0,         // ID des Charts
                            const string name="ElliotWave5"// Objektname
                            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
   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 "Elliott Impulswelle"   |
//+------------------------------------------------------------------+
bool ElliotWave5Delete(const long   chart_ID=0,         // ID des Charts
                       const string name="ElliotWave5"// Objektname
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- das Objekt löschen
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": Objekt \"Elliott Impulswelle\" konnte nicht gelöscht werden! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- die erfolgreiche Umsetzung
   return(true);
 ;}
//+------------------------------------------------------------------+
//| Prüft die Werte der Ankerpunkten von "Elliott Impulswelle" |
//| und setzt Standardwerte für leere Werte                     |
//+------------------------------------------------------------------+
void ChangeElliotWave5EmptyPoints(datetime &time1,double &price1,
                                  datetime &time2,double &price2,
                                  datetime &time3,double &price3,
                                  datetime &time4,double &price4,
                                  datetime &time5,double &price5)
  {
//--- Array um die Zeit der Öffnung der letzten 10 Bars zu empfangen 
   datetime temp[];
   ArrayResize(temp,10);
//--- Daten erhalten
   CopyTime(Symbol(),Period(),TimeCurrent(),10,temp);
//--- den Wert von einem Pip auf dem aktuellen Chart erhalten
   double point=SymbolInfoDouble(Symbol(),SYMBOL_POINT);
//--- wenn die Zeit des ersten Punktes nicht angegeben ist, wird er auf 9 Balken auf der linken Seite des letzten Balkens sein
   if(!time1)
      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);
//--- wenn die Zeit des zweiten Punktes nicht angegeben ist, wird er auf 7 Balken auf der linken Seite des letzten Balkens sein
   if(!time2)
      time2=temp[2];
//--- wenn der Preis des zweiten Punktes nicht angegeben ist, bewegen wir ihn 300 Punkte niedriger als der erste
   if(!price2)
      price2=price1-300*point;
//--- wenn die Zeit des dritten Punktes nicht angegeben ist, wird er auf 5 Balken auf der linken Seite des letzten Balkens sein
   if(!time3)
      time3=temp[4];
//--- wenn der Preis des dritten Punktes nicht angegeben ist, bewegen wir ihn 250 Punkte niedriger als der erste
   if(!price3)
      price3=price1-250*point;
//--- wenn die Zeit des vierten Punktes nicht angegeben ist, wird er auf 3 Balken auf der linken Seite des letzten Balkens sein
   if(!time4)
      time4=temp[6];
//--- wenn der Preis des vierten Punktes nicht angegeben ist, bewegen wir ihn 550 Punkte niedriger als der erste Punkt
   if(!price4)
      price4=price1-550*point;
//--- wenn die Zeit des fünften Punktes nicht angegeben ist, wird sie auf dem aktuellen Balken sein
   if(!time5)
      time5=temp[9];
//--- wenn der Preis des fünften Punktes nicht angegeben ist, bewegen wir ihn 450 Punkte niedriger als der erste
   if(!price5)
      price5=price1-450*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 || 
      InpDate4<0 || InpDate4>100 || InpPrice4<0 || InpPrice4>100 || 
      InpDate5<0 || InpDate5>100 || InpPrice5<0 || InpPrice5>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 "Elliott Impulswelle" zu zeichnen
   int d1=InpDate1*(bars-1)/100;
   int d2=InpDate2*(bars-1)/100;
   int d3=InpDate3*(bars-1)/100;
   int d4=InpDate4*(bars-1)/100;
   int d5=InpDate5*(bars-1)/100;
   int p1=InpPrice1*(accuracy-1)/100;
   int p2=InpPrice2*(accuracy-1)/100;
   int p3=InpPrice3*(accuracy-1)/100;
   int p4=InpPrice4*(accuracy-1)/100;
   int p5=InpPrice5*(accuracy-1)/100;
//--- Elliott Impulswelle erstellen
   if(!ElliotWave5Create(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
      date[d4],price[p4],date[d5],price[p5],InpDegree,InpDrawLines,InpColor,InpStyle,InpWidth,
      InpBack,InpSelection,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/5;
//--- den fünften Punkt bewegen
   for(int i=0;i<v_steps;i++)
     {
      //--- den nächsten Wert nehmen
      if(p5<accuracy-1)
         p5+=1;
      //--- den Punkt bewegen
      if(!ElliotWave5PointChange(0,InpName,4,date[d5],price[p5]))
         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/5;
//--- den zweiten und dritten Punkt bewegen
   for(int i=0;i<v_steps;i++)
     {
      //--- die nächsten Werte nehmen
      if(p2<accuracy-1)
         p2+=1;
      if(p3>1)
         p3-=1;
      //--- Die Punkte bewegen
      if(!ElliotWave5PointChange(0,InpName,1,date[d2],price[p2]))
         return;
      if(!ElliotWave5PointChange(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 ersten und vierten Punkt bewegen
   for(int i=0;i<v_steps;i++)
     {
      //--- die nächsten Werte nehmen
      if(p1>1)
         p1-=1;
      if(p4<accuracy-1)
         p4+=1;
      //--- Die Punkte bewegen
      if(!ElliotWave5PointChange(0,InpName,0,date[d1],price[p1]))
         return;
      if(!ElliotWave5PointChange(0,InpName,3,date[d4],price[p4]))
         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
   ElliotWave5Delete(0,InpName);
   ChartRedraw();
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//---
 ;}