Fermeture des demi-lots. - page 8

 
DomGilberto:

Cela s'imprime dans le journal pendant ma boucle for, où, dans le cas d'un ordre d'achat stop en attente, si la 60 EMA est > à la perte de l'ordre stop, il fermera l'ordre en attente, en ouvrira un nouveau avec un nouveau SL (qui est derrière la 60EMA), ajustera le take profit pour recevoir la récompense 1:2, et changera les lots relatifs à l'arrêt en points et mon profil de risque (disons 2%).

Donc, lorsque tout cela est fait, la variable personnalisée "Current Lots" qui est "LotSize" dans OrderSend fonctionne, mais elle envoie une taille de lot qui n'est pas correcte pour que le serveur reçoive "0.18215" ? Cela pourrait-il être un problème, bien que les ordres soient envoyés de toute façon - cette question est davantage liée à "cela pourrait-il être la raison pour laquelle je ne peux pas appeler "OrderType==OP_BUY" ?

Vous devriez corriger cela, valider la taille du lot de la même manière que vous l'avez déjà fait... vous pourriez même coder une fonction séparée pour le faire sur la base du code que vous avez déjà... par exemple :

double ValidateLots(double PositionSize)
   {
   double LotStep, MinLot;

   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   MinLot  = MarketInfo(Symbol(), MODE_MINLOT);
   
   return( MathFloor(PositionSize / LotStep) * LotStep);
   }


Au lieu d'utiliser LotSize dans votre OrderSend(), vous utiliseriez ValidateLots(LotSize)

Je doute que cela soit à l'origine de votre problème, cependant...

 
Hmm - oui, je viens de jouer avec. Il semble que la commande soit simplement envoyée car le serveur ne permet que 0,00 (2 décimales) de toute façon. Donc les chiffres restants sont presque sans importance.

Argh ! C'est tellement frustrant lol - je suis bloqué sur ce problème depuis trop longtemps maintenant :(

Je ne vois pas pourquoi c'est un problème et je ne peux pas sélectionner un "OP_BUY"... Je sais que j'ai probablement épuisé ce sujet, mais tout dernier coup de couteau dans le noir serait vraiment apprécié - merci de m'aider également !
if (direction==0){ <<<//--Buy--// This gets called upon if all the set-up is apparent.
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10; //--// (in process of changing at the moment)
      
      if(OpenOrdersThisPair(Symbol())==0)  //--//<--- No order open = then open one...
      {
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
      
         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
         {
         
               for(int b=OrdersTotal()-1; b >=0; b--) 
                  {
    
                     if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
                     {
                     Print(" Stop loss value for the order is ", OrderStopLoss());
                     }
    
                     else if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==false)
                     {
                     Print(" OrderSelect failed error code is ",GetLastError());
                     }
                     if(OrderMagicNumber()==MagicNumber)
                        if(OrderSymbol()==Symbol())
                           if(OrderType()==OP_BUYSTOP)
                              if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)
                                //if(OpenOrdersThisPair(Symbol())==1)
                                 { 
                                 DeleteOrder = OrderDelete(OrderTicket());
                                 if(DeleteOrder!=TRUE)Print("Buy Delete Order Last Error = ", GetLastError());
                                 }
                                  
                                 if(OpenOrdersThisPair(Symbol())==0)//<<-- If there are no open orders = place a new order.
                                  { 
                                  int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
                                  if(NewBuyOrder == -1)Print("New Buy Order Last Error = ", GetLastError());
                                  if(NewBuyOrder > 0)Print("NEW BUY ORDER:- Lots to open: ", DoubleToStr(LotSize, Digits), " Entry Price: ", DoubleToStr(buyPrice, Digits), 
                                  " Buy Stop Loss: ", DoubleToStr(bsl, Digits), " Buy Take Profit: ", DoubleToStr(btp, Digits), " Magic Number is: ", DoubleToStr(MagicNumber, Digits));  
                                  } 
                  }
             } 
       }
 
DomGilberto:
Hmm - oui, je viens de jouer avec. Il semble que la commande soit simplement envoyée car le serveur ne permet que 0,00 (2 décimales) de toute façon. Donc les chiffres restants sont presque sans importance.

Argh ! C'est tellement frustrant lol - je suis coincé sur ce problème depuis trop longtemps maintenant :(

Je ne vois pas pourquoi c'est un problème et je ne peux pas sélectionner un "OP_BUY"... Je sais que j'ai probablement épuisé ce sujet, mais tout dernier coup de couteau dans le noir serait vraiment apprécié - merci de m'aider également !

Je pense que vous devez montrer tout votre code . . .

Je vois quelques problèmes ici :

      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
       //  where are you checking the return value from the OrderSend() and reporting errors ?

         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)    //  where is the OrderSelect() ?
 
Tout le code ne rentre pas ici ? Je l'ai mis sur pastebin cependant ?

-http://pastebin.com/eaY1wKbN

Désolé pour la syntaxe - un peu plus difficile de tout voir, mais ils n'ont pas MQL4 ? Alors mettez-le sous C++
 
DomGilberto:
Tout le code ne rentre pas ici ? Je l'ai mis sur pastebin cependant ?

-http://pastebin.com/eaY1wKbN

Désolé pour la syntaxe - un peu plus difficile de tout voir, mais ils n'ont pas MQL4 ? Alors mettez-le sous C++

Pas de problème...

Quand vous faites ça...

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+

   if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1 && OrderType()==OP_BUY)
     {

... quel ordre est déjà sélectionné ? l'ordre en attente ? votre OrderSelect() échouera si votre OrderTicket() échoue à moins que vous n'ayez déjà un ordre sélectionné. Avez-vous vraiment besoin de ce code ? Plus tard, vous avez une boucle où vous sélectionnez les ordres et vérifiez leur symbole, leur numéro magique et leur type...

Cela doit être corrigé aussi....

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())

               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

         if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
           {
            Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
            bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
            if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
           }

