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

 
GumRai:

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.

Lo spiego qui:

Ho al massimo 6 supporti e 6 resistenze per ogni ora. Può essere 2 supporti e 2 resistenze o qualsiasi cosa, ma al massimo 6 supporti e 6 resistenze per ogni ora.

Voglio aprire un ordine limite a quei livelli S/R all'inizio di ogni ora.

Ho creato una funzione di acquisto e una di vendita... in modo da non dover scrivere lo stesso codice di acquisto/vendita per un totale di 12 livelli S/R.

Ora, quando ho usato questo codice seguente:

int SellCall(double SC)
{
   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);
}

Crea più ordini uguali:

Ho usato anche il codiceWHRoeder. In una funzione separata. Poiché non posso dichiarare la funzione all'interno di una funzione.

 

Il tuo problema non è la funzione che hai postato, il tuo problema è nel codice che chiama la funzione.

Ovviamente non c'è nessun controllo per vedere se gli ordini sono già stati effettuati

 
GumRai:

Il tuo problema non è la funzione che hai postato, il tuo problema è nel codice che chiama la funzione.

Ovviamente non c'è nessun controllo per vedere se gli ordini sono già stati piazzati

codice per chiamare la funzione (snapshot)

 if(FS == 1 || FS == 5 || FS == 7)
   {
     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      
      BuyCall(S1);
      }  
     if( P3 == 1 || P3 ==5 || P3 ==7)
      {
  
      BuyCall(S2);
      }  
     if( P4 == 1 || P4 ==5 || P4 ==7)
      {
      
      BuyCall(S3);
      }      
          
     if( P5 == 1 || P5 ==5 || P5 ==7)
      {
     
      BuyCall(S4);
      }      
     if( P6 == 1 || P6 ==5 || P6 ==7)
      {
     
      BuyCall(S5);
      }  
     if( P7 == 1 || P7 ==5 || P7 ==7)
      {
      
      SellCall(R0);
      } 
     
      if( P8 == 1 || P8==5 || P8 ==7)
      {
    
      SellCall(R1);
      }  
      
     if( P9 == 1 || P9==5 || P9 ==7)
      {
      
      SellCall(R2);
      }          
          
    if( P10 == 1 || P10==5 || P10 ==7)
      {
     
      SellCall(R3);
      }   
    if( P11 == 1 || P11==5 || P11 ==7)
      {
     
      SellCall(R4);
      }                       
    if( P12 == 1 || P12==5 || P12 ==7)
      {
       
      SellCall(R5);
      }            
          
    }
   

Come controllare se gli ordini sono già stati piazzati o no? Con condizioni buyticket > 0?

 
cashcube:

codice per chiamare la funzione (snapshot)

Come controllare che gli ordini siano già stati piazzati o no? Con condizioni buyticket > 0?

È difficile dare consigli perché non so cosa stai facendo alla fine dell'ora con gli ordini non attivati e come stai gestendo gli ordini attivati.

Potresti creare un array (o 2) dichiarato globalmente e memorizzare i numeri di ticket per gli ordini aperti. Prima di aprire un nuovo ordine, controlla che l'elemento dell'array che corrisponde al livello abbia un valore >0.

Naturalmente, dovrai anche controllare i numeri di ticket e se cancelli gli ordini non attivati, imposta l'elemento dell'array a 0. Potresti anche dover controllare se l'ordine è stato chiuso e, a seconda della tua logica, reimpostarlo a 0

 
GumRai:

È difficile dare consigli perché non so cosa stai facendo alla fine dell'ora con gli ordini non attivati e come stai gestendo gli ordini attivati.

Potresti creare un array (o 2) dichiarato globalmente e memorizzare i numeri di ticket degli ordini aperti. Prima di aprire un nuovo ordine, controlla che l'elemento dell'array che corrisponde al livello abbia un valore >0.

Naturalmente, dovrai anche controllare i numeri di ticket e se cancelli gli ordini non attivati, imposta l'elemento dell'array a 0. Potresti anche dover controllare se l'ordine è stato chiuso e, a seconda della tua logica, reimpostarlo a 0

Come ho impostato i livelli di scadenza degli ordini Un-triggered, essi scadono alle 0:59 o al 59° minuto. Per l'ordine Triggered sono impostati SL e TP.

In precedenza ho progettato Ea che prende un ordine di acquisto o di vendita in ogni ora... nessun problema, il codice era semplice. Ma qui sembra molto difficile.

Ok, proverò a codificarlo come hai detto tu. Se sorgono problemi posterò qui. Inoltre sarebbe bello se tu potessi condividere qualche semplice esempio di codice per il conteggio del numero di ticket.

Grazie per il tuo suggerimento.

 

Ho risolto temporaneamente il mio problema con il seguente codice e l'esecuzione sul grafico orario. Semplice

 //--- go trading only for first tiks of new bar
   if(Volume[0]>1) return(0);
 
Bars è inaffidabile (un refresh/reconnect può cambiare il numero di barre sul grafico) il volume è inaffidabile (mancano i tick) Usa sempre il tempo. Nuova candela - forum MQL4
 
WHRoeder:
Bars è inaffidabile (un refresh/reconnect può cambiare il numero di barre sul grafico) il volume è inaffidabile (mancano i tick) Usa sempre il tempo. Nuova candela - MQL4 forum

Grazie per il codice. L'ho aggiunto nella funzione Tick. Ma ora il mio EA non sta prendendo alcun trade. Dato che uso la funzione buycall/sell call per piazzare ordini pendenti. Non ho potuto aggiungere questa funzione all'interno della funzione.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{     
              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)
{ 
   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);
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick(){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[0];
   bool isNewBar = timeCur != timePre;
   if(isNewBar){ 
     return; // Once per bar
   }
   return; // every tick
}  

Qualche idea?

 

Inoltre, anche il reverse trade sugli ordini fermati non funziona.

//-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if(OrderSelect(xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== MagicNumber)
           {
          //for buy order reverse
          if(OrderType()==OP_BUY && OrderProfit()<0) // if last buy closed with loss
          { 
            //--- go trading only for first tiks of new bar
            if(Volume[0]>1) return(0);
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Reverse Order",MagicNumber,0,Red);
          }
         break; 
          }
          }
     } 
 

Qualche evidenziazione sul codice inverso? Perché non funziona?

Grazie.