Codeproblem mit mehreren Warnungen und zeitversetzten Warnungen — Code Problem with multiple alerts and timeshifted alerts

 

Automatisierte Übersetzung durch den Moderator. Im deutschen Forum schreiben Sie bitte auf Deutsch. Verwenden Sie entweder das automatische Übersetzungstool oder posten Sie in einem der anderen Sprachforen.

Automated translation applied by moderator. On the German forum, please write in German. Either use the automatic translation tool, or post in one of the other language forums.

Hallo liebe MQL4-Programmierer,

Ich habe Probleme mit meinem Handelsindikator. Eigentlich ist es ganz einfach, aber die Alerts funktionieren nicht so, wie ich es möchte.

Unter bestimmten Bedingungen (Kreuzung mit EMA50-Band usw.) wird ein Kauf- oder Verkaufssignal generiert. Die Pfeile sind korrekt gezeichnet.
Die Warnung zu diesem Pfeil wird jedoch nicht ausgelöst. Entweder fehlt der Meta-Trader (falsche Pufferlänge oder ein Echtzeitfehler) oder es liegt ein Problem in meinem Code bzw. meinem Verständnis dafür vor, wie diese Warnungen ausgelöst werden.

Zur besseren Lesbarkeit kürze ich den Code.

Ich habe dort einige boolesche Flags hinzugefügt, um den Abstand zwischen den Handelssignalen im Diagramm zu wahren
Wenn ein Verkaufs- oder Kaufsignal ausgelöst wurde, möchte ich verhindern, dass durch einen chaotischen Chart ein weiteres Signal für die nächsten 5 Kerzen ausgelöst wird.

Der gesamte Code basiert auf OnCalculate()... ich verstehe also, dass mit jedem Tick die for(i = limit....)-Hauptschleife ausgelöst wird. Für jedes i steht eine Kerze.

Wenn ich also zwei close[i+1] > xyz[i+1] && close[i+2] < xyz[i+2] vergleiche, gehe ich davon aus, dass das Signal nur dann gesendet werden sollte, wenn der Balken die Kerze schließt [1], eine neue Kerze[0] wurde erstellt.
Ich habe es mit den Pfeilen beobachtet, es funktioniert,
aber die Warnung davor ist wahnsinnig. Ich weiß nicht, was ich tun soll.
Bitte helfen und beraten Sie. Ich möchte nur einen Alarm pro Kerze und nur, wenn ein Pfeil erstellt wurde.

