Fehler, Irrtümer, Fragen - Seite 2676

 
Sergey Dzyublik:

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
 
Ilyas:

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.

 
fxsaber:

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.

Документация по MQL5: Операции с массивами / ArrayFree
Документация по MQL5: Операции с массивами / ArrayFree
  • www.mql5.com
//| Класс диалога для работы с памятью                               | //| Освобождение памяти текущего массива                             | //| Попытка добавления памяти для текущего массива                   | //| Обработка событий                                                |...
 
Slava:

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!

#property copyright "Copyright 2020, LittleBitTime"
#property link      "https://login.mql5.com/ru/users/LittleBitTime"
#property version   "1.00"

int OnInit() {
   return INIT_SUCCEEDED;
}

void OnDeinit(const int reason) {
}

void OnTick() {
   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;
      else
         PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", symbol, received, GetTickCount()-start, _LastError);
   }
   
   if (!success) {
      PrintFormat("Ошибкаp загрузки тиков! " + symbol);
      
      return false;
   }
   
   
   return true;
}
Dateien:
terminal.png  59 kb
tester.png  25 kb
tester_log.png  41 kb
 
LittleBitTime:

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

Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 
Ilyas:

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(const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize all",
   {
      T class_array[];
      ArrayResize(class_array, array_size);
   }
   )
};

template<typename T>
void test2(const int test_count, const int 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(const int test_count, const int 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];
      }
   }
   )
};


void OnStart()
{
  const int test_count = 1*K;
  const int 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);
}
  
 
Slava:

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 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.

 

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
Grund der Beschwerde: