Guide MetaTrader
Fermetures ordres

Certaines stratégies nécessitent de fermer l’ensembles des ordres ouverts ou en attente simultanément, par exemple le vendredi soir avant la fermeture du week-end.
Le code pour réaliser cette fonction est assez simple mais contient néanmoins un point important à considérer pour que le code soit exécuté correctement.
Le point délicat est l’ordre dans lequel la fermeture des ordres est exécutée car ce point n’est pas anodin.
Si par exemple on défini une boucle sur l’ensemble des ordres de la façon suivante :for(int i=0;i<OrdersTotal();i++)
et que l’indice i est utilisé pour sélectionner les ordres par leur position alors il est possible que tous les ordres ne soient pas fermés correctement. En effet il est possible d’avoir la configuration suivante : si on ferme d’abord l’ordre en position 0, alors l’ordre en position 1 deviendra l’ordre en position 0 mais la boucle passera ensuite à la position 1 et ne fermera pas l’ordre en position 0. Ainsi il se peut que seulement la moitié des ordres soit fermée.
Pour éviter ceci il faut commencer la fermeture des ordres par la dernière position
for(int i= OrdersTotal()-1;i>=0;i--)
Fermeture des ordres
Le code pour la fermeture de tous les ordres est le suivant :for(int i= OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();
bool result = false;
switch(type)
{
//Fermeture des positions d’achat
case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
break;
// Fermeture des positions de vente
case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
break;
//Fermeture des ordres en attente
case OP_BUYLIMIT :
case OP_BUYSTOP :
case OP_SELLLIMIT :
case OP_SELLSTOP : result = OrderDelete( OrderTicket() );
}
if(result == false)
{
Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
Sleep(3000);
}
}
return(0);
}
A lire dans le Guide MetaTrader
| MetaTrader : Leçon 9 à 16 |
|---|
|



