//--- Beschreibung #property description "Das Skript erstellt ein graphisches Objekt \"Kanal auf der linearen Regression\"." #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="Regression"; // Kanalname input int InpDate1=10; // Datum des ersten Punktes in % input int InpDate2=40; // Datum des zweiten Punktes in % input color InpColor=clrRed; // Kanalfarbe input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Stil der Kanallinien input int InpWidth=2; // Breite der Kanallinien input bool InpFill=false; // Farbfüllung des Kanals input bool InpBack=false; // Kanal im Hintergrund input bool InpSelection=true; // Wählen um zu bewegen input bool InpRayLeft=false; // Fortsetzung des Kanals nach links input bool InpRayRight=false; // Fortsetzung des Kanals nach rechts input bool InpHidden=true; // Ausgeblendet in der Objektliste input long InpZOrder=0; // Priorität auf Mausklick //+------------------------------------------------------------------+ //| Erstellt Kanal auf der linearen Regression mit Koordinaten | //+------------------------------------------------------------------+ bool RegressionCreate(const long chart_ID=0, // ID des Charts const string name="Regression", // Kanalname const int sub_window=0, // Nummer des Unterfensters datetime time1=0, // Zeit des ersten Punktes datetime time2=0, // Zeit des zweiten Punktes const color clr=clrRed, // Kanalfarbe const ENUM_LINE_STYLE style=STYLE_SOLID, // Stil der Kanallinien const int width=1, // Breite der Kanallinien const bool fill=false, // Farbfüllung des Kanals const bool back=false, // Im Hintergrund const bool selection=true, // Wählen um zu bewegen const bool ray_left=false, // Fortsetzung des Kanals nach links const bool ray_right=false, // Fortsetzung des Kanals nach rechts 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 ChangeRegressionEmptyPoints(time1,time2); //--- Setzen den Wert des Fehlers zurück ResetLastError(); //--- Kanal auf angegebenen Koordinaten erstellen if(!ObjectCreate(chart_ID,name,OBJ_REGRESSION,sub_window,time1,0,time2,0)) { Print(__FUNCTION__, ": Kanal auf der linearen Regression konnte nicht erstellt werden! Fehlercode = ",GetLastError()); return(false); } //--- Kanalfarbe setzen ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- Stil der Kanallinien einstellen ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- Breite der Kanallinien einstellen ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- aktivieren (true) oder deaktivieren (false) Kanalfü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 des Kanals 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); //--- aktivieren (true) oder deaktivieren (false) Fortsetzung des Kanals nach links ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left); //--- aktivieren (true) oder deaktivieren (false) Fortsetzung des Kanals 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); } //+------------------------------------------------------------------+ //| Verschiebt die Kanalbindung | //+------------------------------------------------------------------+ bool RegressionPointChange(const long chart_ID=0, // ID des Charts const string name="Channel", // Kanalname const int point_index=0, // Nummer des Ankerpunktes datetime time=0) // Zeitkoordinate des Ankerpunktes { //--- wenn die Zeit des Punktes nicht angegeben ist, bewegen wir ihn auf den letzten Balken if(!time) time=TimeCurrent(); //--- Setzen den Wert des Fehlers zurück ResetLastError(); //--- bewegen den Bezugspunkt if(!ObjectMove(chart_ID,name,point_index,time,0)) { Print(__FUNCTION__, ": der Bezugspunkt konnte nicht bewegt werden! Fehlercode = ",GetLastError()); return(false); } //--- die erfolgreiche Umsetzung return(true); } //+------------------------------------------------------------------+ //| Löscht den Kanal | //+------------------------------------------------------------------+ bool RegressionDelete(const long chart_ID=0, // ID des Charts const string name="Channel") // Kanalname { //--- Setzen den Wert des Fehlers zurück ResetLastError(); //--- den Kanal löschen if(!ObjectDelete(chart_ID,name)) { Print(__FUNCTION__, ": kann nicht den Kanal löschen! Fehlercode = ",GetLastError()); return(false); } //--- die erfolgreiche Umsetzung return(true); } //+------------------------------------------------------------------+ //| Überprüft die Werte der Kanalbindungspunkten für leere Werte | //| setzt Standardwerte | //+------------------------------------------------------------------+ void ChangeRegressionEmptyPoints(datetime &time1,datetime &time2) { //--- wenn die Zeit des zweiten Punktes nicht angegeben ist, wird sie auf dem aktuellen Bar sein if(!time2) time2=TimeCurrent(); //--- wenn die Zeit des ersten Punktes nicht angegeben ist, wird sie auf 9 Baren nach links vom zweiten sein if(!time1) { //--- Array um Eröffnungszeit der letzten 10 Bars aufzunehmen datetime temp[10]; CopyTime(Symbol(),Period(),time2,10,temp); //--- stellen wir den ersten Punkt 9 Baren links dem zweiten Punkt time1=temp[0]; } } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Überprüfen die Richtigkeit der Eingabeparameter if(InpDate1<0 || InpDate1>100 || InpDate2<0 || InpDate2>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 Kanalbindungspunkten 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 den Kanal zu zeichnen int d1=InpDate1*(bars-1)/100; int d2=InpDate2*(bars-1)/100; //--- Einen Kanal auf der linearen Regression erstellen if(!RegressionCreate(0,InpName,0,date[d1],date[d2],InpColor,InpStyle,InpWidth, InpFill,InpBack,InpSelection,InpRayLeft,InpRayRight,InpHidden,InpZOrder)) { return; } //--- den Chart neu zeichnen und 1 Sekunde warten ChartRedraw(); Sleep(1000); //--- jetzt bewegen wir den Kanal auf der linearen Regression horizontal nach rechts //--- Schleifenzähler int h_steps=bars/2; //--- Kanal bewegen for(int i=0;i<h_steps;i++) { //--- die nächsten Werte nehmen if(d1<bars-1) d1+=1; if(d2<bars-1) d2+=1; //--- Ankerpunkte bewegen if(!RegressionPointChange(0,InpName,0,date[d1])) return; if(!RegressionPointChange(0,InpName,1,date[d2])) 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); //--- den Kanal aus dem Chart löschen RegressionDelete(0,InpName); ChartRedraw(); //--- 1 Sekunde Verzögerung Sleep(1000); //--- } |