L'EA s'entrechoque lorsqu'on utilise plusieurs paires... - page 2

 
DomGilberto:
Désolé - C'est ma faute pour ne pas l'avoir expliqué correctement. Je regarde en D1, 4Hr et finalement 1Hr pour les MA's à écarter (parmi un tas d'autres filtres) - Une fois qu'ils sont tous alignés, sur le H1, il va attendre jusqu'à ce qu'une barre tire en arrière vers la 21 EMA UNE FOIS, et puis à partir de là, il va placer un ordre au-dessus des sommets et un arrêt sous la 60 EMA - ATR.

Le repli sur la 21 EMA ne se produit qu'une seule fois. À partir de là, il cessera de chercher des replis vers la MME 21. Ce qu'il devrait faire cependant, c'est s'assurer que l'ordre PENDING ouvert est précisément à jour avec les lots, les stops et les prises de bénéfices APRÈS la clôture de chaque heure. Cependant, je n'arrive pas à comprendre pourquoi parfois il fonctionne parfaitement, et met à jour l'ordre en attente après chaque clôture H1, et d'autres fois il ne le fait pas ? La raison pour laquelle l'ordre en attente se met à jour est que ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) ".

Si cela n'est pas vrai, alors il ne le fera pas - CEPENDANT, il y a d'innombrables fois où cela est vrai, pourtant il ne supprimera pas l'ordre et en placera un nouveau avec les nouvelles valeurs ?

Je ne suis pas sûr que vous puissiez voir quelque chose dans ce code ci-dessus par rapport à la vidéo ? (Premier code que vous avez corrigé). J'espère que c'est plus clair ?

Je pense que vous allez devoir le faire de la manière la plus difficile et la plus laborieuse qui soit... imprimez les variables pertinentes, déplacez-vous dans le temps dans le testeur de stratégie, tic-tac par tic-tac si nécessaire, en vérifiant ce que sont les variables... puis si vous trouvez qu'elles devraient faire quelque chose et qu'elles ne l'ont pas fait, vous pouvez vous concentrer sur ce code.

Il est relativement facile de repérer de simples problèmes de syntaxe dans le code de quelqu'un d'autre, il est plus difficile et beaucoup plus long de repérer des erreurs dans le codage de leur stratégie, pour une chose, pour être en mesure de le faire la stratégie doit être comprise aussi bien, sinon mieux, que la personne qui fait le codage.

 
Oui, tu as raison ! Je vais faire exactement ça maintenant :) merci Raptor !
 
Il y a une chose que je dois éclaircir dans ma tête : ce code ici, sur la boucle, comment puis-je m'assurer qu'il exécute la fonction OrderDelete() et que la boucle se déroule à chaque clôture H1 ? Est-ce parce que j'ai ceci au "int start" qui indique si la boucle est effectuée ou non sur une base H1 ? (Le "IsNewCandle()") ?

int start()
 {
   if(IsNewCandle())
      {
      CheckForMaTrade();//signals, deletions and candle trails only need checked on a new candle.
      }

   if(OpenOrdersThisPair(Symbol())>0)
      {
      if(UseMoveToBreakEven)MoveToBreakEven();//Move to b/e, normal trail and MA_trail need to trail on each tick
      if(Use_MA_Trail)MA_Trail();
      }
   
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{  
            
      if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_SELL)
         {
         CloseHalfOrder1(); 
         }
   
      if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
         {
         CloseHalfOrder(); 
         }   
     }
}
 for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue;
           
         if( OrderType() == OP_BUYSTOP &&
            OrderMagicNumber() == MagicNumber &&
            OrderSymbol() == Symbol() )        
            {
            if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR)  
               {
               Stored_BuyPrice = OrderOpenPrice();   
               DeleteOrder = OrderDelete(OrderTicket()); 
               }

            if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder)  // If there are no open orders = place a new order. 
               {
               int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green);
               if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError());
               }
            }
         }
bool IsNewCandle()
   {
   static datetime  Bar1Time;
   if(Bar1Time == Time[1]) //"Time" used to be "Bars" with no brackets 
      return(false);
      
   Bar1Time = Time[1]; //"Time" used to be "Bars" with no brackets 
   return(true);
   }
 
