EA si scontra quando si usano più coppie... - pagina 3

 
Ah, l'ho capito!

Avevo bisogno di chiamare la modifica dell'ordine dalla funzione "int start()" quando viene chiamato anche "If(IsNewCandle()". Quindi, su OGNI ora di chiusura, il "void OrderModify" che modifica l'ordine PENDING se l'ordertoploss > iMA-ATR, sarà modificato e calibrato di conseguenza.

Quindi ora sta facendo il suo lavoro correttamente :) Ora devo leggere fino a farmi sanguinare gli occhi... :)
 
RaptorUK:

Questo è il problema . . . (simile per l'OP_SELL)

. . . e quando ottieni l'errore 1 è perché OrderStopLoss() == BuyStopPrice quindi stai modificando l'ordine per avere lo stesso valore di StopLoss, da cui l'errore 1, quindi ora ti stai chiedendo come da un lato OrderStopLoss() == BuyStopPrice e dall'altro OrderStopLoss() < BuyStopPrice

Hai seguito il link nel post e lo hai letto fino a farti sanguinare gli occhi? Scommetto che non l'avete fatto... https://www. mql5.com/en/forum/146380 se continuate ad ignorare questo problema, continuerà a prendervi in contropiede e continuerete a perdere tempo... affrontatelo, capitelo, non soffritene più, siate felici


tranne che con lo zero non confrontare mai i doppi per l'uguaglianza < Potrebbe essere questo quello che stavo cercando da 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:

tranne che con zero non confrontare mai i doppi per l'uguaglianza < Potrebbe essere questo quello che stavo cercando da WHRoeder...?
Certamente funzionerà, capisci perché e qual è il problema?
 
Per essere perfettamente onesto, no, non capisco... Ho provato a scriverlo e a stampare i confronti, però...
 
DomGilberto:
Per essere del tutto onesto, no, non capisco... Ho provato a scriverlo e a stampare i confronti però...

1.51234000001 non è lo stesso di 1.51234000002 ma dal punto di vista di un prezzo sono entrambi 1.51234 quindi sono uguali. . . quindi sono uguali ma uno è maggiore dell'altro. Tutto ha a che fare con il modo in cui i numeri in virgola mobile sono rappresentati in binario, è inesatto quindi c'è generalmente un piccolo errore qua e là. . .

Date un'occhiata a questo: numeri in virgola mobile

 

Ma perché NormalizedDouble, Digits non risolverebbe questo problema? Perché sono inclusi i decimali extra non necessari? Apprezzo il fatto che non sia necessario usare NormalizeDouble su variabili predefinite, ma che senso ha usare NormalizeDouble su variabili non predefinite, e poi provare a confrontarle quando non corrisponderanno mai :s?

Strano!

Se volessi fare "If(Bid > OrderOpenPrice())" non funzionerebbe, vero? Dovrei fare le regole di cui sopra, su ogni dichiarazione di confronto, cioè "If(Bid - OrderOpenPrice() > Point / 2.)?


Oh e cosa If(Bid == OrderOpenPrice()), c'è qualcosa che devo fare con quella dichiarazione?

 
DomGilberto:

Ma perché NormalizedDouble, Digits non lo risolverebbe? Perché sono inclusi i decimali extra non necessari? Apprezzo il fatto che non sia necessario usare NormalizeDouble su variabili predefinite, ma che senso ha usare NormalizeDouble su variabili non predefinite, e poi cercare di confrontarle quando non corrisponderanno mai :s?

NormalizeDouble non risolve il problema, non trasforma 1 .51234000001 in 1.51234, semplicemente lo "incasina" in un modo diverso... quindi usandolo speri che incasini tutti i tuoi valori allo stesso modo.

DomGilberto:


Se volessi fare "If(Bid > OrderOpenPrice())" non funzionerebbe, vero? Avrei bisogno di fare le regole di cui sopra, su ogni dichiarazione di confronto, cioè "If(Bid - OrderOpenPrice() > Point / 2.)?

Sì, se vuoi essere sicuro che il tuo confronto ti stia dando un risultato accurato, sì.

DomGilberto:

Oh e cosa If(Bid == OrderOpenPrice()), c'è qualcosa che devo fare con quella dichiarazione?

Sì, soffrirà esattamente dello stesso problema.
 
Ok grazie - ho ridotto drasticamente l'errore OrderModify 1 - tuttavia, sto ancora ottenendo un po 'di tanto in tanto? Sembra che sia il MA_trail void? Inoltre, come potrei scrivere correttamente "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 grazie - ho ridotto drasticamente l'errore OrderModify 1 - tuttavia, sto ancora ottenendo un po 'di tanto in tanto? Sembra che sia il MA_trail void? Inoltre, come potrei scrivere correttamente "If(Bid == OrderOpenPrice())?

I tuoi occhi non stanno sanguinando abbastanza. . .

Potresti fare qualcosa del genere:

!( MathAbs(FirstPrice - SecondPrice) > HalfAPoint )

fai attenzione al !

Da qui: https://www.mql5.com/en/forum/136997/page4#781986

 
Stai suggerendo questo in relazione al codice sopra o in relazione a "If(Bid == OrderOpenPrice())"?
Motivazione: