-----------------------------------------------------------------+ //| Opening and Closeing.mq4 | //| Copyright © 2010, Ben banta | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Ben banta" //+------------------------------------------------------+ //| Closing My Way | //+------------------------------------------------------+ double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if ( OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol() // with my symbol ) { if(OrderType() == OP_SELL) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() + (ATR*2)) // ATR*2 above Sell. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Blue); Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2)) //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); }//ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2)) }//ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc }// END for loop //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); //ENDif (ticket>0) return(0); }//ENDif (Ask > High[iHighest(NU... etc //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); }//ENDif (ticket>0) else Print ("Error Opening Sell Order :" ,GetLastError()); //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) return(0); }//ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) return(0); }//ENDif (OrdersTotal() < 1) }//ENDint start()Les blocs de code devraient être plus faciles à lire
if(OrderTicket() == OrderOpenPrice() - (ATR*2))Leticket de commande est un très grand nombre entier (probablement des milliards), la clé de la commande.
OOP - 2ATR est un prix.
Les deux ne seront JAMAIS égaux
si vous vouliez dire OrderClosePrice() == OOP-2ATR les nombres réels ne seront presque jamais égaux. utilisez plutôt :
if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...
OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()Votre orderSend ne fixe pas un nombre magique.
A la vôtre
Le ticket de commande est un très grand nombre entier (probablement des milliards), la clé de la commande.
OOP - 2ATR est un prix.
Les deux ne seront JAMAIS égaux
si vous vouliez dire OrderClosePrice() == OOP-2ATR les nombres réels ne seront presque jamais égaux. utilisez plutôt :
Votre orderSend ne fixe pas un nombre magique.
Merci d'avoir regardé et donné les suggestions. Mais je dois dire que je n'ai pas compris tout de suite l'OOP -2ATR.
OOP = OrderOpenPrice. Cela m'est passé au-dessus de la tête au début. Votre explication est tout à fait correcte. J'étais bloqué par le signe ==. L'OrderClosePrice() pourrait ne jamais être égal à l'OrderOpenPrice() moins le (ATR*2). Merci de l'avoir remarqué.
Laissez-moi voir si je comprends votre suggestion. Je vais la reformuler ici. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
On dirait que cela donne (je vais utiliser des chiffres arbitraires ici) OCP = 1.4361, OOP = 1.4321, ATR = 20. Donc l'expression ressemblerait à :
si (1.4321 - 1.4361 - (20*2) <= 0), je suis désolé, mais je ne comprends pas.
Je peux peut-être utiliser les mêmes chiffres pour réarranger l'expression, afin de montrer ce que je voulais dire. Mais cela n'a pas fonctionné non plus lorsque je les ai introduits dans le programme.
Le nouvel arrangement ressemble à ceci.
si (1.4361 >= 1.4321 + (20*2)).
Lorsque l'OCP >=OOP + ATR*2, le contrôle passe à :
OrderClose (OrderTicket(), OrderLots(), etc.
Votre autre observation était que l'OrderSend ne fixe pas un nombre magique.
Pourrais-je simplement retirer cette partie du programme : && OrderMagicNumber == MagicNumber,
Merci encore, et si vous voyez d'autres améliorations, je vous en serais reconnaissant.
Merci encore. Si vous voyez d'autres améliorations, je vous en serais reconnaissant.
OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;
Merci pour votre réponse. J'espère que vous vous portez bien.
La suggestion a été insérée ce matin. Désolé de dire que le compilateur n'aime pas ce que j'ai codé. Je ne suis pas sûr de l'instruction du programme qui est incorrecte. Je pense que les suggestions sont correctes. Je vais réafficher le programme et signaler la zone qui, selon moi, pose problème. Je vais également indiquer la stratégie de fermeture.
La position de vente sera arrêtée au-dessus du prix d'ouverture de l'ordre par Atr*2. Par exemple, OOP est 1.4321, Atr =20, et OCP = 1.4361.
J'ai donc codé l'expression comme suit
if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // la condition est remplie, le contrôle passe à....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;
Note : Il n'y a pas de StopLoss(), ni de TakeProfit() dans l'instruction OrderSend, si cela a une quelconque importance.
Merci encore pour l'aide de tous.
Salutations
double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if (OrderSelect(index, SELECT_BY_TICKET) // existing orders //&& OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()) // with my symbol { if(OrderType() == OP_SELL) order = OrderTicket(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if(OrderClosePrice() >= OrderOpenPrice() + (ATR*2)) // condition to be met, // control then passes to... { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue); // OrderClose //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderClosePrice() <= OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); } } } //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); return(0); } //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Sell Order :" ,GetLastError()); return(0); } return(0); } }
Bonjour Huckleberry,
Je vais légèrement remanier votre programme.
Au revoir pour le moment
Pourquoi faire "order = OrderTicket() ;" et ne pas utiliser cette valeur dans la fonction orderclose() ?
Même s'il est peu probable que l'ordre sélectionné ait changé, ne serait-il pas plus sûr d'utiliser la valeur de l'ordre identifié positivement ?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue) ;
OrderTicket() sera le ticket actuellement sélectionné - à ce stade de mon apprentissage
Je ne peux pas dire quel ticket de commande est sélectionné lorsque vous effectuez la commande OrderClose().
//// Modifier
En fait, je ne suis pas sûr que "order= OrderTicket()" soit le ticket que vous avez identifié dans la déclaration If précédente.
Pourquoi faire "order = OrderTicket() ;" et ne pas utiliser cette valeur dans la fonction orderclose() ?
Même s'il est peu probable que l'ordre sélectionné ait changé, ne serait-il pas plus sûr d'utiliser la valeur de l'ordre identifié positivement ?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue) ;
OrderTicket() sera le ticket actuellement sélectionné - à ce stade de mon apprentissage
Je ne peux pas dire quel ticket de commande est sélectionné lorsque vous effectuez la commande OrderClose().
//// Modifier
En fait, je ne suis pas sûr que "order= OrderTicket()" soit le ticket que vous avez identifié dans la déclaration If précédente.
Merci pour votre observation et votre suggestion. Votre temps est précieux.
Votre raisonnement est parfaitement logique. Je ne suis pas plus sûr que vous en ce qui concerne l'ordre de sélection. Je vais faire un essai avec votre suggestion.
Merci encore
Au revoir
![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Bonjour à tous
J'espère que la syntaxe est meilleure qu'avant. Depuis une semaine, je lis le Codersguru.
Le programme ci-dessous, bien que n'ayant pas d'erreurs, le compilateur n'enregistre qu'une seule commande. Mais mon code ne la fermera pas.
Le programme dit --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), je n'ai pas inséré le stoploss ni le stoploss dans l'ordre.
pas inséré le stoploss ou le takeprofit, comme vous pouvez le voir. Raison pour laquelle, il y a une condition StopLoss déjà codée comme telle ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Blue)
Il n'est donc pas nécessaire d'insérer un autre StopLoss, non ? En ce qui concerne le TakeProfit
Je le coderai lorsque cet autre problème sera résolu.
Est-ce la façon dont j'ai codé la condition de clôture, ou y a-t-il encore des problèmes de syntaxe ?
Merci à tous pour votre aide, et puisse mon problème en aider d'autres,
Cheers