Erreurs, bugs, questions - page 2646

 
Alain Verleyen:

Ce n'est pas exact.

Merci !

Oui, ça va marcher, je me suis trompé dans la syntaxe.

ZS : tout ce qui est prévu fonctionne maintenant :

struct A
  {
   long              l;
   uint              ui;
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   A a;
   uchar u_arr[];
   string result = "";
   a.l  = 0xFFFFFFFFFFFFFFFF;
   a.ui = 0x0000;
//--- проверка работоспособности вывода
   StructToCharArray(a, u_arr);
   for(int i = 0; i < ArraySize(u_arr); i++)
     {
      result += StringFormat("%x", u_arr[i]);
     }
   printf("result = %s", result);   // result = ffffffffffffffff0000

//----  
   string s = StructEncodeBase64(a);
   Print(s);
   A b;
   b = StructDecodeBase64<A>(s);

   StructToCharArray(b, u_arr);
   result="";
   for(int i = 0; i < ArraySize(u_arr); i++)
     {
      result += StringFormat("%x", u_arr[i]);
     }
    printf("result = %s", result);

  }
//+------------------------------------------------------------------+
template<typename T>
string StructEncodeBase64(T &s_value)
  {
   const uchar key[1] = {0};
   uchar data[], result[];
   StructToCharArray(s_value, data);
   CryptEncode(CRYPT_BASE64, data, key, result);
   return(CharArrayToString(result));
  }
//+------------------------------------------------------------------+
template<typename T>
T StructDecodeBase64(string value)
  {
   const uchar key[1] = {0};
   uchar data[], decode[];
   T result;
   StringToCharArray(value, data, 0, StringLen(value));
   CryptDecode(CRYPT_BASE64, data, key, decode);
   CharArrayToStruct(result, decode);
   return(result);
  }
Sérialisation Base64 des structures POD
 
Alain Verleyen:

Ce n'est pas sûr.

Non, ça ne l'est pas. Vous avez noté le réglage explicite des types de paramètres de template dans la fonction, et je parlais de la sortie, du réglage explicite fxsaber a répondu avant moi. et avant vous

 
Andrei Trukhanovich :

Non, c'est vrai. Vous avez noté le réglage explicite des types de paramètres de template dans la fonction, et je parlais de la sortie, du réglage explicite fxsaber a répondu avant moi. et avant vous

Problème de langue.
 

Je ne l'ai pas trouvé sur le forum ou dans la documentation, j'ai donc une question :

1. Quelle est la taille maximale de la chaîne de caractères que MQL5 peut stocker ?

2. Quelle est la taille maximale de la chaîne de caractères que MQL4 peut stocker ?

3. s'il y a un manque de mémoire, cette taille maximale sera-t-elle réduite (ou aucune mémoire ne sera allouée pour la chaîne) ou y aura-t-il une erreur d'exécution ?

 

Défauts :
(non corrigé par MT5(build 2319)) bogue dans l'opération de cache des classes de modèles : "Vous créez un objet enveloppé complexe avec le type interne "C" plusieurs fois, et il s'avère être un type de données tout à fait différent, peut-être "B", peut-être "int", ce que vous voulez...".
(non corrigé par MT5(build 2319)) bogue avec la génération de code de classe de modèle lors de l'utilisation de classe interne.
(non corrigé MT5(build 2319)) bug lors de la définition d'une classe interne - pas de possibilité de référencer explicitement l'espace de nom global lors de la spécification d'une classe de base.


Suggestions :
ref - sur la nécessité d'introduire la fonctionnalité de déclaration typedef dans MQL.
Référence- pour permettre de forcer la génération de constructeurs de copie et d'opérateurs d'affectation par défaut.

 
Sergey Dzyublik:

Défauts :

C'est bien que vous gardiez trace de vos rapports de bogue. Je ne l'ai pas fait, c'est pourquoi tout s'est irrémédiablement perdu dans le forum.

Vous devriez peut-être ajouter le même enregistrement de hachage à vos messages de rapport de bogue, afin de pouvoir les rechercher tous en même temps.

 
Igor Makanu:

Je ne l'ai pas trouvé sur le forum ou dans les docks, alors j'ai une question :

1. Quelle est la taille maximale de la chaîne de caractères que MQL5 peut stocker ?

2. Quelle est la taille maximale de la chaîne de caractères que MQL4 peut stocker ?

3. si la mémoire est insuffisante, la taille maximale sera réduite (ou aucune mémoire ne sera allouée pour la chaîne) ou y aura-t-il une erreur d'exécution ?

J'ai essayé de tester une chaîne de caractères dans MT4

void OnTick()
  {
   static bool frun = true;
   uchar u_arr[102400];
   if(frun)
     {
      frun = false;
      string s = "";
      while(!IsStopped())
        {
         ArrayInitialize(u_arr, uchar(rand() % 255));
         s += CharArrayToString(u_arr);
         printf("StringLen = %i , m_physical = %i, m_total = %i, m_available = %i, m_used = %i", StringLen(s), TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL), TerminalInfoInteger(TERMINAL_MEMORY_TOTAL),
                TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE), TerminalInfoInteger(TERMINAL_MEMORY_USED));
         Sleep(150);
        }
     }
  }
