Ea sta creando più ordini uguali in attesa/limite [Aiuto pls] - pagina 2

 
GumRai:

Prima di tutto non cercare di dichiarare una funzione dentro un'altra funzione.

Non sono in grado di capire cosa stai cercando di fare guardando il codice che hai postato. Quindi non posso aiutarti.

Grazie GumRai per la tua pronta risposta. Il mio programma ha molte condizioni come le seguenti. Ho controllato fino a P12. È come un pivot. Se le condizioni sono soddisfatte, allora apre le operazioni limite su quei livelli P1, P2, .... e il suo numero è 12. Non volevo scrivere il codice di acquisto/vendita per ogni istanza. Questo è il motivo per cui ho creato funzioni separate di buycall/sellcall. Di seguito il mio vecchio codice per la vendita.

     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  
         .......................many more
 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}
 

Questo è l'esempio. Stesso piazzamento su ogni tick. Ho bisogno di posizionarlo su ogni ora. Poiché si tratta di un pivot orario.

 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}

Quando aprite un limite di vendita, impostate BuyTicket a 0.

Poi controllate se BuyTicket==0, naturalmente lo fa, l'avete appena impostato.

Poi imposti SellTicket a 0.

Il prossimo tick, Sellticket==0 quindi apri un limite di vendita e imposti BuyTicket di nuovo a 0.

e così via............

 
GumRai:

Quando aprite un limite di vendita, impostate BuyTicket a 0.

Poi controllate se BuyTicket==0, ovviamente lo fa, l'avete appena impostato.

Poi imposti SellTicket a 0.

Il prossimo tick, Sellticket==0 quindi apri un limite di vendita e imposti BuyTicket di nuovo a 0.

e così via............

Allora dovrei rimuovere le due linee che hai evidenziato. L'ho fatto. Ora mostra solo il risultato di un'ora per 2 mesi di dati di back testing.

Un'altra cosa che ho notato, nel mio sellcall, ho un trade inverso sul buy. Se l'operazione di vendita viene interrotta, si apre l'operazione di acquisto. Ora per la funzione sellcall restituisce (Selltickets) quindi va bene?

Grazie.

 

int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
   if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,0,Red);
   
   // reverse tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       
       }
   }
 } 
 }
   return(SellTicket);

Ora capisco che in questo codice, prima controlla sellticket == 0 sì, ovvio, poi piazza l'ordine di vendita, poi buyticket == 0 sì, poi piazza l'ordine di acquisto... ma quando ritorna... di nuovo controlla sellticket == 0, no, non lo fa ora... ecco perché Ea si è fermata dopo aver preso un set. Ma come rimuovere questo problema. Nel mio EA gli ordini pendenti inattivi vengono cancellati ogni 59 minuti dall'ora di inizio. L'ho impostato in questo modo.

 

Ora ho cambiato il codice nel modo seguente, leggendo per tutti i supporti e le resistenze.

Ho al massimo 6 supporti e 6 resistenze per un'ora. Tra i 6 che soddisfano le condizioni, apre gli ordini limite su quei 6. Se 1 soddisfa allora apre gli ordini limite per quello. Questo è l'algoritmo.

Quindi ho impostato il codice nel modo seguente per la chiamata della funzione.

int BuyCall( double BC)
{  
      
if ( BuyTicket >= 0 && BuyTicket <= 5)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,TimeCurrent()+3540,Green);
    
   }   
return(0);
}

int SellCall(double SC)
{
  
 if( SellTicket >= 0 && SellTicket <= 5)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);
  
   } 
   return(0);
}

Ora funziona per un'ora e controlla 6 livelli per ogni acquisto/vendita. Ma funziona solo per un'ora. Cosa fare qui per farlo funzionare perfettamente per l'intero set di dati.

 
if ( BuyTicket >= 0 && BuyTicket <= 5)

Questo funzionerà solo nel tester della strategia e non farà più nulla una volta aperti i primi 6 ordini.

Non è possibile utilizzare un numero di ticket per un test in questo modo

 
GumRai:

Questo funzionerà solo nel tester della strategia e non farà più nulla una volta aperti i primi 6 ordini.

Non è possibile utilizzare un numero di ticket per un test in questo modo

Grazie per la sua risposta.

Allora cosa dovrei fare? Se rimuovo il BuyTicket =>0 o qualsiasi condizione BuyTicket. Allora l'EA sta prendendo molti stessi trade con ogni tick..... dandomi un errore di ordersend di 148.

 
cashcube: Allora cosa dovrei fare.
Risposta precedente.
 
cashcube:

Grazie per la vostra risposta.

Allora cosa dovrei fare? Se rimuovo il BuyTicket =>0 o qualsiasi condizione BuyTicket. Allora l'EA sta prendendo molti stessi trade con ogni tick..... dandomi un errore di orderend di 148.

Non sappiamo cosa stai cercando di fare

Se vuoi solo una negoziazione aperta alla volta, controlla che non ci siano ordini aperti prima di inviarne uno nuovo.

Se volete solo una negoziazione per barra, testate solo una volta per barra

Se volete una combinazione di condizioni, testate la combinazione.

Motivazione: