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

 

Ciao, ho fatto un Ea, ma quando faccio il back testing crea molti ordini pendenti uguali su ogni tick. Come fermare questo. Ho solo bisogno di un ordine alla volta, non ho bisogno della sua copia.

Se eseguo questo EA su un grafico orario con"solo prezzo aperto" allora non crea copie.

Inoltre il mio EA ha l'opzione per il commercio di inversione se il limite di acquisto fallisce allora apre il commercio di vendita. Per favore fatemi anche sapere se l'ho impostato correttamente o no. Qualsiasi aiuto sarà apprezzato.

Grazie per il vostro tempo.

// Main function//
if(condition)
   {
     if( condition )
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( condition)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  

   etc etc... // many conditions
}

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
   if ( BuyTicket == 0)
   {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;

   // reverse trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
     }    
   }
      
return(BuyTicket);
}
 
cashcube: Come impedirlo.
Come pensi? Si controlla una già uscita prima di aprirne una nuova.
 
WHRoeder:
cashcube : Come fermare questo.
Come pensi? Si controlla se ce n'è uno già uscito prima di aprirne uno nuovo.

Poi cosa fare? Rimuovere il codice buyticket == 0 & sellticket == 0?
 
Gli EA devono essere codificati per recuperare. Se la corrente viene a mancare, il sistema operativo va in crash, il terminale o il grafico viene chiuso accidentalmente, al prossimo tick, qualsiasi variabile statica/globale del ticket sarà stata persa. Avrai un ordine aperto ma non lo saprai, quindi l'EA non proverà mai a chiuderlo, a seguire SL, ecc. Come farai a recuperare? Utilizzando un cicloOrderSelect per recuperare, o la memorizzazione persistente (GV/file) dei numeri di ticket richiesti.
 
WHRoeder:
Gli EA devono essere codificati per recuperare. Se la corrente viene a mancare, il sistema operativo si blocca, il terminale o il grafico viene chiuso accidentalmente, al prossimo tick, qualsiasi variabile statica/globale del ticket sarà stata persa. Avrai un ordine aperto ma non lo saprai, quindi l'EA non proverà mai a chiuderlo, a seguire SL, ecc. Come farai a recuperare? Utilizzando un cicloOrderSelect per recuperare, o la memorizzazione persistente (GV/file) dei numeri di ticket richiesti.

Ciao, l'ho aggiunto cambiando il codice nel modo seguente.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true)
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }

Prende ancora gli stessi ordini più volte ad ogni tick.

Inoltre, se rimuovo il segno "!", non prende nessun ordine.

Per ultimo devo rimuovere il controllo buyticket & sellticket dalla mia funzione principale?

Grazie, grazie

 
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
  1. Non incollare il codice
    Riproduci video
    Per favore, modifica il tuo post.
    Per grandi quantità di codice, allegalo.

  2. Non scrivereste mai if( (2+2 == 4) == true), vero? if(2+2 == 4) è sufficiente. Quindi non scrivere if(bool == true), usa solo if(bool) o if(! bool). Il codice diventa auto-documentante quando usi nomi di variabili significativi, come bool isLongEnabled. Long_Entry suona come un prezzo di attivazione o un numero di biglietto e "if long entry" è una frase incompleta.
  3. Dove controlli se BuyTicket ha chiuso? Selezionando per ticket sarà sempre vero (dato un numero di ticket valido), l'ordine potrebbe essere qualsiasi tra pendente, aperto, chiuso o cancellato.
  4. Hai completamente ignorato il mio suggerimento di un ciclo OrderSelect.
 

Ciao WHReder grazie per la tua risposta.

Sì, ho aggiunto quelli sul codice SRC. Ma non ha mostrato quando ho modificato.

Ho rimosso i termini == true come hai suggerito.

Per favore non fraintendermi, ho un punto debole nella comprensione di questo ciclo orderelect. Non l'ho ignorato. Ho provato ad aggiungerlo, ma è troppo complesso, l'esecuzione mostra 16 errori e 2 avvertimenti. In quel codice cos'è MN.Count?

// extern int     Magic.Number.Base          = ...
// int      magic.number.max;                   // Export to OpenOrder/MySelect
// string   market.pair;                        // Export to OpenOrder/MySelect
// int init(){
//    market.pair       = Symbol();
//    magic.number.max  = Magic.Number.Base + MN.COUNT - 1;

Riguardo al controllo dell'acquisto del biglietto chiuso. Non l'ho controllato perché ho controllato se il prezzo corrente è inferiore al buystoploss, allora l'operazione di acquisto è stata chiusa, quindi ho aperto un ordine di vendita.

 Bid < BuyStopLoss 

Saluti

 

Ho sistemato il codice in qualche modo come questo...Ma mostrando 2 errori ora... "Myselect" & "MyOrdersTotal" può essere decleared solo in ambito globale.

int BuyCall( double BC)
{  
//-----------code
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
   if(!OrderSelect(iWhat, eSelect, ePool) )  return (false);
   int      mn = OrderMagicNumber();
   if(mn < MNB1              )  return (false);
   if(mn > MNB2               )  return (false);
   if(OrderSymbol()      != Pair   )  return (false);
   if(ePool != MODE_HISTORY               )  return (true);
   return(OrderType() <= OP_SELL); 
                                   
                                   
}
int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){   #define  OP_ALL -1
   if(ePool == MODE_TRADES)            iPos = OrdersTotal()        - 1;
   else                                iPos = OrdersHistoryTotal() - 1;
   for(nOrders=0; iPos >= 0; iPos--) if(
      MySelect(iPos, SELECT_BY_POS, ePool)) if(
      op == OP_ALL || op == OrderType()
   )  nOrders++;
   return(nOrders);
}

  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }
      
return(BuyTicket);
}
 
Non si può dichiarare una funzione dentro un'altra funzione
 
GumRai:
Non puoi dichiarare una funzione dentro un'altra funzione

Allora come posso farlo? Voglio dire che ho molte condizioni da controllare individualmente per aprire un ordine di acquisto/vendita.

Ecco perché ho creato una funzione buycall/sellcall per rendere il codice più semplice.

È solo che l'EA sta prendendo così tante transazioni uguali. Non so come fermarlo.

 
GumRai:
Non puoi dichiarare una funzione dentro un'altra funzione

cashcube:

Allora come posso farlo? Voglio dire che ho molte condizioni da controllare individualmente per aprire un ordine di acquisto/vendita.

Ecco perché ho creato una funzione buycall/sellcall per rendere il codice più semplice.

È solo che l'EA sta prendendo così tante transazioni uguali. Non so come fermarlo.

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 aiutarvi.

Motivazione: