Indikatoren: ATRStops_v1.1_Alert

 

ATRStops_v1.1_Alert:

Ein Trendindikator, realisiert als NRTR, mit der Option Alerts, E-Mails und Push-Benachrichtigungen zu senden.

Abb.1 Der ATRStops_v1.1_Alert Indikator

Autor: Nikolay Kositsin

 
Hilfe, aus irgendeinem Grund zeichnet das Terminal nicht die obere rote Linie, sondern nur die untere blaue Linie.
 
Альберт Туйкин:
Hilfe, aus irgendeinem Grund im Terminal zeichnet nicht die obere rote Linie, nur die untere blaue.
Ich habe alles noch einmal überprüft, der Indikator funktioniert ganz normal!
 
Nikolay Kositsin:
Ich habe alles noch einmal überprüft, der Indikator funktioniert absolut einwandfrei!

Auf den meisten Charts funktioniert er perfekt. Aber auf zwei Charts zeichnet er die rote Linie nicht :(
 
Альберт Туйкин:

Bei den meisten Diagrammen funktioniert es gut. Aber bei zwei Diagrammen zeichnet es die rote Linie nicht :(
Wenn eine Person ein Problem hat, liegt es allein an ihr, wie sie dieses Problem ihrer Umgebung in einer Weise mitteilt, dass diese es erkennen kann.
 

Ich entschuldige mich, ich habe einen Screenshot hinzugefügt.

Auf dem RTS-Indexdiagramm funktioniert zum Beispiel alles, aber auf dem RTS-Futures-Diagramm gibt es nur eine blaue Linie.

Dateien:
k3nkgna35.JPG  195 kb
 
Альберт Туйкин:

Ich entschuldige mich, ich habe einen Screenshot hinzugefügt.

Im RTS-Indexdiagramm funktioniert zum Beispiel alles, aber im RTS-Futures-Diagramm gibt es nur eine blaue Linie.

Es ist klar, dass der Autor des Codes die Größen von globalem Boden und Decke im Quellcode zu klein eingestellt hat. Der Code wird bald geändert werden.
//+------------------------------------------------------------------+
//|ATRStops_v1.1_Alert.mq5 |
//|Urheberrecht © 2006, Forex-TSD.com |
//| Geschrieben von IgorAD,igorad2003@yahoo.co.uk | 
//| http://finance.groups.yahoo.com/group/TrendLaboratory | 
//+------------------------------------------------------------------+
//---- Indikator Urheberschaft
#property copyright "Copyright © 2006, Forex-TSD.com "
//---- Link zur Website des Autors
#property link      "http://www.forex-tsd.com/"
//---- Versionsnummer des Indikators
#property version   "1.10"
//---- Anzeige im Hauptfenster zeichnen
#property indicator_chart_window
//---- 4 Puffer werden für die Berechnung und Darstellung des Indikators verwendet
#property indicator_buffers 4
//---- verwendet 4 grafische Konstruktionen
#property indicator_plots   4
//+----------------------------------------------+
//|| Parameter für das Zeichnen des bullischen Indikators |
//+----------------------------------------------+
//---- Zeichnung des Indikators 1 als Linie
#property  indicator_type1   DRAW_LINE
//---- blaue Farbe wird als Farbe für die Indikatorlinie verwendet
#property  indicator_color1  clrBlue
//---- Indikatorlinie 1 - durchgezogen
#property  indicator_style1  STYLE_SOLID
//---- Indikator 1 Linienstärke ist 2
#property  indicator_width1  2
//---- Display-Anzeige Linienmarkierung
#property  indicator_label1  "Upper ATRStops_v1.1"
//+----------------------------------------------+
Parameter für die Darstellung des Bearish-Indikators //||
//+----------------------------------------------+
//---- Zeichnung des Indikators 2 als Linie
#property  indicator_type2   DRAW_LINE
//---- Indischrote Farbe wird als Indikatorfarbe verwendet
#property  indicator_color2  clrIndianRed
//---- Indikatorlinie 2 - durchgezogen
#property  indicator_style2  STYLE_SOLID
//---- Indikator 2 Linienstärke ist 2
#property  indicator_width2  2
//---- Display-Anzeige Linienmarkierung
#property  indicator_label2  "Lower ATRStops_v1.1"
//+----------------------------------------------+
//|| Parameter für das Zeichnen des bullischen Indikators |
//+----------------------------------------------+
//---- Zeichnung des Indikators 3 als Symbol
#property  indicator_type3   DRAW_ARROW
//---- Farbe Blau wird als Indikatorfarbe verwendet
#property  indicator_color3  clrBlue
//---- Dicke des Indikators 3 ist 4
#property  indicator_width3  4
//---- Display-Anzeigenschild
#property  indicator_label3  "Buy ATRStops_v1.1"
//+----------------------------------------------+
Parameter für die Darstellung des Bearish-Indikators //||
//+----------------------------------------------+
//---- Zeichnung des Indikators 4 als Symbol
#property  indicator_type4   DRAW_ARROW
//---- wird die Farbe Rot als Indikatorfarbe verwendet
#property  indicator_color4  clrRed
//---- Dicke des Indikators 4 ist 4
#property  indicator_width4  4
//---- Display-Anzeigenschild
#property  indicator_label4  "Sell ATRStops_v1.1"
//+----------------------------------------------+
//|| Indikator-Eingabeparameter |
//+----------------------------------------------+
input uint   Length=10;           // Indikatorzeitraum
input uint   ATRPeriod=5;         // ATR-Indikatorzeitraum
input double Kv=2.5;              // ATR-Volatilität
input int    Shift=0;             // Horizontale Verschiebung des Indikators in Balken
input uint NumberofBar=1;         // Bar-Nummer für die Signalisierung
input bool SoundON=true;          // Auflösung des Alarms
input uint NumberofAlerts=2;      // Anzahl der Ausschreibungen
input bool EMailON=false;         // Versenden des Signals einschalten
input bool PushON=false;          // Aktivieren Sie das Senden eines Signals an das Mobiltelefon
//+----------------------------------------------+
//---- Deklaration von dynamischen Arrays, die weiter
//---- wird als Indikatorpuffer verwendet
double ExtMapBufferUp[];
double ExtMapBufferDown[];
double ExtMapBufferUp1[];
double ExtMapBufferDown1[];
//---- Deklaration von Integer-Variablen für Indikator-Handles
int ATR_Handle;
//---- Deklaration von ganzzahligen Datenstartvariablen
int min_rates_total;
//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+ 
int OnInit()
  {
//---- liefert ATR-Indikator-Handle
   ATR_Handle=iATR(NULL,0,ATRPeriod);
   if(ATR_Handle==INVALID_HANDLE)
     {
      Print("ATR-Indikator-Handle nicht erhalten");
      return(1);
     }

//---- Initialisierung von Datenstartvariablen
   min_rates_total=int(ATRPeriod+Length);

//---- Umwandlung des dynamischen Arrays ExtMapBufferUp[] in einen Indikatorpuffer
   SetIndexBuffer(0,ExtMapBufferUp,INDICATOR_DATA);
---- Verschieben der Anzeige 1 in horizontaler Richtung mit Shift
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- Verschiebung des Beginns des Countdowns der Indikatorzeichnung 1
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- Indizierung von Elementen in Puffern, wie in Zeitreihen 
   ArraySetAsSeries(ExtMapBufferUp,true);
//---- Einstellung von Indikatorwerten, die auf dem Diagramm nicht sichtbar sind
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- Umwandlung des dynamischen Arrays ExtMapBufferDown[] in einen Indikatorpuffer
   SetIndexBuffer(1,ExtMapBufferDown,INDICATOR_DATA);
//---- Verschieben des Indikators 2 in horizontaler Richtung mit der Umschalttaste
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- Verschiebung des Beginns des Countdowns der Indikatorzeichnung 2
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- Indizierung von Elementen in Puffern, wie in Zeitreihen 
   ArraySetAsSeries(ExtMapBufferDown,true);
//---- Einstellung von Indikatorwerten, die auf dem Diagramm nicht sichtbar sind
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- Umwandlung des dynamischen Arrays ExtMapBufferUp1[] in einen Indikatorpuffer
   SetIndexBuffer(2,ExtMapBufferUp1,INDICATOR_DATA);
---- Verschieben der Anzeige 1 in horizontaler Richtung mit Shift
   PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//---- Verschiebung des Zeichnungsbeginns des Indikators 3
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//---- Indizierung von Elementen in Puffern, wie in Zeitreihen 
   ArraySetAsSeries(ExtMapBufferUp1,true);
//---- Einstellung von Indikatorwerten, die auf dem Diagramm nicht sichtbar sind
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- Zeichen für Indikator
   PlotIndexSetInteger(2,PLOT_ARROW,175);

//---- Umwandlung des dynamischen Arrays ExtMapBufferDown1[] in einen Indikatorpuffer
   SetIndexBuffer(3,ExtMapBufferDown1,INDICATOR_DATA);
//---- Verschieben des Indikators 2 in horizontaler Richtung mit der Umschalttaste
   PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//---- Verschiebung des Zeichnungsbeginns des Indikators 4
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
//---- Indizierung von Elementen in Puffern, wie in Zeitreihen 
   ArraySetAsSeries(ExtMapBufferDown1,true);
//---- Einstellung von Indikatorwerten, die auf dem Diagramm nicht sichtbar sind
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- Zeichen für Indikator
   PlotIndexSetInteger(3,PLOT_ARROW,175);

//---- Initialisierung der Variablen für den kurzen Indikatornamen
   string shortname;
   StringConcatenate(shortname,"ATRStops_v1.1(",Length,", ",ATRPeriod,", ",DoubleToString(Kv,4),", ",Shift,")");
//--- Erstellen eines Namens, der in einem separaten Unterfenster und einer QuickInfo angezeigt wird
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- Bestimmung der Genauigkeit der Anzeige der Indikatorwerte
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // Menge der Historie in Balken zum aktuellen Tick
                const int prev_calculated,// Betrag der Historie in Balken zum vorherigen Tick
                const datetime &time[],
                const double &open[],
                const double& high[],     // Preisfeld mit Preismaxima für die Indikatorberechnung
                const double& low[],      // Preisfeld mit Preisminima für die Indikatorberechnung
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---- prüfen, ob die Anzahl der Balken für die Berechnung ausreicht
   if(BarsCalculated(ATR_Handle)<rates_total || rates_total<min_rates_total) return(0);

//---- Deklarationen lokaler Variablen 
   double ATR[];
   double smin0,smax0;
   int limit,to_copy,bar,trend0;
   static double smin1,smax1;
   static int trend1;

//---- Indizierung von Elementen in Arrays, wie in Zeitreihen 
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(ATR,true);

//---- Berechnung der Startgrenzennummer für den Takt-Neuberechnungszyklus
   if(prev_calculated>rates_total || prev_calculated<=0) // Prüfung auf den ersten Start der Indikatorberechnung
     {
      limit=rates_total-min_rates_total-1;               // Startnummer für die Berechnung aller Balken
      trend1=0;
      smin1=-999999;
      smax1=+999999;
     }
   else
     {
      limit=rates_total-prev_calculated;                 // Startnummer für die Berechnung der neuen Balken
     }

   to_copy=int(limit+Length);
//---- kopiert neu erschienene Daten in Arrays
   if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(0);

//---- Berechnungszyklus des Hauptindikators
   for(bar=limit; bar>=0; bar--)
     {      
      ExtMapBufferUp[bar]=EMPTY_VALUE;
      ExtMapBufferDown[bar]=EMPTY_VALUE;
      ExtMapBufferUp1[bar]=EMPTY_VALUE;
      ExtMapBufferDown1[bar]=EMPTY_VALUE;
      
      smin0=-999999;
      smax0=+999999;
      
      for(int iii=0; iii<int(Length); iii++)
        {
         int barx=bar+iii;
         smin0=MathMax(smin0,high[barx]-Kv*ATR[barx]);
         smax0=MathMin(smax0,low[barx]+Kv*ATR[barx]);
        }
        
      trend0=trend1;
      if(close[bar]>smax1) trend0=+1;
      if(close[bar]<smin1) trend0=-1;

      if(trend0>0)
        {
         if(smin0<smin1) smin0=smin1;
         ExtMapBufferUp[bar]=smin0;
        }
        
      if(trend0<0)
        {
         if(smax0>smax1) smax0=smax1;
         ExtMapBufferDown[bar]=smax0;
        }

      if(ExtMapBufferUp[bar+1]==EMPTY_VALUE && ExtMapBufferUp[bar]!=EMPTY_VALUE) ExtMapBufferUp1[bar]=ExtMapBufferUp[bar];
      if(ExtMapBufferDown[bar+1]==EMPTY_VALUE && ExtMapBufferDown[bar]!=EMPTY_VALUE) ExtMapBufferDown1[bar]=ExtMapBufferDown[bar];

      if(bar>0)
        {
         smin1=smin0;
         smax1=smax0;
         trend1=trend0;
        }
     }
//--- 
   BuySignal("ATRStops_v1.1_Alert",ExtMapBufferUp1,rates_total,prev_calculated,close,spread);
   SellSignal("ATRStops_v1.1_Alert",ExtMapBufferDown1,rates_total,prev_calculated,close,spread);
//--- 
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Kaufsignalfunktion|
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,      // Text des Indikatornamens für Mail- und Push-Signale
               double &BuyArrow[],        // Indikatorpuffer mit Kaufsignalen
               const int Rates_total,     // aktuelle Anzahl der Balken
               const int Prev_calculated, // Anzahl der Balken des vorherigen Ticks
               const double &Close[],     // Schlusskurs
               const int &Spread[])       // Ausbreitung
  {
//---
   static uint counter=0;
   if(Rates_total!=Prev_calculated) counter=0;

   bool BuySignal=false;
   bool SeriesTest=ArrayGetAsSeries(BuyArrow);
   int index;
   if(SeriesTest) index=int(NumberofBar);
   else index=Rates_total-int(NumberofBar)-1;
   if(NormalizeDouble(BuyArrow[index],_Digits) && BuyArrow[index]!=EMPTY_VALUE) BuySignal=true;
   if(BuySignal && counter<=NumberofAlerts)
     {
      counter++;
      MqlDateTime tm;
      TimeToStruct(TimeCurrent(),tm);
      string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
      SeriesTest=ArrayGetAsSeries(Close);
      if(SeriesTest) index=int(NumberofBar);
      else index=Rates_total-int(NumberofBar)-1;
      double Ask=Close[index];
      double Bid=Close[index];
      SeriesTest=ArrayGetAsSeries(Spread);
      if(SeriesTest) index=int(NumberofBar);
      else index=Rates_total-int(NumberofBar)-1;
      Bid+=Spread[index]*_Point;
      string sAsk=DoubleToString(Ask,_Digits);
      string sBid=DoubleToString(Bid,_Digits);
      string sPeriod=GetStringTimeframe(ChartPeriod());
      if(SoundON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
      if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
      if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
     }

//---
  }
//+------------------------------------------------------------------+
//| Signalfunktion verkaufen|
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,      // Text des Indikatornamens für Mail- und Push-Signale
                double &SellArrow[],       // Indikatorpuffer mit Kaufsignalen
                const int Rates_total,     // aktuelle Anzahl der Balken
                const int Prev_calculated, // Anzahl der Balken des vorherigen Ticks
                const double &Close[],     // Schlusskurs
                const int &Spread[])       // Ausbreitung
  {
//---
   static uint counter=0;
   if(Rates_total!=Prev_calculated) counter=0;

   bool SellSignal=false;
   bool SeriesTest=ArrayGetAsSeries(SellArrow);
   int index;
   if(SeriesTest) index=int(NumberofBar);
   else index=Rates_total-int(NumberofBar)-1;
   if(NormalizeDouble(SellArrow[index],_Digits) && SellArrow[index]!=EMPTY_VALUE) SellSignal=true;
   if(SellSignal && counter<=NumberofAlerts)
     {
      counter++;
      MqlDateTime tm;
      TimeToStruct(TimeCurrent(),tm);
      string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
      SeriesTest=ArrayGetAsSeries(Close);
      if(SeriesTest) index=int(NumberofBar);
      else index=Rates_total-int(NumberofBar)-1;
      double Ask=Close[index];
      double Bid=Close[index];
      SeriesTest=ArrayGetAsSeries(Spread);
      if(SeriesTest) index=int(NumberofBar);
      else index=Rates_total-int(NumberofBar)-1;
      Bid+=Spread[index]*_Point;
      string sAsk=DoubleToString(Ask,_Digits);
      string sBid=DoubleToString(Bid,_Digits);
      string sPeriod=GetStringTimeframe(ChartPeriod());
      if(SoundON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
      if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
      if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
     }
//---
  }
//+------------------------------------------------------------------+
//| Zeitrahmen als String abrufen|
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
  {
//----
   return(StringSubstr(EnumToString(timeframe),7,-1));
//----
  }
//+------------------------------------------------------------------+
 
Danke, es hat funktioniert!
 

Hallo!

Können Sie die Eigenschaften in englischer Sprache hinzufügen, damit wir sie verstehen können.

Danke

 
gkb #: Hallo, können Sie die englische Sprache in den Eigenschaften hinzufügen, damit wir es verstehen können.

Die ursprüngliche Veröffentlichung war in der russischen CodeBase im Jahr 2017. MetaQuotes ist derjenige, der eine Übersetzung der Veröffentlichung gemacht hat.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalcode: https:
//www.mql5.com/ru/code/17881

Ich bezweifle also, dass der Originalautor das tun wird. Sie könnten Google translate verwenden und die Codekommentare selbst ins Englische übersetzen.