Danke

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(IsStopped())
      return(0);               // if Indicator stopped
   if(rates_total < MaxPeriod)
      return(0);               // if not enough data

   int limit = 0;
   int cshift = 0;

   if(i_candleclose)
      cshift = 1;
   else
      cshift = 0;

   double priceshift = 0;
   double pShift = PixelsToPrice(ArrowShift);


   limit = rates_total - prev_calculated;
   if(prev_calculated > 0)
      limit ++;

   if(pShift != priceshift)
      limit = rates_total;
   priceshift = pShift;
   ArrayResize(MACDBuffer,limit,0);
   ArrayInitialize(MACDBuffer,0);


   for(int i = limit-1; i > 0; i--)
     {
      //Buffers are being filled here
	


      if(AllowTrade && (i < i_SlowMAPeriod)) //(i < ArraySize(ELBuffer)-1))
        {
        // buy and sell conditions are calculated here
	// *********************************

         // Check for buy signal
         if((buycondition1 || buycondition2))
           {
            BuySignalBuffer[i+cshift] = Low[i+cshift] - priceshift;
            AlertText = StringConcatenate("BUY Alert: ", Symbol());

            if(f_sendalarm())
               Alert(AlertText);
            AllowTrade = false;
            istradecount += 1;
            signalindex = i+cshift;
           }

         // Check for sell signal
         if((sellcondition1 || sellcondition2))
           {
            SellSignalBuffer[i+cshift] = High[i+cshift] + priceshift;
            AlertText = StringConcatenate("SELL Alert: ", Symbol());
            if(f_sendalarm())
               Alert(AlertText);
            AllowTrade = false;
            istradecount += 1;
            signalindex = i+cshift;
           }
        }

     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

//+------------Functions---------------------------------------------+
double PixelsToPrice(int pixels)
  {
   long     heightInPixels;
   double   min;
   double   max;
   double   heightInPrice;
   double   shift;
   heightInPixels = ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
   min            = ChartGetDouble(0,CHART_PRICE_MIN,0);
   max            = ChartGetDouble(0,CHART_PRICE_MAX,0);
   heightInPrice  = max-min;
   shift          = pixels * (heightInPrice/heightInPixels);
   return(shift);
  }

datetime NewCandleTime = TimeCurrent();
bool f_sendalarm()
   {
      if (NewCandleTime == iTime(Symbol(), Period(), 0)) return false;
      else
      {
      NewCandleTime = iTime(Symbol(), Period(), 0);
      return true;
      }
   }

//static datetime TimeStamp;
//bool f_sendalarm()
//  {
//   if(TimeStamp != Time[0])
//     {
//      return true;
//      TimeStamp = Time[0];
//     }
//   else
//      return false;
//
//
//  }
//+------------------------------------------------------------------+


Chart and Indicator

alerts all over

Dateien:
 

Im deutschen Forum schreiben Sie bitte auf Deutsch. Verwenden Sie entweder das automatische Übersetzungstool oder posten Sie in einem der anderen Sprachforen.

On the German forum, please write in German.  Either use the automatic translation tool, or post in one of the other language forums.

 

Hallo, wir können hier Deutsch reden :)

Starte den Debugger kurz bevor der Alert kommen soll, gehe Befehl für Befehl durch Deinen Code und verfolge die relevanten Variablen. So kannst Du leicht feststellen, warum Dein EA nicht tut, was er soll.

HowTo: https://www.metatrader5.com/de/metaeditor/help/development/debug

Tips und Links für den Neuling: https://www.mql5.com/de/forum/455957#comment_50048608

Zum Überfliegen und landen bei dem, was man braucht.

Neuling sucht Hilfe Unterstützung
Neuling sucht Hilfe Unterstützung
  • 2023.10.19
  • www.mql5.com
Hallo zusammen, ich habe gerade mit der Plattform MT4 angefangen und die ersten Gehversuche hinter mir...
 
Fernando Carreiro #:

Im deutschen Forum schreiben Sie bitte auf Deutsch. Verwenden Sie entweder das automatische Übersetzungstool oder posten Sie in einem der anderen Sprachforen.

On the German forum, please write in German.  Either use the automatic translation tool, or post in one of the other language forums.

Hoppla, Danke für den Hinweis. Ich war mir nicht bewusst, dass es verschiedene Sprachforen gibt.
 
Carl Schreiber #:

Hallo, wir können hier Deutsch reden :)

Starte den Debugger kurz bevor der Alert kommen soll, gehe Befehl für Befehl durch Deinen Code und verfolge die relevanten Variablen. So kannst Du leicht feststellen, warum Dein EA nicht tut, was er soll.

HowTo: https://www.metatrader5.com/de/metaeditor/help/development/debug

Tips und Links für den Neuling: https://www.mql5.com/de/forum/455957#comment_50048608

Zum Überfliegen und landen bei dem, was man braucht.

Hallo, ja das habe ich schon oft getan und so auch den Code aufgebaut.
Hinweis: Es ist kein EA. Es ist nicht angedacht derzeit das der Indicator von alleine Handelt. Er soll mir nur ein PING geben.
Na ich versuche es nochmal.

Kann man den Zwischenbuffer der ganzen Alerts eigentlich löschen?
 
Carl Schreiber #:

Hallo, wir können hier Deutsch reden :)

