Versuchen Sie dies in Ihrem EA, am Anfang der OnTick-Funktion.
// Wir werden die statische Variable Old_Time verwenden, um die Barzeit zu speichern.
// Bei jeder OnTick-Ausführung werden wir die aktuelle Barzeit mit der gespeicherten Zeit vergleichen.
// Wenn die Balkenzeit nicht mit der gespeicherten Zeit übereinstimmt, bedeutet dies, dass wir einen neuen Tick haben.
statische datetime Old_Time;
datetime New_Time[1];
bool IsNewBar=false;
// Kopieren der letzten Balkenzeit in das Element New_Time[0]
int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
if(copied>0) // ok, die Daten wurden erfolgreich kopiert
{
if(Alte_Zeit!=Neue_Zeit[0]) // wenn die alte Zeit nicht gleich der neuen Taktzeit ist
{
IsNewBar=true; // wenn es sich nicht um einen ersten Aufruf handelt, ist der neue Balken erschienen
if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Wir haben hier einen neuen Balken ",New_Time[0]," alte Zeit war ",Old_Time);
Alte_Zeit=Neue_Zeit[0]; // Speichern der Taktzeit
}
}
sonst
{
Alert("Fehler beim Kopieren historischer Zeitdaten, Fehler =",GetLastError());
ResetLastError();
zurück;
}
//--- EA sollte nur auf einen neuen Handel prüfen, wenn wir einen neuen Balken haben
if(IsNewBar==false)
{
zurückkehren;
}
//--- Haben wir genug Balken, mit denen wir arbeiten können
int Mybars=Bars(_Symbol,_Periode);
if(Mybars<60) // wenn die Gesamtzahl der Balken weniger als 60 Balken beträgt
{
Alert("Wir haben weniger als 60 Balken, EA wird jetzt beendet!");
zurückkehren;
}
Hallo oneillj,
ich dachte, ich hätte schon geantwortet, aber es scheint im Internet-Äther verschwunden zu sein.
Das Codefragment, das du uns zur Verfügung gestellt hast, ist so ziemlich das, worüber ich mich ursprünglich beschwert habe. Warum so komplex? Ich dachte mir, dass es einen einfacheren Weg geben muss. Ich habe mir diesen ausgedacht, der zu funktionieren scheint. Bitte korrigieren Sie mich, wenn ich falsch liege. (Ich habe auch versucht, BarsCalculated zu verwenden, aber es war immer gleich Bars, so dass der Test immer als falsch ausgewertet wurde).
static int LetzteBarZahl = 0;
if (Balken(_Symbol, _Periode) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
sonst
zurückgeben;
- www.mql5.com
static int BARS; //+------------------------------------------------------------------+ //| NewBar function | //+------------------------------------------------------------------+ bool IsNewBar() { if(BARS!=Bars(_Symbol,_Period)) { BARS=Bars(_Symbol,_Period); return(true); } return(false); }
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
Ich verwende dies...
Sie können auch dies versuchen:
// Rates structure array for last two bars MqlRates mrate[2]; CopyRates(Symbol(), Period(), 0, 2, mrate); // NEW BAR CHECK. //--------------- static double dBar_Open; static double dBar_High; static double dBar_Low; static double dBar_Close; static long lBar_Volume; static datetime nBar_Time; // Boolean for new BAR confirmation. bool bStart_NewBar = false; // Check if the price data has changed tov the previous bar. if(mrate[0].open != dBar_Open || mrate[0].high != dBar_High || mrate[0].low != dBar_Low || mrate[0].close != dBar_Close || mrate[0].tick_volume != lBar_Volume || mrate[0].time != nBar_Time) { bStart_NewBar = true; // A new BAR has appeared! // Update the new BAR data. dBar_Open = mrate[0].open; dBar_High = mrate[0].high; dBar_Low = mrate[0].low; dBar_Close = mrate[0].close; lBar_Volume = mrate[0].tick_volume; nBar_Time = mrate[0].time; } // Check if a new bar has formed. if(bStart_NewBar == true) { // Your code. }
Ich benutze dies...

- 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.
Hallo zusammen,
Ich bin ein kompletter Neuling in MQL5, aber ich habe ein gutes Stück der Codierung für andere Plattformen getan.
Ich frage mich, warum es so schwierig ist, dass ein EA nur bei einem neuen Balken ausgeführt wird. Ich habe einen Blick auf einige der Artikel, einschließlich der "neuen bar" Event-Handler, und es scheint sehr schwierig.
Wenn das nicht funktioniert und ich den "new bar"-Eventhandler verwenden muss, ist es dann möglich, die entsprechenden Dateien einfach zu laden und in den Ordner Files(?) zu kopieren und sie dann #include? Gibt es irgendwo eine Dokumentation für Leute wie mich, die im Grunde keine Ahnung haben, was sie da tun?
Ich arbeite mich durch das Tutorial in https://www.mql5.com/en/articles/100, und das erste, was mir auffiel, war, dass die "Bars"-Funktion verwendet wird, um sicherzustellen, dass genügend Balken für die Berechnungen vorhanden sind, aber das nächste Codestück ist offenbar dazu gedacht, einen neuen Balken zu erkennen, und ist (jedenfalls nach meinem Verständnis) ein sehr komplexes Codestück. Könnte nicht die Funktion Bars verwendet werden, um einen neuen Balken zu erkennen? Etwas wie if(Bars > int LastBarCount) {bool IsNewBar = true; LastBarCount = Bars;} else {IsNewBar = false;}. Würde so etwas funktionieren?
Einer für die Wunschliste. Wäre es nicht gut, wenn es ein OnNewBar-Ereignis gäbe, das wir anstelle von OnTick überschreiben könnten? Da jeder Indikator, den ich je gesehen habe, mit Balken und nicht mit Ticks arbeitet, würde dies das Leben aller Beteiligten viel einfacher machen, denke ich.
Ich habe gerade eine weitere Möglichkeit gefunden: "BarsCalculated". Auch hier bin ich mir nicht ganz sicher, was das aus der Beschreibung bedeutet, aber es sieht aus wie die Anzahl der Bars, die der EA bereits verarbeitet hat. Wenn das wahr wäre, dann alles, was ich bräuchte, um zu überprüfen, ist if(Bars > BarsCalculated), wenn wahr dann gehen und tun meine Verarbeitung, sonst zurück? Übersehe ich etwas?
Danke!
Ian