Caractéristiques du langage mql5, subtilités et techniques - page 182

 
Konstantin Nikitin:

Par exemple, je supprime tous les objets de mon VDS. Je ne veux pas surcharger le planning. Et il n'y a pas besoin d'eux là-bas. J'utilise des globales. Tout dépend donc de la situation.

Ecoutez, je ne les aime pas pour une raison :

  1. C'est une question d'atomicité des opérations avec eux. La documentation est muette à ce sujet, bien qu'en fait il s'agisse d'un objet et que les opérations avec eux ne soient pas atomiques, et que la lecture/écriture du double lui-même en x86 soit, si je ne me trompe pas, de deux instructions.
  2. L'accessibilité des variables en dehors du programme.
Si le point 1 est plutôt un grief sur la qualité de la documentation, le point 2 est sérieux.
 
Vladimir Simakov:

Ecoute, il y a une raison pour laquelle je ne les aime pas :

  1. La question de l'atomicité des opérations avec eux. La documentation est muette à ce sujet, bien qu'en fait, il s'agisse d'un objet, et les opérations avec eux ne sont pas atomiques, et la lecture/écriture du double en x86 lui-même est, si je ne me trompe pas, deux instructions.
  2. L'accessibilité des variables en dehors du programme.
Si le point 1 est plutôt un grognement sur la qualité de la documentation, le point 2 est sérieux.

Eh bien, il n'y a pas besoin de le lire. Vous pouvez utiliser GlobalVariableCheck pour vérifier si la variable est présente ou non. Vous pouvez faire de même avec les objets.
Il suffit donc de créer/contrôler/supprimer une variable.

 

Vladimir Simakov:

2. Disponibilité des variables en dehors du programme.

pas de problème, toutes les fonctions qui travaillent avec des variables globales ont une valeur de retour - le résultat de l'opération

il y a un outil de synchronisationhttps://www.mql5.com/ru/docs/globals/globalvariablesetoncondition , ce n'est pas grand chose, mais utilisez ce qui vous est offert.

Mais le gros inconvénient est le type de données - seulement double, je n'aime pas double, au moins ulong aurait été utilisable, et l'organisation de nom / valeur ---> chaîne / double provoque un désir de swap - pour écrire les données dans la chaîne et la clé en double - plus pour une opération peut être écrit / lu

mais ayant estimé tous ces "trucs" Vous pouvez les écrire dans des fichiers binaires, c'est-à-dire une liberté totale et aucune incertitude.

il faut probablement savoir comment travailler avec eux

@fxsaber a montré des exemples de travail avec tous les typeshttps://www.mql5.com/ru/forum/320395/page6#comment_12910394

 
Konstantin Nikitin:

Eh bien, il n'y a pas besoin de lire. Vous pouvez simplement utiliser GlobalVariableCheck pour vérifier si la variable existe ou non. Vous faites la même chose avec les objets.
Ainsi, il vous suffit de créer/contrôler/supprimer la variable.

Oui, un banal conflit d'appellation et la chaîne dans l'autre robot

GlobalVariableDel(yourValueName);

vous perdrez votre dépôt))))

Dites que le nom sera unique, que l'autre robot ne sera jamais là, que l'enfant/la femme/l'ami/l'ivrogne ne s'approchera jamais du terminal de combat))). D'accord, mais la probabilité n'est pas nulle, ce qui signifie que le code n'est pas fiable.

 
Vladimir Simakov:

Il s'agit d'un conflit de nom trivial et la ligne de l'autre robot

vous videra de votre dépôt)))

Vous direz que le nom sera unique, que l'autre robot ne sera jamais là, que l'enfant/la femme/l'ami/l'ivrogne lui-même ne s'approchera jamais du terminal de combat))). D'accord, mais la probabilité n'est pas nulle, ce qui signifie que le code n'est pas fiable.

Foutaises et fantasmes

Un EA sur l'argent fonctionne TOUJOURS à partir d'un terminal séparé, sur son propre VDS (ou même serveur) et personne ne s'en mêle jamais.

 
Maxim Kuznetsov:

Foutaises et fantasmes

Un EA sur l'argent fonctionne TOUJOURS à partir d'un terminal séparé, sur son propre VDS (ou même serveur) et personne ne s'en mêle jamais.

Que voulez-vous dire par TOUJOURS ? Aujourd'hui - toujours, demain vous pouvez calculer différemment. Et tout le monde ne semble pas être d'accord avec vous.

J'ai souligné le réel danger d'utiliser les variables globales du terminal. Ce n'est ni bon ni mauvais - c'est un acquis que les développeurs nous ont donné, nous devons juste en être conscients et en tenir compte.

La même chaîne

GlobalVariablesDeleteAll();

...fait dans n'importe quel script et oops...

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Particularités de mql5, trucs et astuces

Vladimir Simakov, 2020.05.24 17:02

La même chaîne

GlobalVariablesDeleteAll();

...fait dans n'importe quel script et oops.

Il en va de même pour les objets graphiques.

ObjectsDeleteAll(...


Seules les ressources de l'EA ne peuvent pas être modifiées par d'autres programmes.

 

Chers collègues, aidez-moi à réaliser une macro, si possible.

Je dois déclarer dynamiquement un tableau à deux dimensions. Et la deuxième dimension doit également être modifiée. C'est quelque chose comme cette boucle :

for(int would_be_size2=0;would_be_size2<5;would_be_size2++)
    {
     double d_array[][would_be_size2];
     int size2=ArrayRange(d_array,1);
    }

Bien sûr, le compilateur sera réticent à cette idée :

'[' - invalid index value       t7.mq5  20      22

J'aimerais voir une macro comme :

#define  CREATE_MARRAY(type,arr_name,size2) (type arr_name[][##size2])

Au lieu d'une ligne :

double d_array[][would_be_size2];

Merci.

 
Denis Kirichenko:

Chers collègues, aidez-moi à réaliser une macro, si possible.

Je dois déclarer dynamiquement un tableau à deux dimensions. Et la deuxième dimension doit également être modifiée. C'est quelque chose comme cette boucle :

Bien sûr, le compilateur sera réticent à cette idée :

J'aimerais voir une macro comme la suivante :

Au lieu d'une ligne :

Merci.

Mais la création d'un tableau de taille suffisante (maximale) en dehors de la boucle est entravée par la politique ? :-)

L'approche ci-dessus (recréer le tableau dans la boucle à chaque fois) ne gagne rien en termes de vitesse ou de consommation de mémoire.

 
Denis Kirichenko:

J'aimerais voir une macro similaire à celle-ci :

Ça ne marchera pas.

Raison: