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

 
DomGilberto:
Scusa - È colpa mia che non mi sono spiegato bene. Guardo D1, 4Hr e infine 1Hr per le MA da separare a ventaglio (tra un sacco di altri filtri) - Una volta che sono tutte allineate, sull'H1 aspetterà fino a che una qualsiasi barra tira indietro alla 21 EMA UNA VOLTA, e poi da lì piazzerà un ordine sopra i massimi e uno stop sotto la 60 EMA - ATR.

Il pullback alla 21 EMA avviene solo una volta. Da lì, smetterà di cercare qualsiasi pullback al 21 EMA. Quello che dovrebbe fare, però, è assicurarsi che l'attuale ordine aperto PENDING sia esattamente aggiornato con i lotti, gli stop e i take profit DOPO ogni ora di chiusura. Tuttavia, non riesco a capire perché a volte funziona perfettamente e aggiorna l'ordine pendente dopo ogni chiusura H1, e altre volte no? Il motivo per cui l'ordine pendente si aggiorna è dovuto a ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) ".

Se questo non è vero, allora non lo farà - TUTTAVIA, ci sono innumerevoli volte in cui questo è vero, eppure non cancellerà l'ordine e ne piazzerà uno nuovo con i nuovi valori?

Non sono sicuro che tu possa vedere qualcosa in quel codice sopra relativo al video? (Il primo codice che avete corretto). Spero che sia più chiaro?

Penso che dovrai farlo nel modo più duro e laborioso . . . stampare le variabili rilevanti, muoverti nel tempo nello Strategy Tester, tick per tick se necessario, verificando quali sono le variabili . . . poi se trovi che dovrebbero far succedere qualcosa e non lo fanno puoi concentrarti su quel codice.

E' relativamente facile individuare semplici problemi di sintassi nel codice di qualcun altro, è più difficile e richiede molto più tempo individuare errori nella codifica della loro strategia, per una cosa, per essere in grado di farlo la strategia deve essere compresa altrettanto bene, se non meglio, della persona che fa la codifica.

 
Sì, hai ragione! Farò esattamente questo ora :) grazie Raptor!
 
Una cosa che devo chiarire nella mia testa è; questo codice qui, sul ciclo, come mi assicuro che sta eseguendo la funzione OrderDelete() e il ciclo sta eseguendo il ciclo su ogni chiusura H1? È perché ho questo all'"int start" che indica se il ciclo è fatto su base H1 o no? (Il "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:
Una cosa che devo chiarirmi le idee è: questo codice qui, nel ciclo, come faccio ad assicurarmi che esegua la funzione OrderDelete() e che il ciclo venga eseguito su ogni chiusura H1? È perché ho questo all'"int start" che indica se il ciclo è fatto su base H1 o no? (Il "IsNewCandle()") ?


CheckForMATrade() viene chiamata una volta per ogni nuova barra, se stai lavorando su un grafico H1, sarà una volta all'inizio della nuova barra H1... il resto viene eseguito ogni tick.

Stai calcolando il valore ATR corretto, per l'inizio della nuova barra? Tenendo presente che hai appena iniziato la barra 0, vuoi davvero ottenere la MA basata sulla barra 0? Gli indicatori non sono il mio campo, quindi non pensare che stia dicendo che hai sbagliato, sto solo chiedendo

 
Sì, ho appena fatto una stampa per ricontrollare la matematica MA-ATR. È corretto. Lo sto facendo sulla barra 1 (l'ultima barra H1 chiusa). La matematica è corretta, solo che non credo che i calcoli vengano fatti coerentemente su OGNI barra H1 chiusa...
 
DomGilberto:
Sì, ho appena fatto una stampa per ricontrollare la matematica MA-ATR. E' corretto. Lo sto facendo sulla barra 1 (la barra H1 chiusa più recentemente). La matematica è corretta, solo che non credo che i calcoli vengano fatti coerentemente su OGNI barra H1 chiusa...

La MA non è sulla barra 1 però . . .

iMA(NULL, 60, MA_Period, 0, 1, 0, 0   ) - ATR)  
 
Buon punto - grazie :) Penso di sapere perché non cancella l'ordine... Se l'OrderStopLoss NON è > della MA-ATR, allora non farà nulla... Quindi ha senso... Solo che a volte lo guardo ed è come se non volesse cancellare l'ordine e metterne uno nuovo quando dovrebbe?

Un'ultima domanda, se non vi dispiace - sto ancora ricevendo questo stupido errore 1 di modifica dell' ordine! Risulta che viene da qui quando lo stampo? Qualche idea?

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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:
Buon punto - grazie :) Credo di sapere perché non cancella l'ordine... Se l'OrderStopLoss NON è > della MA-ATR, allora non fa nulla... Quindi ha senso... Solo che a volte lo guardo ed è come se non volesse cancellare l'ordine e metterne uno nuovo quando dovrebbe?

Un'ultima domanda, se non vi dispiace - sto ancora ricevendo questo stupido errore 1 di modifica dell'ordine! Risulta che viene da qui quando lo stampo? Qualche idea?

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

if( OrderStopLoss() < BuyStopPrice )

. . . 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'hai fatto... https://www. mql5.com/en/forum/146380 se continui ad ignorare questo problema, continuerà a coglierti in fallo e continuerai a perdere tempo... vieni a capo della questione, comprendila, non soffrirne più, sii felice

 

Ok, rileggerò tutto di nuovo - tornando al problema con il video allegato, il modo in cui penso di averlo risolto è qui sotto, MA non funziona sul lato Buy? Per qualche motivo, non viene attivata nessuna operazione. Tuttavia sul lato vendita, funziona ESATTAMENTE come voglio io?

Tutto è ESATTAMENTE invertito per il lato di acquisto. Tutte quelle dichiarazioni if sono solo medie mobili. La linea specifica che ho cambiato è "triggerBarTime+H1_high>= ema21". Sul lato di acquisto sarebbe come = "triggerBarTime+H1_low<= ema21" - Se tolgo "triggerBarTime" allora funzionerà sia sugli ordini di acquisto che di vendita. Tuttavia, se lascio in "triggerBarTime" funzionerà perfettamente sul lato vendita (come dire, chiudere gli ordini su OGNI barra, ricalcolarlo perfettamente e piazzare un nuovo ordine con i parametri aggiustati!) MA non piazzerà NESSUN ordine e non tenterà di fare nulla sul lato dell'acquisto? Questa è una modifica molto importante che devo fare...

Guardate questo video: http: //screencast.com/t/uJu3nlNxAXDF - Speriamo che questo spieghi bene! :D


Non preoccupatevi se non potete aiutarmi :)

     // 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.
      }
 
Qualche idea?