DomGilberto:
Une chose que j'ai besoin de clarifier dans ma tête, c'est que ce code ici, sur la boucle, comment puis-je m'assurer qu'il exécute la fonction OrderDelete() et que la boucle tourne à chaque clôture H1 ? Est-ce parce que j'ai ceci au "int start" qui indique si la boucle est effectuée ou non sur une base H1 ? (Le "IsNewCandle()") ?


CheckForMATrade() est appelé une fois par nouvelle barre, si vous travaillez sur un graphique H1, ce sera une fois au début de la nouvelle barre H1... le reste est exécuté à chaque tick.

Est-ce que vous calculez la valeur ATR correcte, pour le début de la nouvelle barre ? en gardant à l'esprit que vous venez de commencer la barre 0, voulez-vous vraiment obtenir la MA basée sur la barre 0 ? les indicateurs ne sont pas mon truc donc ne supposez pas que je dis que vous avez tort, je demande juste .

 
Oui, je viens de faire une impression pour vérifier les calculs de MA-ATR. Il est correct. Je le fais sur la barre 1 (la barre H1 la plus récemment fermée). Les calculs sont corrects, mais je ne pense pas qu'ils soient systématiquement effectués à CHAQUE clôture de barre H1...
 
DomGilberto:
Oui, je viens de faire une impression pour vérifier le calcul de la MA-ATR. Il est correct. Je le fais sur la barre 1 (la barre H1 la plus récemment fermée). Les calculs sont corrects, mais je ne pense pas qu'ils soient systématiquement effectués à CHAQUE clôture de barre H1...

La MA n'est pas sur la mesure 1, mais...

iMA(NULL, 60, MA_Period, 0, 1, 0, 0   ) - ATR)  
 
Bon point - merci :) Je pense savoir pourquoi l'ordre n'est pas supprimé... SI l'OrderStopLoss n'est PAS > à la MA-ATR, alors il ne fera rien... C'est donc logique... C'est juste que parfois je le regarde, et c'est comme s'il ne voulait pas supprimer l'ordre et en placer un nouveau alors qu'il devrait le faire ?

Une dernière question si vous le voulez bien - je reçois toujours cette erreur 1 de modification de commande ! Il s'avère que cela vient d'ici lorsque je l'imprime ? Une idée ?

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

{

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               //buy order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.
               if(OrderType()==OP_BUY)
                  {
                  if(OrderStopLoss() > BuyStopPrice) break; 
                  if(OrderStopLoss() < BuyStopPrice)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                   if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
                   }     

               // sell order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.     
               if(OrderType()==OP_SELL)
                  {
                  if(OrderStopLoss() < SellStopPrice) break; 
                  if(OrderStopLoss() > SellStopPrice)
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                  if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
                  }
               }   
     }
}
 
DomGilberto:
Bon point - merci :) Je pense savoir pourquoi l'ordre n'est pas supprimé... SI l'OrderStopLoss n'est PAS > à la MA-ATR, alors il ne fera rien... C'est donc logique... C'est juste que parfois je le regarde, et c'est comme s'il ne voulait pas supprimer l'ordre et en placer un nouveau alors qu'il devrait le faire ?

Une dernière question si vous le voulez bien - je reçois toujours cette erreur 1 de modification de commande ! Il s'avère que cela vient d'ici lorsque je l'imprime ? Avez-vous une idée ?

