Auto-apprentissage du langage MQL5 à partir de zéro - page 66

 
Valeriy Yastremskiy:

L'opérateur de boucle et les opérateurs dans le corps de la boucle. Pas vraiment du russe classique.

Tout est bon, bien sûr, mais où se trouve l'itérateur i dans le corps de la boucle ? Et pour obtenir le symbole de position et son numéro magique, il faut d'abord le sélectionner. La description du poste est une structure (dans mcl5 toute la structure et les ordres et le temps et les affaires) et elle est remplie à travers la sélection, par l'itérateur qui n'est pas un ticket de poste, mais un numéro de poste. et nous devons nous rappeler que dans la structure de la description du poste, c'est toujours la dernière sélection de poste.

Bonjour Valery ! Merci pour cette précision.

C'est là que réside toute ma confusion, car tout fonctionnait sans l'opérateur de boucle for, alors qu'il ne fonctionnait pas avec pour une raison quelconque. Ai-je bien compris que je dois d'abord faire toutes les demandes nécessaires par le biais d'une requête?

Salutations, Vladimir.

 
MrBrooklin:

Bonjour Valery ! Merci pour cette précision.

C'est là que réside toute ma confusion, car tout fonctionnait sans l'opérateur for loop, mais avec lui, pour une raison quelconque, ce n'était pas le cas. Ai-je bien compris que je devais d'abord effectuer toutes les recherches nécessaires via la demande?

Salutations, Vladimir.

Non, je ne sais pas vraiment MKL5 . Il s'agit d'une demande d'exécution. Et vous devez sélectionner une position par son numéro, afin de pouvoir continuer à travailler avec elle.

PositionSelect

Je pense que oui.

 
MrBrooklin:

Bonne journée et bonne humeur à tous !

Chers professionnels ! Veuillez me conseiller, mais pas en paroles, sinon je n'apprendrai jamais le langage de programmation MQL5.

Salutations, Vladimir.

Bonjour ! Le problème est que vous avez appliqué la boucle des positions ouvertes, et vous ne l'avez pas définie en termes de "if", c'est-à-dire ce que la boucle for cherche exactement, et vous ne l'avez pas encore complétée, elle doit retourner quelque chose...

Les positions ouvertes sont comptées en permanence, il est donc préférable de créer un bloc avec une boucle, et lorsque vous l'ouvrez, vous pouvez l'appeler, par exemple, de cette façon ;

input int MaxOpenedPositions=1;
.
.
.
int Total=TotalPositions(-1);
if(Total<MaxOpenedPositions && другие условия для открытия) OpenBUY();//например
if(Total<MaxOpenedPositions && другие условия для открытия) OpenSELL();//например

//+------------------------------------------------------------------+
//| Total Positions                                                  |
//+------------------------------------------------------------------+
int TotalPositions(int Type)
   {
int cnt=0;
if(PositionsTotal()>0)
for(int i=PositionsTotal()-1;i>=0;i--)
   
if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==MagicNumber) 
   {
   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) {cnt++;continue;}
   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) {cnt++;}
   }
   return(cnt);
   }
 
Valeriy Yastremskiy:

non, je ne connais pas vraiment MKL5 . Il s'agit d'une demande d'exécution. Et vous devez sélectionner une position par numéro, afin de pouvoir continuer à travailler avec elle.

PositionSelect

Je pense que oui.

J'ai tout essayé, y compris PositionSelect. Aucun d'entre eux n'a aidé.

Salutations, Vladimir.

 
VVT:

Bonjour ! avec des mots ; le point est que lorsque vous avez appliqué la boucle des positions ouvertes, vous ne l'avez pas spécifié dans les conditions "if", c'est-à-dire ce que la boucle for essaie exactement, aussi vous ne l'avez pas terminé d'une manière quelconque, il devrait retourner quelque chose...

Les positions ouvertes sont calculées en permanence, il est donc préférable de créer un bloc avec une boucle et de l'appeler lors de l'ouverture, par exemple ;

Bonjour !

Merci pour le conseil. Je vais essayer d'analyser et d'appliquer votre méthode d'énumération des postes ouverts.

Salutations, Vladimir.

 
VVT:

Bonjour ! En quelques mots ; le fait est que lorsque vous avez appliqué la boucle pour rechercher des postes ouverts, vous ne l'avez pas spécifié dans le "if", c'est-à-dire ce que la boucle for recherche exactement, et vous ne l'avez pas terminé d'une quelconque manière, elle devrait retourner quelque chose...

D'ailleurs, la référence MQL5 ne dit rien sur le fait que la boucle doit retourner quelque chose à la fin. Peut-être que j'ai mal compris quelque chose ? Ou peut-être fait-il référence à l'instruction if?

Meilleures salutations, Vladimir.

 
MrBrooklin:

J'ai tout essayé, y compris PositionSelect. Rien n'a aidé.

Salutations, Vladimir.

Seulement compris, oui, la sélection de la position dans le filet par outil, pas par numéro. Oh, ils se sont trompés).

C'est possible grâce à

  • PositionGetTicket retourne le ticket de position par numéro de position (et nous avons un numéro) et après avoir reçu le ticket de position nous pouvons obtenir son symbole et sa magie.
Ou, s'il s'agit d'une compensation, nous pouvons y réfléchir et décider pourquoi nous avons besoin du nombre total d'ordres ou de positions, si nous ne pouvons avoir qu'une seule position sur un instrument et que nous devons le savoir. C'est pourquoi nous n'avons peut-être pas besoin d'un cycle. Sur notre instrument, nous faisons Si la PositionSelect retourne False, elle ouvre une position et si True, elle sélectionne une position sur cet instrument et nous pouvons travailler avec elle et la modifier pour le chalutage.
 
Valeriy Yastremskiy:

Je viens de réaliser, oui, la sélection des positions dans la compensation par instrument, et non par numéro. Oh, ils sont détraqués.)

C'est possible grâce à

  • PositionGetTicket retourne un ticket de position par numéro de position (et nous avons un numéro) et en obtenant le ticket de position nous pouvons obtenir son symbole et sa magie.
Ou, s'il s'agit d'une compensation, nous pouvons y réfléchir et décider pourquoi nous avons besoin du nombre total d'ordres ou de positions, si nous ne pouvons avoir qu'une seule position sur un instrument et que nous devons le savoir. C'est pourquoi nous n'avons peut-être pas besoin d'un cycle. Sur notre symbole, nous faisons Si la PositionSelect retourne False, elle ouvre une position et si True, elle sélectionne une position sur ce symbole et nous pouvons travailler avec elle et la modifier pour le chalutage.

Le code a donc été écrit à l'origine sans l'opérateur de boucle, même si j'étais curieux de l'essayer plus tard.

Salutations, Vladimir.

 
MrBrooklin:

D'ailleurs, il n'y a rien dans la référence MQL5 sur le fait que la boucle doit retourner quelque chose à la fin. Peut-être que je me suis encore trompé ?

Sincèrement, Vladimir.

La formulation n'est pas tout à fait correcte. En fonction de l'itérateur, certaines actions doivent être effectuées dans le corps de la boucle. En fonction de l'itérateur. Et c'est le résultat de l'exécution de ces actions dans le corps de la boucle qui doit être renvoyé. Si la boucle a été passée et qu'il n'y avait pas d'opérateurs de rupture ou de contingence, cela signifie que nous irons à l'expression 3 puis à l'expression 2 et si elle est vraie, nous la renverrons avec le nouvel itérateur au corps de la boucle.

 
MrBrooklin:

À l'origine, le code a donc été écrit sans l'opérateur de boucle, bien que j'aie ensuite voulu essayer de l'appliquer.

Respectueusement, Vladimir.

Vous pouvez demander

  • PositionGetTicket retourne un ticket de position par numéro de position (et nous avons un numéro) et ayant reçu le ticket de position nous pouvons obtenir son symbole et sa magie.

Passez en revue tous les billets par numéro. Et grâce aux billets, découvrez les symboles de la position et comparez-les aux nôtres. Obtenez la position magik et comparez avec la nôtre.

if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetString(POSITION_SYMBOL)==_Symbol && 
PositionGetInteger(POSITION_MAGIC)==MagicNumber) // вот эта строчка

Mais seulement pourquoi.