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

 
Ah j'ai trouvé !

J'avais besoin d'appeler la modification de l'ordre à partir de la fonction "int start()" lorsque "If(IsNewCandle())" est également appelé. Donc, à CHAQUE clôture d'heure, le "void OrderModify" qui modifie l'ordre PENDING si l'orderstoploss > iMA-ATR, sera modifié et calibré en conséquence.

Donc cela fait maintenant son travail correctement :) Maintenant je vais lire jusqu'à ce que mes yeux saignent... :)
 
RaptorUK:

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

... 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 continuera à vous rattraper et à vous faire perdre du temps... comprenez-le, ne le subissez plus, soyez heureux !


sauf avec zéro ne jamais comparer des doubles pour l'égalité < Peut-être est-ce ce que je cherchais par WHRoeder... ?
if (a > b)
if (a - b > Point / 2.)
if (a >= b)
if (a - b > -Point)
if (a != b)
if (MathAbs(a - b) > Point / 2.)
 
DomGilberto:

sauf avec zéro ne jamais comparer les doubles pour l'égalité < Peut être que c'est ce que je cherchais par WHRoeder... ?
Certainement cela va fonctionner, comprenez-vous pourquoi et quel est le problème ?
 
Pour être parfaitement honnête, non, je ne comprends pas... J'ai pourtant essayé de l'écrire et d'imprimer les comparaisons...
 
DomGilberto:
Pour être parfaitement honnête, non, je ne comprends pas... J'ai essayé de l'écrire et d'imprimer les comparaisons...

1.51234000001 n'est pas la même chose que 1.51234000002 mais, du point de vue du prix, elles valent toutes deux 1.51234 et sont donc identiques... Elles sont donc identiques mais l'une est supérieure à l'autre. Tout est lié à la façon dont les nombres à virgule flottante sont représentés en binaire, c'est inexact et il y a généralement une petite erreur ici et là . . .

Jetez un coup d'œil à ceci : les nombres à virgule flottante

 

Mais pourquoi NormalizedDouble, Digits ne résout-il pas ce problème ? Pourquoi les décimales supplémentaires inutiles sont-elles incluses ? J'apprécie le fait que vous n'ayez pas besoin d'utiliser NormalizeDouble sur des variables prédéfinies, mais quel est l'intérêt d'utiliser NormalizeDouble sur des variables non prédéfinies, et d'essayer ensuite de les comparer alors qu'elles ne correspondront jamais :s ?

C'est étrange !

Si je voulais faire "If(Bid > OrderOpenPrice())", cela ne fonctionnerait pas, n'est-ce pas ? Aurais-je besoin de faire les règles énoncées ci-dessus, sur chaque déclaration de comparaison ? c'est-à-dire "If(Bid - OrderOpenPrice() > Point / 2.) ?


Oh et que dire de If(Bid == OrderOpenPrice()), y a-t-il quelque chose que je doive faire avec cette déclaration ?

 
DomGilberto:

Mais pourquoi NormalizedDouble, Digits ne résout-il pas ce problème ? Pourquoi les décimales supplémentaires inutiles sont-elles incluses ? J'apprécie le fait que vous n'ayez pas besoin d'utiliser NormalizeDouble sur des variables prédéfinies, mais quel est l'intérêt d'utiliser NormalizeDouble sur des variables non prédéfinies, et d'essayer ensuite de les comparer alors qu'elles ne correspondront jamais :s ?

NormalizeDouble ne résout pas le problème, il ne transforme pas 1 .51234000001 en 1.51234, il se contente de le "gâcher" d'une manière différente... donc en l'utilisant, vous espérez qu'il gâche toutes vos valeurs de la même manière.

DomGilberto:


Si je voulais faire "If(Bid > OrderOpenPrice())", cela ne fonctionnerait pas, n'est-ce pas ? Aurais-je besoin de faire les règles énoncées ci-dessus, sur chaque déclaration de comparaison ? c'est-à-dire "If(Bid - OrderOpenPrice() > Point / 2.) ?

Oui, si vous voulez être sûr que votre comparaison vous donne un résultat précis, oui.

DomGilberto:

Oh et si (Bid == OrderOpenPrice()), y a-t-il quelque chose que je doive faire avec cette déclaration ?

Oui, il souffrira exactement du même problème...
 
Ok merci - j'ai considérablement réduit l'erreur 1 de OrderModify - cependant, j'en ai encore un peu de temps en temps ? Il semble que ce soit le vide MA_trail ? Aussi, comment puis-je écrire correctement "If(Bid == OrderOpenPrice()) ?
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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())
               {

               if(OrderType()==OP_BUY)
                  {
                  if(OrderStopLoss() - BuyStopPrice > Point / 2.) continue;
                  if(BuyStopPrice - OrderStopLoss() > Point / 2.)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                   if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
                   }     

    
               if(OrderType()==OP_SELL)
                  {
                  if(SellStopPrice - OrderStopLoss() > Point / 2. ) continue;
                  if(OrderStopLoss() - SellStopPrice > Point / 2. )
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                  if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
                  }
              }   
      }
} 
 
DomGilberto:
Ok merci - j'ai considérablement réduit l'erreur 1 de OrderModify - cependant, j'en ai encore un peu de temps en temps ? Il semble que ce soit le vide MA_trail ? Aussi, comment puis-je écrire correctement "If(Bid == OrderOpenPrice()) ?

Vos yeux ne saignent pas assez...

Vous pourriez faire quelque chose comme ça :

!( MathAbs(FirstPrice - SecondPrice) > HalfAPoint )

attention au !

D'ici : https://www.mql5.com/en/forum/136997/page4#781986

 
Suggérez-vous cela en relation avec le code ci-dessus ou en relation avec "If(Bid == OrderOpenPrice())" ?