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 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 :(
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.
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.
//+------------------------------------------------------------------+ //|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)); //---- } //+------------------------------------------------------------------+
Hallo!
Können Sie die Eigenschaften in englischer Sprache hinzufügen, damit wir sie verstehen können.
Danke
Die ursprüngliche Veröffentlichung war in der russischen CodeBase im Jahr 2017. MetaQuotes ist derjenige, der eine Übersetzung der Veröffentlichung gemacht hat.
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.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
ATRStops_v1.1_Alert:
Ein Trendindikator, realisiert als NRTR, mit der Option Alerts, E-Mails und Push-Benachrichtigungen zu senden.
Autor: Nikolay Kositsin