Fermeture des demi-lots. - page 18

 


Ok (MISE A JOUR !) donc en gros, je me suis débarrassé de la fermeture continue de "la moitié d'une moitié d'une moitié etc." sur les lots lorsque le deuxième OrderClose() est appelé (où se trouve l'instruction if toute bleue - apparemment cela fonctionne bien !) - MAIS, je ne veux PAS du tout que cette fonction soit appelée à moins que la PREMIÈRE fonction OrderClose() soit "True" et qu'elle ait réussi. "Close_Half_Order_Buy==True" ne fonctionne pas non plus...

J'aimerais que quelqu'un m'aide à terminer ce travail :)

( J'ai supprimé beaucoup de "Prints", par souci de clarté sur la chair du code).

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   static datetime partclosedonce;
   static datetime partclosedtwice; 
   
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);

   double lotStep=MarketInfo(Symbol(),MODE_LOTSTEP);

   double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
   
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);

   
for(int c=OrdersTotal()-1; c>=0; c--)
      {
      if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)==true)

      double FirstTarget_Buy = OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/2);
      	Print("FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
      
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderLots()>minLot)
               if(OrderOpenTime() != partclosedonce)
            {
            
            if(OrderType()==OP_BUY && Bid >= FirstTarget_Buy+(Point/2)) 
               {
               bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,5,Blue);
               if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
               }
            }
         
      if(Close_Half_Order_Buy==True && OrderOpenPrice() > OrderStopLoss())
         {
         MoveToBreakEven(); 
         }
          if(Close_Half_Order_Buy==True)
               {
               partclosedonce = OrderOpenTime();
               } 
      
      if(partclosedonce != partclosedtwice && OrderOpenTime() != partclosedtwice) // I dont want this to run UNLESS the first OrderClose() is successful.
         {
          if(OrderType()==OP_BUY && EMA_Bar < EMA_MA)
               {
               bool EMA_Buy_Close=OrderClose(OrderTicket(),half,Bid,5,CLR_NONE);
               if(EMA_Buy_Close!=TRUE)Print("EMA_Buy_Close Last Error = ",GetLastError());
               if(EMA_Buy_Close==True)partclosedtwice = OrderOpenTime();
               }     
          }        
     }
}


	          
 
Quelqu'un ?
 
DomGilberto:


