MetaTrader 5 herunterladen

OBJ_STDDEVCHANNEL

Kanal der Standardabweichung.

ObjStdDevChannel

Hinweis

Für das Objekt "Kanal der Standardabweichung" können Sie die weitere Anzeige nach rechts und/oder nach links (Eigenschaften OBJPROP_RAY_RIGHT und OBJPROP_RAY_LEFT jeweils) angeben. Sie können auch die Farbfüllung des Kanals angeben.

Um die Werte des Kanals der Standardabweichung zu ändern, wird Eigenschaft OBJPROP_DEVIATION verwendet.

Beispiel

Das folgende Skript erstellt und bewegt auf dem Chart Objekt "Kanal der Standardabweichung". 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 \"Kanal der Standardabweichung\"."
#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="StdDevChannel";   // Kanalname
input int             InpDate1=10;               // Datum des ersten Punktes in %
input int             InpDate2=40;               // Datum des zweiten Punktes in %
input double          InpDeviation=1.0;          // Abweichung
input color           InpColor=clrRed;           // Kanalfarbe
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT// Stil der Kanallinien
input int             InpWidth=2;                // Kanallinienbreite
input bool            InpFill=false;        // Farbfüllung des Kanals
input bool            InpBack=false;             // 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 der Standardabweichung mit angegebenen Koordinaten|
//+------------------------------------------------------------------+
bool StdDevChannelCreate(const long            chart_ID=0,        // ID des Charts
                         const string          name="Channel",    // Kanalname
                         const int             sub_window=0,      // Nummer des Unterfensters
                         datetime              time1=0,           // Zeit des ersten Punktes
                         datetime              time2=0,           // Zeit des zweiten Punktes
                         const double          deviation=1.0,     // Abweichung 
                         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
   ChangeChannelEmptyPoints(time1,time2);
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- Kanal auf angegebenen Koordinaten erstellen
   if(!ObjectCreate(chart_ID,name,OBJ_STDDEVCHANNEL,sub_window,time1,0,time2,0))
     {
      Print(__FUNCTION__,
            ": Kanal der Standardabweichung konnte nicht erstellt werden! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- Wert der Abweichung setzen, Kanalbreite abhängt von ihm
   ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation);
//--- 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 StdDevChannelPointChange(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);
 ;}
//+------------------------------------------------------------------+
//| Ändert Abweichung des Kanals                                     |
//+------------------------------------------------------------------+
bool StdDevChannelDeviationChange(const long   chart_ID=0,     // ID des Charts
                                  const string name="Channel"// Kanalname
                                  const double deviation=1.0)  // Abweichung
  {
//--- Setzen den Wert des Fehlers zurück
   ResetLastError();
//--- den Winkel der Trendlinie ändern
   if(!ObjectSetDouble(chart_ID,name,OBJPROP_DEVIATION,deviation))
     {
      Print(__FUNCTION__,
            ": Konnte nicht Kanalabweichung ändern! Fehlercode = ",GetLastError());
      return(false);
    ;}
//--- die erfolgreiche Umsetzung
   return(true);
 ;}
//+------------------------------------------------------------------+
//| Löscht den Kanal                                                 |
//+------------------------------------------------------------------+
bool StdDevChannelDelete(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 ChangeChannelEmptyPoints(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 zweiten 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;
//--- wir erstellen den Kanal der Standardabweichung
   if(!StdDevChannelCreate(0,InpName,0,date[d1],date[d2],InpDeviation,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 horizontal nach rechts und erweitern ihn
//--- 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(!StdDevChannelPointChange(0,InpName,0,date[d1]))
         return;
      if(!StdDevChannelPointChange(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);
//--- Schleifenzähler
   double v_steps=InpDeviation*2;
//--- den Kanal erweitern
   for(double i=InpDeviation;i<v_steps;i+=10.0/accuracy)
     {
      if(!StdDevChannelDeviationChange(0,InpName,i))
         return;
 //--- Überprüfen die Fakten von Zwangsabschaltung der Skript
      if(IsStopped())
         return;
      //--- den Chart neu zeichnen
      ChartRedraw();
    ;}
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//--- den Kanal aus dem Chart löschen
   StdDevChannelDelete(0,InpName);
   ChartRedraw();
//--- 1 Sekunde Verzögerung
   Sleep(1000);
//---
 ;}