Questions des débutants MQL5 MT5 MetaTrader 5 - page 1482

 
MrBrooklin #:

Bonjour Alexey, la variable pos_PositionsTotal(), elle était juste définie au niveau global. Maintenant je l'ai déplacée à l'intérieur de la fonction et il s'est avéré que c'était là le problème. Tout fonctionne. Quel est le problème ? Je ne comprends pas du tout la blague ! !!

Maintenant, pour le bien de l'expérience, j'ai déplacé pos_total au niveau global à nouveau et cela a cessé de fonctionner à nouveau, mais quand je l'ai mis à l'intérieur de la fonction, cela fonctionne comme il se doit ! Quelques miracles, en tout cas pour moi !!!! )))

Il s'avère qu'une variable au niveau global ne peut pas être initialisée par une fonction ? C'est bien cela ?

Cordialement, Vladimir.

Parfois, c'est possible, mais pas pour toutes les variables. Dans ce cas, lorsque vous exécutez l'EA, il ne voit pas encore les positions ouvertes et la variable est égale à zero.....

En fait, hier, j'ai expérimenté l'échantillonnage de positions et je suis arrivé à la conclusion que PositionsTotal() n'est nécessaire que pour déterminer le nombre de positions. Et ce nombre n'est nécessaire que pour limiter la boucle.

Voici une telle boucle

  int i = 0;
  while(bool(posTicket = PositionGetTicket(i)) && !IsStopped())
   {
    string posSymbol = PositionGetString(POSITION_SYMBOL);
    double posPrice = PositionGetDouble(POSITION_PRICE_OPEN),
           pos_tp = PositionGetDouble(POSITION_TP),
           pos_sl = PositionGetDouble(POSITION_SL);
    printf("%s Ticket %d цена = %g тейк-профит = %g стоп-лосс = %g", posSymbol, posTicket, posPrice, pos_tp, pos_sl);
    i++;
   }


fonctionne même si vous obtenez une liste d'ordres ou de transactions à partir de l'historique qui la précède. Un de ces jours, je vérifierai si la sélection des ordres en attente interfère avec elle.


Et dans votre cas, il est plus facile d'écrire sans boucle

      PositionGetTicket(PositionsTotal()-1); // получим тикет позиции

si vous avez besoin de la dernière position...

 
Alexey Viktorov #:
Dans ce cas, lorsque vous démarrez l'EA, il ne voit pas encore les positions ouvertes et la variable est égale à zéro ...

Je serais d'accord avec vous, mais voici le problème - lorsque j'ai mis la variable pos_total au niveau global, l'EA n'a pas vu de positions ouvertes pendant toute la période de test, bien que plus de 50 positions aient été ouvertes pendant cette période. Je ne comprends pas ! Il s'avère que cette option ne fonctionne pas ?

Cordialement, Vladimir.

 
Alexey Viktorov #:

Dans votre cas, il est plus facile d'écrire sans boucle

si vous avez besoin de la dernière position...

Je suis d'accord, si je n'avais pas plusieurs positions ouvertes sur un symbole différent et dans des directions différentes. Je veux dire acheter et vendre. Mais merci quand même pour l'astuce !

Cordialement, Vladimir.

 
MrBrooklin #:

Je suis d'accord, s'il n'y avait pas plusieurs positions ouvertes sur un symbole différent et dans des directions différentes. Je veux dire acheter et vendre. Mais merci quand même pour le conseil !

Bien à vous, Vladimir.

Peu importe le nombre de positions ouvertes et si elles vont vers le nord ou vers la baise ou dans toutes les directions à la fois... La dernière sera PositionsTotal()-1.

 
Alexey Viktorov #:

Le nombre de positions ouvertes et le fait qu'elles soient ouvertes vers le nord, vers le nord ou dans toutes les directions à la fois ne font aucune différence... La dernière sera PositionsTotal()-1.

Bonjour Alexei, j'étais un peu confus. Vous avez raison comme toujours ! )))

Cordialement, Vladimir.

 
Alexey Viktorov #:

En fait, hier, j'ai expérimenté l'échantillonnage de positions et je suis arrivé à la conclusion que PositionsTotal() n'est nécessaire que pour déterminer le nombre de positions. Et ce nombre n'est nécessaire que pour limiter la boucle.

Voici une telle boucle


fonctionne même si vous obtenez une liste d'ordres ou de transactions à partir de l'historique qui la précède. L'autre jour, je vérifierai si la sélection des ordres en attente interfère.

Il y a aussi une subtilité ici.

Si la liste est vraiment grande et ordonnée selon un certain critère, il peut être plus rentable de rechercher l'élément requis non pas en recherchant tous les éléments de la boucle, mais par demi-division, et ici la connaissance du nombre total d'éléments dans la liste peut s'avérer très utile.

 
JRandomTrader #:

Il y a là aussi une certaine subtilité.

Si la liste est vraiment grande et ordonnée selon un certain critère, il peut être plus rentable de rechercher l'élément requis non pas en parcourant tous les éléments, mais en effectuant une demi-division, et dans ce cas, la connaissance du nombre total d'éléments dans la liste peut être très utile.

Je n'ai pas dit que la fonction était complètement inutile. Mais dans certains cas, vous pouvez et devez vous en passer. Après tout, chaque fonction est un temps. Vous pouvez taper petit à petit jusqu'à ce que vous obteniez des freins....

 
MrBrooklin #:

Bonjour Alexei, j'ai été stupide. Tu as raison comme toujours ! !! )))

Cordialement, Vladimir.

J'ai raison, mais je n'ai pas précisé que la fonction telle que vous l'avez écrite ne fonctionnera pas correctement si plusieurs transactions sont ouvertes sur des symboles différents.

Puisque vous ne vérifiez que la dernière, et qu'elle (la dernière) peut être ouverte sur un autre symbole.

 
Aleksandr Slavskii #:

Oui, mais je n'ai pas précisé que la fonction telle que vous l'avez écrite ne fonctionnera pas correctement si plusieurs transactions sont ouvertes sur des symboles différents.

Puisque vous ne vérifiez que la dernière, et qu'elle (la dernière) peut être ouverte sur un autre symbole.

Bonjour Alexandre, j'ai déjà réfléchi à ce sujet, mais je n'ai pas encore commencé à poser la question ici, car je n'ai pas encore atteint l'endroit du code où il y aura des positions de symboles différentes. Merci pour l'astuce ! )) Je suis maintenant bloqué sur un point, mais je ne veux pas le soumettre à un examen public, car j'ai un désir incessant de le "terminer" par mes propres efforts.

À propos, j'ai remarqué que tous mes soi-disant "trébuchements" se situent dans des choses si petites que je ne peux pas les voir. Prenez le spécificateur dont Artem Trishkin m'a parlé. C'est une si petite chose, et je me suis cassé la tête pour savoir pourquoi le script ne fonctionne pas. Ou le même lien &. Autant de temps perdu là-dessus. En général, il faut encore apprendre, apprendre et apprendre, et en russe - lire, lire et lire la documentation.

Cordialement, Vladimir.

 
Bonjour !


J'ai un compte de compensation.

Dans mon Expert Advisor, j'utilise le code suivant pour contrôler les transactions effectuées :

HistorySelect(0,TimeCurrent()) ;
ulong ticket = OrderGetTicket(0) ;
N_deals = HistoryDealsTotal() ;

Mais j'ai également besoin d'estimer le nombre de transactions clôturées.
Je pense que je dois utiliser le modificateur DEAL_ENTRY_OUT.
Mais je ne comprends pas comment l'utiliser.

Merci de m'aider.

Cordialement, Alexander