Ihr EA läuft auf Idle-CPU, RannForex-Server, 6 Charts mit verschiedenen Symbolen. Als ich zu meinem Computer zurückkam, sah ich eine Menge davon.
2020.10.3013:50:21.852 Test9 (GBPUSD,H1) SymbolInfoTick max bad time: 2.008 ms; avr bad time: 2.008 ms; bad iterations: 1 total iterations: 100000002020.10.3013:50:22.142 Test9 (EURUSD,H1) GetBid max bad time: 1.125 ms; avr bad time: 1.125 ms; bad iterations: 1 total iterations: 100000002020.10.3013:50:23.072 Test9 (USDCHF,H1) SymbolInfoTick max bad time: 2.245 ms; avr bad time: 2.245 ms; bad iterations: 1 total iterations: 100000002020.10.3013:50:23.288 Test9 (USDCAD,H1) GetBid max bad time: 1.298 ms; avr bad time: 1.182 ms; bad iterations: 2 total iterations: 100000002020.10.3013:50:23.297 Test9 (AUDCAD,H1) GetBid max bad time: 0.977 ms; avr bad time: 0 ms; bad iterations: 0 total iterations: 100000002020.10.3013:50:24.393 Test9 (EURUSD,H1) SymbolInfoTick max bad time: 3.400 ms; avr bad time: 2.862 ms; bad iterations: 2 total iterations: 10000000
Ich habe eine schlechte Zeitbedingung wie diese.
if(end>1000)
{
avr_time+=end;
counter++;
}
SZZ Ich habe den Code beigefügt, um die Objektivität der Forumsmitglieder zu gewährleisten.
Ihr EA läuft auf Idle-CPU, RannForex-Server, 6 Charts mit verschiedenen Symbolen. Als ich zu meinem Computer zurückkam, sah ich eine Menge davon.
Wenn ich es richtig verstanden habe, laufen in diesem Test 6 EAs in einer Schleife auf 4 CPU-Kernen, und jeder versucht, einen Kern zu 100 % auszulasten. Das heißt, es handelt sich definitiv um einen Stresstest, der sehr weit von normalen Betriebsbedingungen entfernt ist.
Unter solchen Bedingungen sind 1 oder 2 Auswürfe von 1-2ms für 10 Millionen Abfragen ein hervorragendes Ergebnis.
Und noch einmal zur Erinnerung: Je größer die Belastung, desto mehr testen Sie die Effizienz des Task-Planers des Betriebssystems, nicht des Terminals. Lassen Sie sich nicht täuschen.
Wenn ich es richtig verstehe, laufen in diesem Test 6 EAs in einer Schleife auf 4 CPU-Kernen, und jeder versucht, einen Kern zu 100 % auszulasten. Das heißt, es handelt sich definitiv um einen Stresstest, der sehr weit von normalen Betriebsbedingungen entfernt ist.
Ist dieser EA ein Stresstest? Ich frage Sie das, weil ich in der letzten Zeit
#include <fxsaber\BenchMark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279void GetMarketWatch( MqlTick &Ticks[] )
{
for (int i = ArrayResize(Ticks, Size2) - 1; i >= 0; i--)
_B(SymbolInfoTick(Symbols[i], Ticks[i]), 100);
}
Dies ist ein ziemlich typischer Fehler. Die aktuelle Implementierung von ArrayPrint druckt Zeichenketten durch aufeinanderfolgende Aufrufe mehrerer Prints. Sie sollten zunächst eine große Zeichenkette mit allen Daten bilden und diese dann über einen einzigen Druckvorgang ausgeben.
19 ms und 48 ms für die Ausführung von SymbolInfoTick. Es gab mehrere Dutzend Fälle, in denen die Dauer Hunderte von Mikrosekunden betrug. Aber ich habe sie nicht zitiert.
Offenbar müssen wir, um es zu reproduzieren, die Kampfberater 24 Stunden lang laufen lassen und dann nur noch beobachten. Meiner Meinung nach ist es unrealistisch, herauszufinden, was solche Verzögerungen auslöst.
Ich habe mir den Test9-Code oben auf der Seite angesehen. Warum 10 Millionen Mal ohne Schlaf, um Ticks von einem Symbol abzufragen? Was hat dieser Test mit dem realen Handel zu tun?
Ich denke, der Test sollte wie folgt aussehen: Wir fordern für jedes Symbol in der Marktübersicht einen Tick an. Wir pausieren Sleep(1) und so weiter. Überarbeiten Sie Ihren Code geringfügig:
intOnInit()
{
string Symbols[];
int TotalSymbol= SymbolsTotal(true);
ArrayResize(Symbols,TotalSymbol);
for(int i=0;i<TotalSymbol;i++)
Symbols[i]= SymbolName(i, true);
MqlTick Tick;
//---double temp=0;
ulong start,end,max_time=0,avr_time=0,counter=0;
int count=1 e4;
for(int i=0; !IsStopped() && (i<count); i++)
{
Sleep(1);
for(int j=0;j<TotalSymbol;j++)
{
start=GetMicrosecondCount();
SymbolInfoTick(Symbols[j], Tick);
// temp++;
end=GetMicrosecondCount()-start;
//---if(end>max_time)
max_time=end;
if(end>1000)
{
avr_time+=end;
counter++;
}
}
}
Comment("SymbolInfoTick max bad time: ",DoubleToString(max_time/1000.0,3)," ms; avr bad time: ",counter ? DoubleToString(avr_time/1000.0/counter,3):"0"," ms; bad iterations: ",counter," total iterations: ",count);
Print("SymbolInfoTick max bad time: ",DoubleToString(max_time/1000.0,3)," ms; avr bad time: ",counter ? DoubleToString(avr_time/1000.0/counter,3):"0"," ms; bad iterations: ",counter," total iterations: ",count);
returnINIT_FAILED;
}
Testen Sie 55 Symbole in der Übersicht.
SymbolInfoTick max bad time: 0.212 ms; avr bad time: 0 ms; bad iterations: 0 total iterations: 10000
Anton:
Ihr EA läuft auf Idle-CPU, RannForex-Server, 6 Charts mit verschiedenen Symbolen. Als ich zu meinem Computer zurückkam, sah ich eine Menge davon.
Ich habe eine schlechte Zeitbedingung wie diese.
SZZ Ich habe den Code beigefügt, um die Objektivität der Forumsmitglieder zu gewährleisten.
Ihr EA läuft auf Idle-CPU, RannForex-Server, 6 Charts mit verschiedenen Symbolen. Als ich zu meinem Computer zurückkam, sah ich eine Menge davon.
Wenn ich es richtig verstanden habe, laufen in diesem Test 6 EAs in einer Schleife auf 4 CPU-Kernen, und jeder versucht, einen Kern zu 100 % auszulasten. Das heißt, es handelt sich definitiv um einen Stresstest, der sehr weit von normalen Betriebsbedingungen entfernt ist.
Unter solchen Bedingungen sind 1 oder 2 Auswürfe von 1-2ms für 10 Millionen Abfragen ein hervorragendes Ergebnis.
Und noch einmal zur Erinnerung: Je größer die Belastung, desto mehr testen Sie die Effizienz des Task-Planers des Betriebssystems, nicht des Terminals. Lassen Sie sich nicht täuschen.
Ich habe eine Frage zur Relevanz der von SymbolInfoTick angegebenen Ticks.
Situation:
1. Wir machen TimeCurretn(); wir erhalten die Zeit 18:00:00
2. SymbolInfoTick bei einem ungültigen Symbol ausführen. Wir erhalten ein Häkchen mit der Zeit 17:58:00.
3. schlafen(1)
4. Fügt einen SymbolInfoTick für das nicht linke Symbol hinzu. Wir erhalten ein Häkchen mit der Uhrzeit 17:59:00.
D.h. im vierten Element haben wir einen neuen Tick, der eine Minute anders ist als TimeCurretn().
Sehen Sie in dieser Situation ein Problem?
Wie kommt man seltener in diese Situation?
Test EA.
Ich habe kein Alertite. Ergebnis (bei sechs Karten).
Es gibt ein Problem. Es ist schwer zu sagen, wie ernst es ist.
Wenn ich es richtig verstehe, laufen in diesem Test 6 EAs in einer Schleife auf 4 CPU-Kernen, und jeder versucht, einen Kern zu 100 % auszulasten. Das heißt, es handelt sich definitiv um einen Stresstest, der sehr weit von normalen Betriebsbedingungen entfernt ist.
Ist dieser EA ein Stresstest? Ich frage Sie das, weil ich in der letzten Zeit
gibt ein Meer von Warnungen aus.
Es gibt einen Fehler in der seriellen Log-Ausgabe von ArrayPrint.
Es ist klar, dass dies ein Fehler ist, da es sich um den Quellcode handelt.
Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests
MT5 und Geschwindigkeit in Aktion
fxsaber, 2020.10.30 15:04
Ich habe mehrmals jede Sekunde Alert ausgelöst.
19 ms und 48 ms für die Ausführung von SymbolInfoTick. Es gab mehrere Dutzend Fälle, in denen die Dauer Hunderte von Mikrosekunden betrug. Aber ich habe sie nicht zitiert.
Offenbar müssen wir, um es zu reproduzieren, die Kampfberater 24 Stunden lang laufen lassen und dann nur noch beobachten. Meiner Meinung nach ist es unrealistisch, herauszufinden, was solche Verzögerungen auslöst.
Ich habe mir den Test9-Code oben auf der Seite angesehen. Warum 10 Millionen Mal ohne Schlaf, um Ticks von einem Symbol abzufragen? Was hat dieser Test mit dem realen Handel zu tun?
Ich denke, der Test sollte wie folgt aussehen: Wir fordern für jedes Symbol in der Marktübersicht einen Tick an. Wir pausieren Sleep(1) und so weiter. Überarbeiten Sie Ihren Code geringfügig:
Testen Sie 55 Symbole in der Übersicht.
Testen wir nun temp++ anstelle von SymbolInfoTick;
Ich habe mir den Test9-Code oben auf der Seite angesehen. Warum 10 Millionen Mal ohne Schlaf, um Zecken von einem Zeichen zu verlangen?
Ganz und gar nicht. Lesen Sie die Zweigstelle für weitere Einzelheiten.
Nicht auf gleicher Augenhöhe. Lesen Sie den Thread für Details.
Verwirrt Sie nicht die Tatsache, dass selbst die maximale Ausführungszeit von temp++ bei dieser Messtechnik einige zehn Mikrosekunden beträgt?