EA si scontra quando si usano più coppie...

 
Prima di tutto, so che Raptor ha già sollevato questo problema con me, ma non riesco a ricordare dove l'ha scritto e, soprattutto, a capire dove sto sbagliando?

Per quanto ne so lo stavo scrivendo correttamente in modo che l'EA collegato a qualsiasi coppia corrispondente potrà lavorare sempre e solo su quella coppia. Al momento, ho notato che GBPCAD e GBPUSD sembrano non andare d'accordo, nel senso che lo stoploss di GBPCAD pensa che il suo calcolo sia fatto dalla coppia GBPUSD... quindi quando viene attivato un ordine pendente, lo stop loss sfarfalla dai valori di GBPCAD a quelli di cable....

Uso magicnumber==1234;

Qualsiasi suggerimento o area in cui sto facendo l'idiota, sentitevi liberi di evidenziare :(

//+-------------------------------------------------------------------------------------+
//| Order Buy Function                                                                  |
//+-------------------------------------------------------------------------------------+   

//Place a pending buystop if no orders exists.. pending or otherwise.
if(direction==0)
{ 
      double btp=buy_takeprofit_price;
      
      double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);

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

      double BuyLotSize =(RiskedAmount/(pips_to_bsl/pips))/10;
      double Lots = NormalizeDouble(BuyLotSize,2);
      LotSize = MathFloor(Lots/Lot_Step)*Lot_Step;

  
      static double Stored_BuyPrice;

      if(OpenOrdersThisPair(Symbol())==0)
         {
         int BuyTicketOrder= OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);  >>>>// I am not sure if its this part? There is no way for this first OrderSend to tell what pair it is?
         if(BuyTicketOrder == -1)Print("First Buy Order Last Error = ",GetLastError());
         } 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(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==True)// 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());
            }
      }
} 
 
DomGilberto:
Prima di tutto, so che Raptor ha già sollevato questo problema con me, ma non riesco a ricordare dove l'hai scritto e, soprattutto, a capire dove sto sbagliando?

Per quanto ne so lo stavo scrivendo correttamente in modo che l'EA collegato a qualsiasi coppia corrispondente potrà lavorare sempre e solo su quella coppia. Al momento, ho notato che GBPCAD e GBPUSD sembrano non andare d'accordo, nel senso che lo stoploss di GBPCAD pensa che il suo calcolo sia fatto dalla coppia GBPUSD... quindi quando viene attivato un ordine pendente, lo stop loss sfarfalla dai valori di GBPCAD a quelli di cable....

Uso magicnumber==1234;

Qualsiasi suggerimento o area in cui sto facendo l'idiota, sentitevi liberi di evidenziare :(

Il tuo problema è chiaro, ma può essere un po' difficile da vedere a causa del modo in cui usi le parentesi graffe e le condizioni. . . fai così:

      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())                                  // if the symbol matches do . . . 
                   if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR)   //  . . . .  this
                        {
                        Stored_BuyPrice = OrderOpenPrice();                 // and this
                        DeleteOrder = OrderDelete(OrderTicket());           // and this
                        }

         if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order.   //  this happens even if the symbol didn't match . . .
            {
            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());
            }
      }

Penso che quello che volevi dire era questo . . .

     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());
               }
            }
         }
 
Ah ok - una piccola cosa che mi è sfuggita. Inoltre, quando la prima funzione OrderSend() viene chiamata, sto facendo qualcosa di sbagliato? Lo chiedo perché sto cercando di pensare logicamente se a quel punto sa o no a quale coppia deve essere inviato l'ordine? Potrebbe essere una domanda stupida, ma non sto facendo nulla di sbagliato con quella parte, vero? La parte della funzione di invio "BuyTicketOrder"?

Grazie per avermi individuato questa parte :)
 
DomGilberto:
Ah ok - una piccola cosa che mi è sfuggita. Inoltre, quando la prima funzione OrderSend() viene chiamata, sto facendo qualcosa di sbagliato? Lo chiedo perché sto cercando di pensare logicamente se a quel punto sa o no a quale coppia deve essere inviato l'ordine? Potrebbe essere una domanda stupida, ma non sto facendo nulla di sbagliato con quella parte, vero? La parte della funzione di invio "BuyTicketOrder"?

Grazie per avermi individuato questa parte :)
Symbol() è il simbolo del grafico su cui l'EA sta girando. . . non può sbagliare, può essere solo un simbolo
 
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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);

//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.
   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)break; 
                  if(OrderStopLoss() < BuyStopPrice)
                    bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(BuyModify < 0)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.     
   for(int s=OrdersTotal()-1; s>=0; s--)
     {
      if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_SELL)
               {
                 if(OrderStopLoss() < SellStopPrice)break; 
                   if(OrderStopLoss() > SellStopPrice)
                    bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(SellModify < 0)Print(" Sell Trailing Stop Failed: ", GetLastError());
               }   
     }

  }
