Erreurs, bugs, questions - page 1593

 


Le script magique inverse le temps ;-)

Le script magique inverse le temps ;-)

 
Vladimir Pastushak:
Le smartphone reçoit un message à propos d'une revue de produit, mais pas sur la LC ou sur le haut du site mcl.
Ça a toujours été comme ça, je me souviens qu'ils ont même demandé de le mettre sur le site web parce que c'est étrange quand ils laissent des commentaires, et même s'ils vous posent des questions tout de suite et que vous ne le découvrez qu'après 2 mois. :-)
 

Ce n'est pas un bogue, mais je ne peux m'empêcher de le partager.

Rédaction

if((!IsRunOnTester() && TimeCurrent() >= D'2016.06.31 23:59'))// для тестировщиков, ограничение работы по времени

Le compilateur émet un avertissement

date invalide *****.mq4 115 46

Il vérifie également les dates valides des chaînes de caractères, je suis choqué). (30 jours de juin)

 

Apparemment, tout le monde s'en fiche, mais je vais écrire à nouveau.

La véritable tâche consiste à créer des tableaux d'une taille totale d'environ 100 % de la mémoire libre, à les remplir rapidement de chiffres, à effectuer des calculs et à les libérer.

J'essaie d'obtenir la taille de la mémoire libre avec

int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);

résultat : 23987 Mo, ma mémoire physique est de 12141 Mo, soit moitié moins.

Je comprends que ce chiffre est destiné aux Martiens, mais je continue à y croire et à écrire un script pour le tester :

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
#define  PARTS 5

   srand(GetTickCount());
//---
   int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);
   //mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.
   long mem_for_calc=(long)((double)mem_free_mb*1024*1024);
   long mem_one_part=(long)floor((double)mem_for_calc/PARTS);
   if(mem_one_part>=INT_MAX-1)
      mem_one_part=INT_MAX-1;
//---
   printf("Memory for calc: %0.f MB, parts: %d, part: %0.f MB",mem_for_calc/1024/1024,PARTS,mem_one_part/1024/1024);
   char array1[];
   char array2[];
   char array3[];
   char array4[];
   char array5[];

   int res=ArrayResize(array1,(int)mem_one_part);
   Print("Array1 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",1.0*mem_one_part/1024/1024);

   res=ArrayResize(array2,(int)mem_one_part);
   Print("Array2 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",2.0*mem_one_part/1024/1024);

   res=ArrayResize(array3,(int)mem_one_part);
   Print("Array3 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",3.0*mem_one_part/1024/1024);

   res=ArrayResize(array4,(int)mem_one_part);
   Print("Array4 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",4.0*mem_one_part/1024/1024);

   res=ArrayResize(array5,(int)mem_one_part);
   Print("Array5 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",5.0*mem_one_part/1024/1024);

   uint gtc=GetTickCount();
   for(int i=0;i<mem_one_part;i++)
     {
      char ch=(char)rand();
      array1[i]=ch;
      array2[i]=ch;
      array3[i]=ch;
      array4[i]=ch;
      array5[i]=ch;
     }
//---
   printf("Spent time: %d ms",GetTickCount()-gtc);
  }

J'obtiens un résultat logique - il est impossible d'allouer array3 car la mémoire est épuisée.

Puis je décommente la ligne, où je spécifie la quantité de mémoire disponible maintenant :

mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.

Après cela, le script s'exécute avec succès.

Je ne veux pas être une nuisance pour les développeurs, mais il est important de savoir combien de mémoire est disponible.

Veuillez faire en sorte qu'il soit possible de le connaître par le biais de TerminalInfoInteger.

 

Savez-vous que dans la plupart des cas, vous ne pourrez pas récupérer toute la mémoire disponible ?

La fragmentation de la mémoire existe. Vous avez décidé de diviser toute la mémoire en 5 fragments - et le système ne dispose pas d'un seul fragment ininterrompu de mémoire de la taille dont vous avez besoin.

 
Slawa:

Savez-vous que, dans la plupart des cas, vous ne pourrez pas récupérer toute la mémoire disponible ?

Une telle notion existe - la fragmentation de la mémoire. Vous avez décidé de diviser toute la mémoire en 5 fragments - mais le système ne dispose pas d'un seul fragment de mémoire continue de la taille dont vous avez besoin.

1. Pouvez-vous d'abord trouver ce que le paramètre TERMINAL_MEMORY_AVAILABLE signifie physiquement ?

2. En ce qui concerne les fragments, je pense que cela devrait être géré par le gestionnaire de mémoire de Windows, et non par le programmeur.

J'ai besoin de savoir combien je peux utiliser à un moment donné, par exemple, je veux utiliser 50% de la mémoire disponible.

Une autre tâche réelle est la demande de CopyTicks. Si vous demandez plus de ticks que la mémoire disponible, vous obtenez le message "out of memory".

 
Andrey Voytenko:

Un autre vrai défi est la demande de CopyTicks. Si vous demandez plus de ticks que la mémoire disponible, vous obtenez le message "out of memory".

Vous pouvez également décharger les données dans un fichier et les reprendre dans les segments requis.
 
coderex:
Vous pouvez également télécharger les données dans un fichier et y prélever les segments nécessaires.

C'est lent pour moi. Je veux tout faire par la mémoire. En fait, c'est ce qui est fait maintenant, mais je dois appeler GlobalMemoryStatusEx pour connaître la taille de la mémoire disponible.


	          
 
Andrey Voytenko:

Ce problème est particulièrement aigu lors de l'optimisation d'agents en nuage, dont vous ne connaissez pas les capacités dès le départ. Il est impossible de déterminer la quantité réelle de mémoire disponible, ni par MQL, ni par WinApi (car les appels de dll sont interdits).

On ne voit vraiment pas quel sens pratique a TERMINAL_MEMORY_AVAILABLE alors ? Pourquoi l'introduire si cela ne nous rend ni heureux ni malheureux ?

 
Andrey Voytenko:

C'est lent pour moi. Je veux tout faire par la mémoire. En fait, c'est ce qui est fait maintenant, mais je dois appeler GlobalMemoryStatusEx pour connaître la taille disponible.

Je ne peux même pas imaginer pourquoi une telle quantité de données devrait être analysée, à quoi cela sert-il ? Bien entendu, l'utilisation sera privée, car tous les PC ne disposent pas des mêmes ressources que vous. Il est tout à fait logique d'examiner l'évolution des algorithmes. Par exemple, essayez de déterminer le volume de l'historique des ticks pour un instrument par jour ou par session de négociation s'il s'agit d'une bourse, et prenez-les par périodes d'une journée ou pour chaque session.