Starte den Debugger kurz bevor der Alert kommen soll, gehe Befehl für Befehl durch Deinen Code und verfolge die relevanten Variablen. So kannst Du leicht feststellen, warum Dein EA nicht tut, was er soll.

HowTo: https://www.metatrader5.com/de/metaeditor/help/development/debug

Tips und Links für den Neuling: https://www.mql5.com/de/forum/455957#comment_50048608

Zum Überfliegen und landen bei dem, was man braucht.

Gedankenfehler gefunden. Da onCalculate jeden Tick berecchnet so wird auch bei jedem Tick der gesamte Array gefüllt, und so entstehen auch weitere Signale, sofern bei aufeinanderfolgenden Ticks die buy oder sell Konditionen erhalten geblieben sind. Wie kann ich diese Funktion testen? eine Funktion NewBar oder newCandle im Chart muss her: Wie kann ich den Code prüfen? Im Debugger geht der nie da rein.

oid OnTick()

  {

        if(barOpen1 != Open[0] || barOpen2 != Open[5]) //If any of the statements pass, a new candle must have opened changing the index number.

        {

            NewBar = true;

            barOpen1 = Open[0]; // Update variables with current prices

            barOpen2 = Open[5];

           

        }

}


 
PetziK #:

Gedankenfehler gefunden. Da onCalculate jeden Tick berecchnet so wird auch bei jedem Tick der gesamte Array gefüllt, und so entstehen auch weitere Signale, sofern bei aufeinanderfolgenden Ticks die buy oder sell Konditionen erhalten geblieben sind. Wie kann ich diese Funktion testen? eine Funktion NewBar oder newCandle im Chart muss her: Wie kann ich den Code prüfen? Im Debugger geht der nie da rein.

Das ist eine Frage, über die jeder stolpert und die bereit vielfach beantwortet wurde: https://www.mql5.com/de/search#!keyword=NewBar&amp;module=mql5_module_codebase
 
Carl Schreiber #:
Das ist eine Frage, über die jeder stolpert und die bereit vielfach beantwortet wurde: https://www.mql5.com/de/search#!keyword=NewBar&amp;module=mql5_module_codebase

Danke für den Hinweis, ja, ich habe mich länger durch diverse Forumseinträge in DE und EN durchgebohrt und gelesen.
was mir leider noch nicht klar ist, worin besteht der Unterschied im OnCalculate und OnTick? Brauche ich wirklich OnTick für die "new-candle" Function oder könnte ich das direkt in die OnCalculate() Funktion auch integrieren?

Früher hieß es einfach OnStart, aber die ScriptSprache hat sich da offenbar in den letzten 10 Jahren weiterentwickelt. Ich bin schon zu sehr auf Pine Script eingeschworen und muss mein altes Wissen hier wieder ausgraben.

Es ist irgendwie echt lästig, dass das mit den Pfeilen auf Anhieb gut funktioniert hat, jedoch beim Alarm scheitere ich. Ich muss weitersuchen, es muss eine andere / parallele Möglichkeit geben, den Alarm nur 1x pro Kerze auszugeben. 

 

OnTick() ist die Funktion für EAs und OnCalculate() die für Indikatoren, OnStart() ist für Skripts.

Einfach mal den Kursor jew. auf die Funktion stellen und F1 drücken...

So findest Du viele Antworten Deiner Fragen.

 
Carl Schreiber #:

OnTick() ist die Funktion für EAs und OnCalculate() die für Indikatoren, OnStart() ist für Skripts.

Einfach mal den Kursor jew. auf die Funktion stellen und F1 drücken...

So findest Du viele Antworten Deiner Fragen.

Danke für die Antwort,

Ich habe jetzt mal einen anderen Indikator zerlegt und mache reverse engineering, meine Hoffnung ist, dass ich meine Signale da rein coden kann, dann könnte es vielleicht funktionieren.

Frohes Schaffen und möge der Trend mit Dir sein,

Peter