Ok - Penso che questo sia ciò che causava il problema. Ho appena aggiornato il codice su questa parte e sembra che ora abbia smesso di lampeggiare su ogni tick dal cavo ai prezzi GBPCAD... Ora è bloccato su un prezzo di stop fino a quando non si aggiornerà da solo su questa chiusura oraria... quindi confermerò.

Ti sembra che vada bene? Inoltre, poiché ho queste chiusure parziali degli ordini, suppongo che probabilmente devo ricontrollare che le parentesi siano nella posizione corretta rispetto a "OrderSymbol()==Symbol())"?
 
if(OpenOrdersThisPair(Symbol()) == 0
Quante volte vuoi chiamare questo? Per ogni ordine (il tuo codice)? Per ogni ordine in sospeso sul grafico corrente (codice di RaptorUK)? O UNA VOLTA, DOPO aver memorizzato e cancellato il pendente?
 
DomGilberto:
Ok - Penso che questo sia ciò che stava causando il problema. Ho appena aggiornato il codice su questa parte e sembra che ora abbia smesso di lampeggiare su ogni tick dal cavo ai prezzi GBPCAD... Ora è bloccato su un prezzo di stop fino a quando non si aggiornerà da solo su questa chiusura oraria... quindi confermerò.

Ti sembra che vada bene? Inoltre, poiché ho queste chiusure parziali degli ordini, suppongo che probabilmente devo ricontrollare che le parentesi siano nella posizione corretta rispetto a "OrderSymbol()==Symbol())"?

Sembra OK, sì, controlla sempre le tue parentesi, e renditi la vita più facile dove puoi, se questo significa aggiungere parentesi allora fallo, ma cerca di essere coerente con parentesi e rientri.

Non avete bisogno di due cicli, uno solo andrà bene...

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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());
                  }
               }   
     }

OrderModify() restituisce un bool, vero o falso, non un int . . . quindi SellModify non sarà mai inferiore a 0 . . . Ho scritto la stessa cosa ieri su ForexFactory

 

Ogni volta che l'ordine è stato cancellato - che voglio che l'ordine pendente sia cancellato OGNI 1 ora di chiusura della barra e poi un nuovo ordine aperto con gli stessi parametri, O se applicabile, nuovi stop, obiettivi e dimensionamento del lotto basato su "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

L'unica cosa che ho bisogno di memorizzare per il NUOVO ordine pendente (dopo la cancellazione), è il prezzo di entrata iniziale su quel particolare set-up.(Stored_BuyPrice = OrderOpenPrice();)


È divertente perché il primo pezzo di codice qui sopra è anche in relazione a un altro thread che stavo per postare. Piuttosto che postare un nuovo argomento con una domanda simile chiederò qui, se questo va bene? Guarda il link qui sotto - solo un video di un paio di minuti che spiega il problema che ho e che sto trovando difficile da risolvere...

Ho scritto così tanto codice, ma ora sto iniziando a capire che è un caso di inefficienza che devo riparare...

Video: http://screencast.com/t/4nl8AaH8Sag

Se ho reso la cosa davvero ambigua fornendo solo una quantità limitata di codice, allora ne metterò ancora un po' su?

 
Grazie Raptor - Sì, l'ho appena notato. Ho passato un po' di tempo a pulire il mio codice, perché era un casino. Errori da dilettante come cercare di usare Prints come l'esempio che hai dato sopra lol.
 
DomGilberto:

Ogni volta che l'ordine è stato cancellato - che voglio che l'ordine pendente sia cancellato OGNI 1 ora di chiusura della barra e poi un nuovo ordine aperto con gli stessi parametri, O se applicabile, nuovi stop, obiettivi e dimensionamento del lotto basato su "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

L'unica cosa che ho bisogno di memorizzare per il NUOVO ordine pendente (dopo la cancellazione), è il prezzo di entrata iniziale su quel particolare set-up.(Stored_BuyPrice = OrderOpenPrice();)


È divertente perché il primo pezzo di codice qui sopra è anche in relazione a un altro thread che stavo per postare. Piuttosto che postare un nuovo argomento con una domanda simile chiederò qui, se questo va bene? Guarda il link qui sotto - solo un video di un paio di minuti che spiega il problema che ho e che sto trovando difficile da risolvere...

Ho scritto così tanto codice, ma ora sto iniziando a capire che è un caso di inefficienza che devo riparare...

Video: http://screencast.com/t/4nl8AaH8Sag

Se ho reso la cosa davvero ambigua fornendo solo una quantità limitata di codice, allora ne metterò ancora un po' su?

Correggimi se ho capito male... ma per la maggior parte delle barre nel video non hai ottenuto un pullback al 21 EMA
 
Scusa - È colpa mia se 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 al 21 EMA UNA VOLTA, e poi da lì piazzerà un ordine sopra i massimi e uno stop sotto il 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?