//+------------------------------------------------------------------+

La mémoire fuit lentement (5.1 sur 11.9), dans MT4 dans le journal :

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_available = 3365, m_used = 729


en général, pour les tâches sensibles, vous pouvez utiliser une grosse chaîne, peut-être que plus tard je copierai le fichier à travers une chaîne pour vérifier

UPD : remplacement deuchar u_arr[102400] ; par uchar u_arr[524224]; ; pour accélérer le processus

En résumé : dans MT4, le maximum approximatif que l'on peut mettre dans une chaîne est :

2020.02.13 21:11:24.177 tst_string EURUSD,H1 : mémoire insuffisante

2020.02.13 21:11:24.024 tst_string EURUSD,H1 : StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_available = 2556, m_used = 1539


c'est-à-dire environ 640 Mo

SZZ : MT5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_available = 21975, m_used = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) mémoire insuffisante dans 'tst_string.mq5' (41,12)

c'est-à-dire environ 1GB
 
Igor Makanu :

J'ai essayé de tester la chaîne dans MT4

La mémoire fuit un peu dans Win Manager (5.1 sur 11.9), dans MT4 dans le journal :

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_available = 3365, m_used = 729


En général, pour les tâches sensibles, vous pouvez utiliser une grande chaîne, peut-être que plus tard je copierai le fichier à travers une chaîne pour vérifier

UPD : remplacement de uchar u_arr[ 102400 ] ; par uchar u_arr[524224] ; pour accélérer le processus

En résumé : dans MT4, le maximum approximatif qui peut être mis en chaîne est :

2020.02.13 21:11:24.177 tst_string EURUSD,H1 : hors de la mémoire

2020.02.13 21:11:24.024 tst_string EURUSD,H1 : StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_available = 2556, m_used = 1539


c'est-à-dire environ 640 Mo

SZZ : MT5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_available = 21975, m_used = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) mémoire insuffisante dans 'tst_string.mq5' (41,12)

c'est-à-dire environ 1GB

Il s'agit de la longueur de la chaîne de caractères pour Unicode, donc en MB elle est au moins double. 1,3 Go pour MT4, ce qui est logique puisque vous avez besoin d'une mémoire tampon continue et que MT4 est une application 32 bits. Ainsi, la limitation de mql4 n'est pas une limitation en soi, mais est seulement limitée par la mémoire disponible.

Je suis un peu surpris que MT5 ne permette pas plus, car il semble que vous ayez beaucoup de mémoire disponible. Je vais faire de mon mieux de mon côté.

 
Alain Verleyen:

Il s'agit de la longueur de la chaîne de caractères pour Unicode, donc en MB elle est au moins double. 1,3 Go pour MT4, ce qui est logique puisque vous avez besoin d'une mémoire tampon continue et que MT4 est une application 32 bits. Ainsi, la limitation de mql4 elle-même n'est pas une limitation, elle est seulement limitée par la mémoire disponible.

Je suis un peu surpris que MT5 ne permette pas plus, car il semble que vous ayez beaucoup de mémoire disponible. Je vais faire de mon mieux de mon côté.

J'ai 12 Go de mémoire, Windows 10, 8 Go de mémoire libre.


j'avais besoin de ce test pour connaître la longueur maximale de ligne autorisée dans les terminaux mt4/ mt5

Je veux maintenant échanger entre les terminaux via la base de données Redis

Redis est une base de données très simple et ne fonctionne qu'avec des chaînes de caractères (clé - valeur --> chaîne - chaîne).

Hier, j'ai sérialisé des structures POD en Base64 et cela augmente la taille des données d'environ 1/3.

Je pense que même dans ce cas, j'ai la possibilité d'échanger des structures d'une taille de 400 Mo par transaction - c'est plus qu'assez pour n'importe quel usage ;)

 

Désormais, dans MetaEditor, lorsque l'on travaille sur un projet pour déplacer les fichiers du projet dans l'onglet "Projet", par exemple vers un sous-dossier nouvellement créé, il faut effectuer tout un "rituel" :

- assurez-vous que toutes les modifications apportées aux fichiers à déplacer ont été sauvegardées, sinon le travail effectué peut être perdu ;
- faites glisser et déposez les fichiers de l'onglet "Projet" vers le nouvel emplacement ;
- fermez tous les onglets sur les fichiers en cours de migration, car ils peuvent utiliser un chemin incorrect ;
- rouvrir tous les onglets fermés, mais en utilisant le nouveau chemin.
- réorganiser les onglets ouverts dans le même ordre qu'avant leur fermeture.

Suggestion :
Lorsque vous déplacez des fichiers de projet dans l'onglet Projet, par exemple vers un sous-dossier nouvellement créé :
- pour les fichiers ouverts mais inchangés, mettre automatiquement à jour leur chemin d'accès.
- pour les fichiers modifiés, demander en plus une confirmation : "Transfert avec sauvegarde", "Transfert avec perte des modifications", ou "Annuler l'opération de transfert".