//--- 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); //--- } |