MT5 (Build 2347) Warum ist der Overhead so groß, wenn man ein Element nach dem anderen zu einem Array mit ArrayResize hinzufügt, wenn der Speicher für diese Elemente im Voraus reserviert wurde?
Bitte erwägen Sie die Verbesserung des internen Reservierungsalgorithmus mit ArrayResize.
Bei Klassen können wir zum Beispiel davon ausgehen, dass sie zusätzlich zum Konstruktoraufruf eine Art "internes Register in Listen" durchführen. Und im Rahmen der Reservierung mit ArrayResize kann man neben der direkten Speicherzuweisung versuchen, den Prozess zu optimieren: - Daten aus dem benachbarten erstellten Element übernehmen (z. B. Zeiger auf eine virtuelle Funktionstabelle); - eine Vorabregistrierung oder eine Platzreservierung für die "interne Registrierung" von Klassen, die noch nicht erstellt wurden;
Vielen Dank für die Nachricht.
Der ArrayResize-Code ist davor geschützt, leer aufgerufen zu werden (wenn sich die Anzahl der Elemente nicht ändert), so dass der Funktionscode nicht funktioniert.
Eine echte Änderung der Anzahl der Elemente löst je nach Array den einen oder anderen Teil der ArrayResize-Funktion aus.
Dank des von Ihnen vorgestellten Codes konnte ich die Komplexität eines Teils von ArrayResize auf Null reduzieren, was die Funktion für Arrays von Objekten beschleunigen wird
Können Sie mir sagen, wie ich den Speicherverbrauch des Terminals reduzieren kann? Wenn ich einen EA laufen lasse, fordere ich ein paar Millionen Ticks an. Ich rechne mit ihnen und brauche sie nicht mehr. Ich verwende die Tick-Funktionen nur, um neue Ticks zu laden, damit es keine Lücken gibt.
Wegen dieser Millionen Ticks verbraucht das Terminal 500 Mb Speicher und hat es nicht eilig, diesen wieder freizugeben. Um genau zu sein, wird er einfach nicht frei. Ist es möglich, Terminal zu zwingen, alle Caches zu leeren, um den Verbrauch zu minimieren? Für einen VPS sind 0,5 GB pro Terminal zu viel.
Können Sie mir sagen, wie ich den Speicherverbrauch des Terminals reduzieren kann? Wenn ich einen EA laufen lasse, fordere ich ein paar Millionen Ticks an. Ich rechne mit ihnen und brauche sie nicht mehr. Ich verwende die Tick-Funktionen nur, um neue Ticks zu laden, damit es keine Lücken gibt.
Wegen dieser Millionen Ticks verbraucht das Terminal 500 Mb Speicher und hat es nicht eilig, diesen wieder freizugeben. Um genau zu sein, wird er einfach nicht frei. Ist es möglich, Terminal zu zwingen, alle Caches zu leeren, um den Verbrauch zu minimieren? Für VPS sind 0,5 GB pro Terminal zu viel.
Wenn Ihr Programm Speicher in komplexen dynamischen Umgebungen verwalten muss, können Sie mit der Funktion ArrayFree() explizit und sofort Speicher freigeben, der von einem dynamischen Array belegt ist, das nicht mehr benötigt wird.
//| Класс диалога для работы с памятью | //| Освобождение памяти текущего массива | //| Попытка добавления памяти для текущего массива | //| Обработка событий |...
Hallo, bin auf das Problem gestoßen, dass CopyTicks und CopyTicksRange im Tester keine Daten von anderen Tools bekommen können... Nach dem Hinzufügen zum Diagramm funktioniert alles.
Build 2363 (und das gleiche war auf 2361)
Habe ich vielleicht einen Fehler gemacht? Bitte helfen Sie uns, danke!
#property copyright"Copyright 2020, LittleBitTime"#property link"https://login.mql5.com/ru/users/LittleBitTime"#property version"1.00"intOnInit() {
returnINIT_SUCCEEDED;
}
voidOnDeinit(constint reason) {
}
voidOnTick() {
MqlTick LastTick;
if (SymbolInfoTick(Symbol(), LastTick)) {
//Print("START");if (GetTicks("RTS-3.20", LastTick.time_msc) && GetTicks("RTS-6.20", LastTick.time_msc)) {
Print("История загружена");
} else {
Print("Ошибка загрузки истории");
}
//Print("END");
} else {
Print("Ошибка получения последнего тика, для получения последнего известного времени");
}
}
bool GetTicks(string symbol, ulong TimeEnd) {
ulong TimeStartPeriod = TimeEnd-(60*1000);
MqlTick ticks[];
bool success = false; //флаг успешного выполнения копирования тиковuint start = GetTickCount(); //замерим время старта перед получением тиковint received = CopyTicksRange(symbol, ticks, COPY_TICKS_ALL, TimeStartPeriod, TimeEnd);
if (received != -1) {
//выведем информацию о количестве тиков и затраченном времени времениPrintFormat("%s: received %d ticks in %d ms", symbol, received, GetTickCount()-start);
//если тиковая история синхронизирована, то код ошибки равен нулюif (GetLastError() == 0)
success = true;
elsePrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", symbol, received, GetTickCount()-start, _LastError);
}
if (!success) {
PrintFormat("Ошибкаp загрузки тиков! " + symbol);
returnfalse;
}
returntrue;
}
Hallo, bin auf das Problem gestoßen, dass CopyTicks und CopyTicksRange im Tester keine Daten von anderen Tools bekommen können... Nach dem Hinzufügen zum Diagramm funktioniert alles.
Build 2363 (und das gleiche war auf 2361)
Habe ich vielleicht einen Fehler gemacht? Bitte helfen Sie uns, danke!
CopyTicks initiiert keinen Daten-Upload im Tester
Fordern Sie zunächst die CopyRates für das gewünschte Instrument an. Mindestens 1 bar. Dann wird gepumpt und eine Ticksequenz erzeugt.
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха, ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
Vielen Dank für die Nachricht. Der ArrayResize Code hat einen Schutz gegen einen leeren Aufruf (wenn es keine Änderung in der Anzahl der Elemente gibt), so dass der Funktionscode nicht funktioniert. Eine echte Änderung der Anzahl der Elemente löst je nach Array den einen oder anderen Teil der ArrayResize-Funktion aus.
Dank des von Ihnen vorgestellten Codes ist es mir gelungen, die Komplexität eines Teils von ArrayResize auf Null zu reduzieren, was die Funktion für Arrays von Objekten beschleunigen wird
Guten Tag, ich danke Ihnen vielmals. Ich habe den new-Operator bisher noch nicht verwendet, weil er logischerweise langsamer sein sollte als ArrayResize mit reserviertem Speicher. Aber ich bin beeindruckt von den erzielten Ergebnissen, es stellt sich heraus, dass es umgekehrt ist, die native Array über neue Operator ist schneller.
MT5 (Build 2363):
#define K 1000#define M (1000 * K)
#define SpeedTest(test_count,msg,EX) {uint mss=GetTickCount(); ulong count=test_count;for(ulong ii=0;ii<count&&!_StopFlag;ii++){EX;} \
printf("%-60s: loops=%i ms=%u",msg,count,GetTickCount()-mss);}
class A{
public:
int data;
};
template<typename T>
void test1(constint test_count, constint array_size){
SpeedTest(
test_count,"Test Class ArrayResize all",
{
T class_array[];
ArrayResize(class_array, array_size);
}
)
};
template<typename T>
void test2(constint test_count, constint array_size){
SpeedTest(
test_count,"Test Class ArrayResize one by one with reserved memory",
{
T class_array[];
ArrayResize(class_array, 1, array_size - 1);
for(int i = 2; i <= array_size; i++){
ArrayResize(class_array, i);
}
}
)
};
template<typename T>
void test3(constint test_count, constint array_size){
SpeedTest(
test_count,"Test Class ArrayResize one by one with new operator",
{
T* class_array[];
ArrayResize(class_array, array_size);
for (int i = 0; i < array_size; ++i){
class_array[i] = new T();
}
for (int i = 0; i < array_size; ++i){
delete class_array[i];
}
}
)
};
voidOnStart()
{
constint test_count = 1*K;
constint array_size = 25*K;
printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
test1<A>(test_count, array_size); // Avg time: release( 730) / debug( 830)
test2<A>(test_count, array_size); // Avg time: release(1540) / debug(1720)
test3<A>(test_count, array_size); // Avg time: release(1200) / debug(1470)
test1<A>(test_count, array_size);
test2<A>(test_count, array_size);
test3<A>(test_count, array_size);
test1<A>(test_count, array_size);
test2<A>(test_count, array_size);
test3<A>(test_count, array_size);
test1<A>(test_count, array_size);
test2<A>(test_count, array_size);
test3<A>(test_count, array_size);
}
Fordern Sie zunächst die CopyRates für das gewünschte Instrument an. Mindestens 1 bar. Dann wird gepumpt und eine Ticksequenz erzeugt.
Danach, leise Anfrage tickt
Vielen Dank, das war sehr hilfreich. Ich konnte es in der Dokumentation nicht finden... Oder habe ich nicht genau genug hingesehen? Es wäre nicht schlecht, dort darüber zu schreiben :)
LittleBitTime: Vielen Dank, das war sehr hilfreich. Ich konnte es in der Dokumentation nicht finden... Oder habe ich schlecht gesucht? Es wäre gut, dort darüber zu schreiben :)
Es wäre besser, automatische Uploads wie bei CopyRates durchzuführen.
MT5 (Build 2347) Warum ist der Overhead so groß, wenn man ein Element nach dem anderen zu einem Array mit ArrayResize hinzufügt, wenn der Speicher für diese Elemente im Voraus reserviert wurde?
Bitte erwägen Sie die Verbesserung des internen Reservierungsalgorithmus mit ArrayResize.
Bei Klassen können wir zum Beispiel davon ausgehen, dass sie zusätzlich zum Konstruktoraufruf eine Art "internes Register in Listen" durchführen.
Und im Rahmen der Reservierung mit ArrayResize kann man neben der direkten Speicherzuweisung versuchen, den Prozess zu optimieren:
- Daten aus dem benachbarten erstellten Element übernehmen (z. B. Zeiger auf eine virtuelle Funktionstabelle);
- eine Vorabregistrierung oder eine Platzreservierung für die "interne Registrierung" von Klassen, die noch nicht erstellt wurden;
Vielen Dank für die Nachricht.
Der ArrayResize-Code ist davor geschützt, leer aufgerufen zu werden (wenn sich die Anzahl der Elemente nicht ändert), so dass der Funktionscode nicht funktioniert.
Eine echte Änderung der Anzahl der Elemente löst je nach Array den einen oder anderen Teil der ArrayResize-Funktion aus.
Dank des von Ihnen vorgestellten Codes konnte ich die Komplexität eines Teils von ArrayResize auf Null reduzieren, was die Funktion für Arrays von Objekten beschleunigen wird
Können Sie mir sagen, wie ich den Speicherverbrauch des Terminals reduzieren kann? Wenn ich einen EA laufen lasse, fordere ich ein paar Millionen Ticks an. Ich rechne mit ihnen und brauche sie nicht mehr. Ich verwende die Tick-Funktionen nur, um neue Ticks zu laden, damit es keine Lücken gibt.
Wegen dieser Millionen Ticks verbraucht das Terminal 500 Mb Speicher und hat es nicht eilig, diesen wieder freizugeben. Um genau zu sein, wird er einfach nicht frei. Ist es möglich, Terminal zu zwingen, alle Caches zu leeren, um den Verbrauch zu minimieren? Für einen VPS sind 0,5 GB pro Terminal zu viel.
Können Sie mir sagen, wie ich den Speicherverbrauch des Terminals reduzieren kann? Wenn ich einen EA laufen lasse, fordere ich ein paar Millionen Ticks an. Ich rechne mit ihnen und brauche sie nicht mehr. Ich verwende die Tick-Funktionen nur, um neue Ticks zu laden, damit es keine Lücken gibt.
Wegen dieser Millionen Ticks verbraucht das Terminal 500 Mb Speicher und hat es nicht eilig, diesen wieder freizugeben. Um genau zu sein, wird er einfach nicht frei. Ist es möglich, Terminal zu zwingen, alle Caches zu leeren, um den Verbrauch zu minimieren? Für VPS sind 0,5 GB pro Terminal zu viel.
ArrayFree
Wenn Ihr Programm Speicher in komplexen dynamischen Umgebungen verwalten muss, können Sie mit der Funktion ArrayFree() explizit und sofort Speicher freigeben, der von einem dynamischen Array belegt ist, das nicht mehr benötigt wird.
ArrayFree
Natürlich kostenlos. Das Terminal selbst speichert Ticks in seinem Cache, die ich im Betrieb nicht benötige.
Es ist besser für mich, diese Zecken wieder aufzuziehen, wenn mir kalt ist. Ich brauche einen Mechanismus zur "Abkühlung" des Terminals.
Hallo, bin auf das Problem gestoßen, dass CopyTicks und CopyTicksRange im Tester keine Daten von anderen Tools bekommen können... Nach dem Hinzufügen zum Diagramm funktioniert alles.
Build 2363 (und das gleiche war auf 2361)
Habe ich vielleicht einen Fehler gemacht? Bitte helfen Sie uns, danke!
Hallo, bin auf das Problem gestoßen, dass CopyTicks und CopyTicksRange im Tester keine Daten von anderen Tools bekommen können... Nach dem Hinzufügen zum Diagramm funktioniert alles.
Build 2363 (und das gleiche war auf 2361)
Habe ich vielleicht einen Fehler gemacht? Bitte helfen Sie uns, danke!
CopyTicks initiiert keinen Daten-Upload im Tester
Fordern Sie zunächst die CopyRates für das gewünschte Instrument an. Mindestens 1 bar. Dann wird gepumpt und eine Ticksequenz erzeugt.
Danach, leise Anfrage tickt
Vielen Dank für die Nachricht.
Dank des von Ihnen vorgestellten Codes ist es mir gelungen, die Komplexität eines Teils von ArrayResize auf Null zu reduzieren, was die Funktion für Arrays von Objekten beschleunigen wirdDer ArrayResize Code hat einen Schutz gegen einen leeren Aufruf (wenn es keine Änderung in der Anzahl der Elemente gibt), so dass der Funktionscode nicht funktioniert.
Eine echte Änderung der Anzahl der Elemente löst je nach Array den einen oder anderen Teil der ArrayResize-Funktion aus.
Guten Tag, ich danke Ihnen vielmals.
Ich habe den new-Operator bisher noch nicht verwendet, weil er logischerweise langsamer sein sollte als ArrayResize mit reserviertem Speicher.
Aber ich bin beeindruckt von den erzielten Ergebnissen, es stellt sich heraus, dass es umgekehrt ist, die native Array über neue Operator ist schneller.
MT5 (Build 2363):
CopyTicks initiiert keinen Daten-Upload im Tester
Fordern Sie zunächst die CopyRates für das gewünschte Instrument an. Mindestens 1 bar. Dann wird gepumpt und eine Ticksequenz erzeugt.
Danach, leise Anfrage tickt
Vielen Dank, das war sehr hilfreich. Ich konnte es in der Dokumentation nicht finden... Oder habe ich schlecht gesucht? Es wäre gut, dort darüber zu schreiben :)
Es wäre besser, automatische Uploads wie bei CopyRates durchzuführen.
Habe gestern die Liste der "alten" inaktiven Agenten in meinem Profil bereinigt
Einen Tag später rufe ich das Profil auf und sehe, dass die Liste der Bearbeiter wieder auf die gelöschten Einträge zurückgesetzt wurde.
Und das Erstellungsdatum und die Aktivität von Agenten wurde geändert

Es besteht die (möglicherweise irrige) Annahme, dass die Liste nach der Anzeige der Agentenstatistiken auf cloud.mql5.com wiederhergestellt wird