Erreurs, bugs, questions - page 2676

 
Ilyas:

Pouvez-vous me dire comment réduire la consommation de mémoire du terminal ? Lorsque je lance un EA, je demande quelques millions de ticks. Je fais des calculs avec eux et je n'en ai plus besoin. Je n'utilise les fonctions tick que pour charger de nouveaux ticks afin qu'il n'y ait pas de trous.


À cause de ces millions de tics, le terminal consomme 500 Mo de mémoire et ne se presse pas pour la libérer. Pour être plus exact, elle ne le libère tout simplement pas. Est-il possible de forcer Terminal à vider tous ses caches pour minimiser la consommation ? Pour un VPS, 0,5 Go par terminal est trop.

 
fxsaber:

Pouvez-vous me dire comment réduire la consommation de mémoire du terminal ? Lorsque je lance un EA, je demande quelques millions de ticks. Je fais des calculs avec eux et je n'en ai plus besoin. Je n'utilise les fonctions tick que pour charger de nouveaux ticks afin qu'il n'y ait pas de trous.


À cause de ces millions de tics, le terminal consomme 500 Mo de mémoire et ne se presse pas pour la libérer. Pour être plus exact, elle ne le libère tout simplement pas. Est-il possible de forcer Terminal à vider tous ses caches pour minimiser la consommation ? Pour les VPS, 0,5 Go par terminal est trop.

ArrayFree

Si votre programme doit gérer la mémoire dans des environnements dynamiques complexes, la fonction ArrayFree() vous permet de libérer explicitement et immédiatement la mémoire occupée par un tableau dynamique qui n'est plus nécessaire.

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

ArrayFree

Gratuit, bien sûr. Le terminal lui-même stocke les ticks dans son cache, ce dont je n'ai pas besoin pendant le fonctionnement.

C'est mieux pour moi de soulever ces tics à nouveau quand j'ai froid. J'ai besoin d'un mécanisme pour "refroidir" le terminal.

 

Bonjour, j'ai rencontré un problème qui fait que CopyTicks et CopyTicksRange dans le testeur ne peuvent pas obtenir de données d'autres outils... Lorsqu'il est ajouté au tableau, tout fonctionne.

Build 2363 (et le même était sur 2361)

J'ai peut-être fait une erreur ? Aidez-nous, merci !

#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;
}
Dossiers :
terminal.png  59 kb
tester.png  25 kb
tester_log.png  41 kb
 
LittleBitTime:

Bonjour, j'ai rencontré un problème qui fait que CopyTicks et CopyTicksRange dans le testeur ne peuvent pas obtenir de données d'autres outils... Lorsqu'il est ajouté au tableau, tout fonctionne.

Build 2363 (et le même était sur 2361)

J'ai peut-être fait une erreur ? Aidez-nous, merci !

CopyTicks ne lance pas de téléchargement de données dans le testeur.

Demandez d'abord les CopyRates de l'instrument souhaité. Au moins un bar. Ensuite, le pompage et la génération de la séquence de tics auront lieu.

Après cela, demande discrètement des tics

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

Merci pour le message.
Le code ArrayResize a une protection contre un appel vide (lorsqu'il n'y a pas de changement dans le nombre d'éléments), donc le code de la fonction ne fonctionne pas.
Alors qu'un changement réel du nombre d'éléments, déclenche l'une ou l'autre partie de la fonction ArrayResize, en fonction du tableau.

Grâce au code que vous avez présenté, j'ai réussi à réduire la complexité d'une partie de ArrayResize à zéro, ce qui accélérera la fonction pour les tableaux d'objets

Bonjour, merci beaucoup.
Je n'ai pas encore utilisé l'opérateur new, car logiquement il devrait être plus lent que ArrayResize avec la mémoire réservée.
Mais je suis impressionné par les résultats obtenus, il s'avère que c'est l'inverse, le tableau natif via l'opérateur new est plus rapide.

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 ne lance pas de téléchargement de données dans le testeur.

Demandez d'abord les CopyRates de l'instrument souhaité. Au moins un bar. Ensuite, le pompage et la génération de la séquence de tics auront lieu.

Après cela, demande discrètement des tics

Merci beaucoup, ça m'a aidé. Je ne l'ai pas trouvé dans la documentation... Ou est-ce que je n'ai pas assez cherché ? Ce ne serait pas une mauvaise chose d'en parler là-bas :)
 
LittleBitTime:
Merci beaucoup, ça m'a aidé. Je ne l'ai pas trouvé dans la documentation... Ou bien j'ai mal cherché ? Ce serait bien d'en parler là-bas :)

Il serait préférable de faire des téléchargements automatiques comme sur CopyRates.

 

J'ai nettoyé la liste des "anciens" agents inactifs dans mon profil hier.

Un jour plus tard, je me rends dans le profil et constate que la liste des agents a été rétablie aux entrées qui avaient été supprimées.

Et la date de création et d'activité des agents a été modifiée

On suppose (peut-être à tort) que la liste est restaurée après avoir consulté les statistiques des agents sur cloud.mql5.com.
 
fxsaber:

La libération, bien sûr. Le terminal lui-même stocke les ticks dans son cache, ce dont je n'ai pas besoin pendant le fonctionnement.

Il est préférable pour moi de relever ces tics plus tard à froid. Il faut un mécanisme pour "refroidir" le terminal.

Je ne l'ai pas remarqué.

void OnStart()
  {
   Print("используется памяти до закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   MqlTick items[];
   ulong t0=GetMicrosecondCount();
   uint    count=CopyTicks(Symbol(),items,COPY_TICKS_INFO,0,100000000);
   t0=GetMicrosecondCount()-t0;
   Print ("Загружено за "+string(t0/1000)+" миллисекунд "+ (string)count+ " тиков");
   Print("используется памяти после закачки истории: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
   ArrayFree(items);
   Print("используется памяти после ArrayFree: "+string(MQLInfoInteger(MQL_MEMORY_USED))+" Mb");
  }


SZY Ce qui est triste, c'est que dans la mémoire, les ticks sont stockés sans emballage avec 60 octets par tick. Il pourrait facilement être emballé 5 fois (~12 octets par tic).