. . . ajouter des accolades . . .

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

               if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
                 {
                 Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
                 bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
                 if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
                 }
              }
 

Ok - J'ai ajouté plus d'impressions pour avoir un peu plus de clarté sur ce qui est fait et à quel moment. Je l'ai collé ci-dessous.

La ligne où il est écrit "Order Select for closing:-..." est ce qui est sélectionné au point "Close OP_BUY Half Lots @ 1:1 Function" que vous avez demandé ci-dessus. Il semble que le numéro de ticket soit différent à ce point de sélection ? J'avais supprimé la partie "...&& OrderType()==OP_BUY", car il semble que le reste soit imprimé lorsque cette partie n'est pas dans l'instruction "if"... Est-ce que ceci donne un peu plus de clarté ?

"First Buy Order Placed:-" est la première fonction OrderSend qui passe au début.
"Checking Buy Order:-" est celle qui, dans la boucle for, supprime et rouvre l'ordre en attente si la MA est > à l'OrderStopLoss().
"NEW BUY ORDER:-" est le nouvel ordre placé dans cette boucle for.
"Order Select for closing:-..." - comme déjà mentionné ci-dessus, c'est la partie qui est sélectionnée pour fermer la moitié des lots.

Désolé si c'était confus, car je viens juste d'ajouter ces parties - vous ne verrez pas cela dans le lien pastebin ci-dessus... juste de simples fonctions d'impression :)

2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.37931
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.18
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Ticker Number = 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: open #9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: delete #8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 7
 
DomGilberto:

Ok - J'ai ajouté plus d'impressions pour avoir un peu plus de clarté sur ce qui est fait et à quel moment. Je l'ai collé ci-dessous.

La ligne où il est écrit "Order Select for closing:-..." est ce qui est sélectionné au point "Close OP_BUY Half Lots @ 1:1 Function" que vous avez demandé ci-dessus. Il semble que le numéro de ticket soit différent à ce point de sélection ? J'avais supprimé la partie "...&& OrderType()==OP_BUY", car il semble que le reste soit imprimé lorsque cette partie n'est pas dans l'instruction "if"... Est-ce que ceci donne un peu plus de clarté ?

"First Buy Order Placed:-" est la première fonction OrderSend qui passe au début.
"Checking Buy Order:-" est celle qui, dans la boucle for, supprime et rouvre l'ordre en attente si la MA est > à l'OrderStopLoss().
"NEW BUY ORDER:-" est le nouvel ordre placé dans cette boucle for.
"Order Select for closing:-..." - comme déjà mentionné ci-dessus, c'est la partie qui est sélectionnée pour fermer la moitié des lots.

Désolé si c'était confus, car je viens juste d'ajouter ces parties - vous ne verrez pas cela dans le lien pastebin ci-dessus... juste de simples fonctions d'impression :)


Essayez le fichier joint... c'est ma meilleure idée de ce que vous essayez de faire....
Dossiers :
dom.mq4  24 kb
 

Ah génial - merci. C'est un grand pas dans la bonne direction. Je pense que parce que c'est dans une boucle for, il veut fermer la moitié et la moitié et la moitié @ le prix ... Au lieu de le faire une seule fois ? Non seulement cela, mais il semble qu'il ne ferme pas la moitié dès que le prix >= au prix de sortie que je veux, au lieu de cela il va au-delà, et puis quand le prix oscille de nouveau plus bas dans le prix de sortie que je veux, il ferme alors - étrange... J'apprécie votre patience pour m'aider ! Très reconnaissant pour votre temps !


UPDATE : Aussi, je viens de comprendre que si je change les propriétés de l'expert (extern int) avant d'exécuter le testeur de stratégie, alors la moitié de fermeture ne fonctionne pas du tout - les choses qui affectent la moitié de fermeture sont "MA_PadAmount" c'est le nombre de points que je veux ajouter comme un tampon au stop loss qui suit en pips, et "OrderPrice_PadAmount" qui me permet de spécifier combien de pips je peux mettre comme un tampon sur le prix d'entrée des ordres...

 
DomGilberto:
Ah génial - merci. C'est un grand pas dans la bonne direction. Je pense que parce que c'est dans une boucle for, il veut fermer la moitié et la moitié et la moitié @ le prix ... Au lieu de le faire une seule fois ? Non seulement cela, mais il semble qu'il ne ferme pas la moitié dès que le prix >= au prix de sortie que je veux, au lieu de cela il va au-delà, et puis quand le prix oscille de nouveau plus bas dans le prix de sortie que je veux, il ferme alors - étrange... J'apprécie votre patience pour m'aider ! Très reconnaissant pour votre temps !
Ce n'est pas la boucle for, c'est juste qu'elle n'a aucun moyen de savoir que la moitié a déjà été fermée... comment avez-vous prévu de gérer cela ?
 
Oui, je viens juste de m'en rendre compte lorsque j'ai supprimé la boucle for. Ai-je raison de dire que si je suis le numéro de l'OrderTicket à partir du moment où il est sélectionné pour la première fois, une fois que l'OrderClose a fait son travail et qu'il renvoie vrai, alors je pourrais le vérifier avec le numéro de l'OrderTicket car ils seront différents - ce qui rompt la boucle et attend jusqu'à ce qu'une autre nouvelle commande arrive ?

Je ne suis pas tout à fait sûr de la façon d'écrire cela, mais est-ce que cela va dans le bon sens ?