Voilà le problème... (similaire pour l'OP_SELL)

if( OrderStopLoss() < BuyStopPrice )

... et quand vous obtenez une erreur 1 c'est parce que OrderStopLoss() == BuyStopPrice donc vous modifiez l'ordre pour avoir la même valeur de StopLoss, d'où l'erreur 1 donc maintenant vous vous demandez comment d'une part OrderStopLoss() == BuyStopPrice et d'autre part OrderStopLoss() < BuyStopPrice

Avez-vous suivi le lien dans le post et l'avez lu jusqu'à ce que vos yeux saignent ? Je parie que non... https://www. mql5.com/en/forum/146380 Si vous continuez à ignorer ce problème, il va continuer à vous rattraper et vous allez continuer à perdre du temps... Prenez le problème à bras le corps, comprenez-le, ne souffrez plus, soyez heureux.

 

Ok, je vais relire tout cela - pour en revenir au problème de la vidéo jointe, je pense avoir résolu le problème ci-dessous, MAIS, cela ne fonctionne pas du côté de l'achat ? Pour une raison quelconque, aucune transaction n'est déclenchée. Cependant, du côté de la vente, cela fonctionne EXACTEMENT comme je le souhaite ?

Tout est EXACTEMENT inversé du côté de l'achat. Toutes ces instructions "si" ne sont que des moyennes mobiles. La ligne spécifique que j'ai modifiée est "triggerBarTime+H1_high>= ema21". Du côté de l'achat, cela ressemblerait à = "triggerBarTime+H1_low<= ema21" - Si je supprime "triggerBarTime", cela fonctionnera pour les ordres d'achat et de vente. Cependant, si je laisse "triggerBarTime", cela fonctionnera parfaitement du côté de la vente (c'est-à-dire, fermer les ordres sur CHAQUE barre, recalculer parfaitement et placer un nouvel ordre avec des paramètres ajustés). MAIS ne placera AUCUN ordre ou ne tentera rien du côté de l'achat ? C'est une modification très importante que je dois faire...

Regardez cette vidéo : http://screencast.com/t/uJu3nlNxAXDF - J'espère que cela devrait vraiment bien l'expliquer ! :D


Pas d'inquiétude si vous ne pouvez pas m'aider :)

     // Check for Moving Averages Fanned up ON THE DAILY TIME FRAME, creating an UP bias.   
    if(D1_Bias=="None") 
      if(Daily_3<Daily_5)
         if(Daily_5<Daily_8)
            if(Daily_8<Daily_10)
               if(Daily_10<Daily_12)
                  if(Daily_12<Daily_15)
                     if(Daily_15<Daily_30)
                        if(Daily_30<Daily_35)
                           if(Daily_35<Daily_40)
                              if(Daily_40<Daily_45)
                                 if(Daily_45<Daily_50)
                                    if(Daily_50<Daily_60)
                                       {
                                       D1_Bar=Time[1];
                                       D1_Bias="Daily is Down";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned up ON THE 4 HOUR TIME FRAME, creating an UP bias.  
    if(H4_Bias=="None") 
      if(Hour4_3<Hour4_5)
         if(Hour4_5<Hour4_8)
            if(Hour4_8<Hour4_10)
               if(Hour4_10<Hour4_12)
                  if(Hour4_12<Hour4_15)
                     if(Hour4_15<Hour4_30)
                        if(Hour4_30<Hour4_35)
                           if(Hour4_35<Hour4_40)
                              if(Hour4_40<Hour4_45)
                                 if(Hour4_45<Hour4_50)
                                    if(Hour4_50<Hour4_60)
                                       {
                                       H4_Bar=Time[1];
                                       H4_Bias="4 Hour is Down";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned down creating an DOWN bias.  
   if(D1_Bias=="Daily is Down" && H4_Bias=="4 Hour is Down" && H1_Bias=="None")
      if(CurrentSmallFish1<CurrentSmallFish2)
         if(CurrentSmallFish2<CurrentSmallFish3)
            if(CurrentSmallFish3<CurrentSmallFish4)
               if(CurrentSmallFish4<CurrentSmallFish5)
                  if(CurrentSmallFish5<CurrentSmallFish6)
                     if(CurrentSmallFish6<CurrentBigFish1)
                        if(CurrentBigFish1<CurrentBigFish2)
                           if(CurrentBigFish2<CurrentBigFish3)
                              if(CurrentBigFish3<CurrentBigFish4)
                                 if(CurrentBigFish4<CurrentBigFish5)
                                    if(CurrentBigFish5<CurrentBigFish6)
                                       {
                                       triggerBarTime=Time[1];
                                       H1_Bias="Down";
                                       Comment("Bias is: "+H1_Bias+" since: "+TimeToStr(triggerBarTime,TIME_DATE|TIME_MINUTES));
                                       H4_Bias="4 Hour is Down";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       D1_Bias="Daily is Down";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   ///////////////////////////////////////////////////////////////////////////////////////
   
   H1_high  = iHigh(NULL, PERIOD_H1, 1);
   H1_close = iClose(NULL, PERIOD_H1, 1);
   if(H1_Bias=="Down" && H4_Bias=="4 Hour is Down" && D1_Bias=="Daily is Down" && triggerBarTime+H1_high >= ema21 && H1_close < CurrentBigFish6)
      {
      OrderEntry(1); // Sell function is called.
      }
 
Des idées ?
Raison: