[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 858

 

C'est une question simple, mais je n'arrive pas à trouver quelque chose.

Il y a 4 postes ouverts à un moment donné. J'essaie de les fermer tous de la manière suivante :

for (int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_BUY)
           OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
        if(OrderType()==OP_SELL)
           OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
      }
  }

Mais ils sont fermés non pas tous, mais par un seul. En fait, ils ont les numéros suivants : 2, 4, 6, 7. Ainsi, les 2e et 6e positions sont fermées.

Quelle est l'astuce ?

 
usver:

C'est une question simple, mais je n'arrive pas à trouver quelque chose.

Il y a 4 postes ouverts à un moment donné. J'essaie de les fermer tous de la manière suivante :

Mais ils sont fermés non pas tous, mais par un seul. En fait, ils ont les numéros suivants : 2, 4, 6, 7. Ainsi, les 2e et 6e positions sont fermées.

Quel est le piège ?


Le problème est qu'après la fermeture de la position, la numérotation change dans le OrderSelect(i,SELECT_BY_POS,MODE_TRADES) et simultanément toutes les positions ne peuvent pas être fermées.

HH : J'ai été très aidé par les fts I. Kim, j'ai changé un peu - j'ai enlevé les crochets supplémentaires et les ai mis sur une seule ligne :

//+------------------------------------------------------------------+
void CloseAllFirstProfit() {
   int i, k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
   k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
//+------------------------------------------------------------------+
void ClosePosBySelect() {
   if (OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE);
}
//+------------------------------------------------------------------+

Cherchez dans le forum - vous trouverez les originaux.

 
IgorM:


est qu'après la fermeture d'une position, la numérotation change dans OrderSelect(i,SELECT_BY_POS,MODE_TRADES) et toutes ne peuvent pas être fermées simultanément.

SZY : J'ai été très aidé par fts I. Kim, j'ai changé un peu - j'ai enlevé les crochets supplémentaires et j'ai rentré une ligne :

recherchez dans le forum - vous trouverez l'original


Merci pour le conseil et l'exemple. Je me pencherai sur la question.

En chemin, je poserai une autre question.

La tâche est la suivante : je dois déterminer quel type d'ordre déclenché par un stop loss a été fermé, et comparer un ordre futur fermé par un stop loss avec un ordre précédent (c'est-à-dire comparer leurs types). Après avoir parcouru la documentation, je n'ai rien trouvé concernant le traitement du dernier événement.

A ce stade, j'ai implémenté cette opération comme une fermeture d'un ordre lorsqu'il atteint une limite fixée (Bid-OrderOpenPrice() >=TP*Point). Cela m'a permis de stocker dans une variable le type du dernier ordre clôturé et de le comparer avec celui qui vient d'être clôturé ( if(type==OrderType())) ). Tout fonctionne bien lors des tests, mais j'aimerais quand même l'implémenter en utilisant des stop loss.

J'ai essayé de sélectionner un ordre clôturé dans l'historique en utilisant OrderSelect() et l'argument MODE_HISTORY. Puisqu'il n'y a pas de conditions de clôture des ordres, une modification de la variable OrdersTotal() peut être considérée comme le déclenchement d'un stop loss. Mais je me suis heurté à un problème : je ne parviens pas à trouver le numéro du dernier ordre clôturé (puisque leur nombre change constamment), ou je n'ai tout simplement pas trouvé comment le faire.

La question est : comment la mettre en œuvre en utilisant les stop-loss ? Peut-être y a-t-il des moyens plus faciles ? Eh bien, si le sens de la pensée est correct, alors comment trouver le dernier ordre fermé ?

 
IgorM:


la numérotation est modifiée dans OrderSelect(i,SELECT_BY_POS,MODE_TRADES) après la fermeture d'une position et toutes les positions ne peuvent pas être fermées simultanément

SZS : J'ai été très aidé par les fonctions de I. Kim, je les ai un peu modifiées - j'ai enlevé les crochets supplémentaires et les ai ramenées sur une seule ligne :

recherchez dans le forum - vous trouverez l'original

Vous en avez assez dit... en une seule fois.
https://docs.mql4.com/ru/trading/OrderSelect
 
usver:

C'est une question simple, mais je n'arrive pas à trouver quelque chose.

Il y a 4 postes ouverts à un moment donné. J'essaie de les fermer tous de la manière suivante :

Mais ils sont fermés non pas tous, mais par un seul. En fait, ils ont les numéros suivants : 2, 4, 6, 7. Les 2e et 6e positions sont donc fermées.

Quel est le problème ?

Parlez-vous de numéros dans l'ordre ? Ou de billets ?

 
abolk:

Parlez-vous de numéros dans l'ordre ? Ou de billets ?


Je suis déjà confus moi-même. Ce sont des billets, mais je les ai donnés pour que la situation soit claire. Ils se ferment un par un.
 

Hourra, j'ai réussi à le faire fonctionner ! !!


Victor merci beaucoup, j'ai fait une erreur, je n'ai pas écrit le nom de l'indicateur correctement.

 
abolk:
Ce que tu viens de dire... tout en un
https://docs.mql4.com/ru/trading/OrderSelect


Essayer de modifier/supprimer des prises en charge ou des arrêts dans un groupe d'ordres - la tâche est simple, mais j'ai constaté que, lorsque la sélection des ordres était effectuée à l'aide de OrderSelect(i,SELECT_BY_POS,MODE_TRADES), la numérotation des ordres changeait directement dans le corps de la boucle et j'ai réussi à modifier plusieurs fois un ordre déjà modifié (sans prise en charge) - erreur n°1, c'est pourquoi j'ai suggéré que nous avions un problème similaire

Veuillez me conseiller sur la façon de faire recalculer l'indicateur à la clôture de plusieurs barres, par exemple : je veux que l'indicateur soit recalculé toutes les 5 nouvelles barres.

 
IgorM:


Veuillez me conseiller - comment faire pour qu'un indicateur se recalcule à la clôture de plusieurs barres, par exemple : je veux que l'indicateur soit recalculé toutes les 5 nouvelles barres.

Vous connaissez la programmation.

Il s'agit d'une tâche logique et vous ne devez pas être très intelligent pour la résoudre. Pensez avec votre tête.

Il y a différents cas. Où exactement il doit être ré-encastré, sur quel TF, comment le ré-encastrement doit se faire, etc. Comment répondre à votre question.

Notez le temps de la mesure et après cinq mesures, remettez ce temps à zéro et notez-le à nouveau. Au moment de la mise à zéro, vous pouvez mettre une condition pour recalculer. La fonction iTime(NULL,0,0) vous aidera. Le reste n'est que logique.

 
IgorM:


Veuillez me conseiller - comment faire pour qu'un indicateur se recalcule à la clôture de plusieurs barres, par exemple : je veux que l'indicateur soit recalculé toutes les 5 nouvelles barres.


La méthode n'est probablement pas la plus fiable, mais elle fonctionnera juste pour essayer l'idée (par exemple, un brouillon).

Utilisez la variable Bars et suivez son évolution. Augmenté de 5, rappelé, etc.