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