Ok (MISE À JOUR !) donc en gros, je me suis débarrassé de la fermeture continue de "la moitié de la moitié de la moitié etc." sur les lots lorsque le deuxième OrderClose() est appelé (où se trouve l'instruction if toute bleue - apparemment cela fonctionne bien !) - MAIS, je ne veux PAS du tout que cette fonction soit appelée à moins que la PREMIÈRE fonction OrderClose() soit "True" et qu'elle ait réussi. "Close_Half_Order_Buy==True" ne fonctionne pas non plus...

J'aimerais que quelqu'un m'aide à résoudre ce problème :)

Le code suivant se compile (en déclarant la variable MagicNumber et en commentant la fonction MoveToBreakEven()) mais il est n'était pas testé.

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder() {
   static bool FirstBuyTarget_hit = false, SecondBuyTarget_hit = false;
   int ct = 0;
   double minLot = MarketInfo(Symbol(),MODE_MINLOT);
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);
        
   for(int c = OrdersTotal() - 1; c >= 0; c--)
      if (OrderSelect(c,SELECT_BY_POS))
         if (OrderSymbol() == Symbol() && OrderType() <= OP_SELL)
            if (OrderMagicNumber() == MagicNumber) {
               double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
               double FirstTarget_Buy = OrderOpenPrice() + ((OrderTakeProfit() - OrderOpenPrice()) / 2);
               Print ("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy,Digits));
                                        
               ct++;
                                        
               if (!FirstBuyTarget_hit)
                  if (OrderType() == OP_BUY && Bid >= FirstTarget_Buy + (Point/2)) {
                     if (OrderClose(OrderTicket(),half,Bid,5,Blue)) {
                        MoveToBreakEven();
                        FirstBuyTarget_hit = true;
                        break;
                     }
                     else
                        Print("Close_Half_Order_Buy Last Error = ", GetLastError());
                  }
                                        
               if (FirstBuyTarget_hit && !SecondBuyTarget_hit) 
                  if (OrderType() == OP_BUY && EMA_Bar < EMA_MA) {
                     if (OrderClose(OrderTicket(),half,Bid,5,CLR_NONE))
                        SecondBuyTarget_hit = true;
                     else
                        Print("EMA_Buy_Close Last Error = ",GetLastError());                    
                  }

               break;
            }
   if (ct == 0) {
      FirstBuyTarget_hit = false;
      SecondBuyTarget_hit = false;
   }
}

Le code ci-dessus suppose qu'un seul ordre est placé par paire de devises.

 

Merci beaucoup pour votre aide ! Je l'apprécie vraiment :)

Pourriez-vous m'aider avec une dernière chose ; en ce moment j'ai un objectif de prise de profit FIXE 1:2 (hard TP). Je veux en fait le supprimer de l'ordre. Cependant, comme vous pouvez le voir ci-dessus, les fonctions OrderClose() concernées utilisent l'OrderTakeProfit() pour calculer où les fonctions OrderClose() doivent fermer.

Ma question est la suivante : existe-t-il un moyen de stocker le prix de la fonction OrderTakeProfit(), mais au lieu de le fixer dans l'ordre, je veux clôturer un nombre déterminé de lots en utilisant la fonction OrderClose() au prix de la fonction OrderTakeProfit() ? La raison en est que parfois, j'ai une transaction qui génère d'énormes gains, mais comme j'ai fixé le prix OrderTakeProfit() dans l'ordre d'ouverture, tous les lots seront clôturés à ce prix et je veux seulement clôturer partiellement certains lots à ce prix de sortie. J'utilise un stop suiveur pour les gros coureurs... J'espère que cela a un sens ?

Voilà, c'est fait ! J'ai terminé et j'ai fait le tour ! Enfin !

UPDATE : Le code ci-dessus est une belle façon de l'écrire. J'ai joué un peu, mais la fermeture n'est pas tout à fait dans le bon ordre. Il ferme toujours la moitié de ce qui vient en premier. C'est un peu la même chose que ce que j'avais avant d'utiliser static datetime ? Des idées ?

 
(j'ai l'impression d'avoir épuisé ce fil de discussion)

J'ai littéralement les 2 dernières questions ci-dessus et c'est fait ? Tout ce que j'ai besoin de savoir est comment puis-je stocker le prix de l'OrderTakeProfit(), de sorte que lorsque je le modifie, je puisse toujours utiliser ce prix exact pour faire un OrderClose() ? Est-ce qu'un Double statique fonctionnera ?
 
DomGilberto:

MISE À JOUR : Le code ci-dessus est une bonne façon de l'écrire. J'ai joué un peu, mais la fermeture n'est pas tout à fait dans le bon ordre. Il ferme toujours la moitié de ce qui vient en premier. C'est un peu la même chose que ce que j'avais avant d'utiliser static datetime ? Avez-vous des idées ?

Publiez toutes les modifications que vous avez apportées au code ci-dessus et publiez les entrées de journal (ou les captures d'écran).

 
DomGilberto:

Merci beaucoup pour votre aide ! Je l'apprécie vraiment :)

Pourriez-vous m'aider avec une dernière chose ; en ce moment j'ai un objectif de prise de profit FIXE 1:2 (hard TP). Je veux en fait le supprimer de l'ordre. Cependant, comme vous pouvez le voir ci-dessus, les fonctions OrderClose() concernées utilisent l'OrderTakeProfit() pour calculer où les fonctions OrderClose() doivent fermer.

Ma question est la suivante : existe-t-il un moyen de stocker le prix de la fonction OrderTakeProfit(), mais au lieu de le fixer dans l'ordre, je veux clôturer un nombre déterminé de lots en utilisant la fonction OrderClose() au prix de la fonction OrderTakeProfit() ? La raison en est que parfois, j'ai une transaction qui génère d'énormes gains, mais comme j'ai fixé le prix OrderTakeProfit() dans l'ordre d'ouverture, tous les lots seront clôturés à ce prix et je veux seulement clôturer partiellement certains lots à ce prix de sortie. J'utilise un stop suiveur pour les gros coureurs... J'espère que cela a un sens ?

Voilà, c'est fait ! J'ai terminé et j'ai fait le tour ! Enfin !

UPDATE : Le code ci-dessus est une belle façon de l'écrire. J'ai joué un peu, mais la fermeture n'est pas tout à fait dans le bon ordre. Il ferme toujours la moitié de ce qui vient en premier. C'est un peu la même chose que ce que j'avais avant d'utiliser static datetime ? Des idées ?


Définissez votre takeprofit à un niveau énorme et vous pouvez toujours utiliser vos fonctions OrderClose() pertinentes qui utilisent l'OrderTakeProfit() pour calculer où les fonctions OrderClose() doivent fermer. Ne modifiez que le calculoù les fonctions OrderClose() doivent fermer.
 
deVries - j'ai littéralement compris ça ce matin... J'ai commencé à mettre une autre modification... puis j'ai réalisé que je devrais juste la changer dès la première commande...

Thirteen - Je n'ai fait aucun changement à ce sujet. Il fonctionne un peu de la même manière que le code que j'ai posté, mais vous utilisez un bool statique au lieu d'un datetime statique ? C'est la seule vraie différence que j'ai pu voir lorsque j'ai effectué le back-test ? À part cela, la deuxième fonction OrderClose() avec la moyenne mobile et la clôture en dessous de celle-ci, se ferme toujours si elle arrive avant l'autre orderclose() ?
 
DomGilberto:

Treize - Je ne l'ai pas du tout modifié. Il fonctionne en quelque sorte de la même manière que le code que j'ai posté, mais vous utilisez un bool statique au lieu d'un datetime statique ? C'est la seule vraie différence que j'ai pu voir lorsque j'ai effectué le back-test ? À part cela, la deuxième fonction OrderClose() avec la moyenne mobile et la clôture en dessous de celle-ci, se ferme toujours si elle arrive avant l'autre orderclose() ?
Avec votre utilisation du point d'interrogation, je ne sais pas si vous me demandez ou si vous me dites la partie surlignée. Si le testeur montre que la deuxième clôture partielle a eu lieu avant la première, veuillez afficher les résultats de vos transactions à partir du journal généré par le testeur de stratégie montrant que la deuxième clôture partielle (la moyenne mobile) a eu lieu avant la première clôture partielle.
 
Thirteen:
Avec votre utilisation du point d'interrogation, je ne sais pas si vous me demandez ou si vous me dites la partie surlignée. Si le testeur montre que la deuxième clôture partielle s'est produite avant la première, veuillez afficher les résultats de vos transactions à partir du journal généré par le testeur de stratégie montrant que la deuxième clôture partielle (la moyenne mobile) s'est produite avant la première clôture partielle.

Merci de m'avoir répondu Treize - Je publierai le journal dans la journée :)