Problemi di controllo degli scambi aperti - pagina 6

 

Non ho mai provato questo, ma non credo che sia valido . . .

OrderType()==(OP_BUYSTOP||OP_SELLSTOP) &&     // The order selected is either a pending buy on stop order or a buy on sell order
OrderMagicNumber()==(Mnumber1||Mnumber1))    // The orders magic number is the same as the magic number used in this ea

Penso che tu debba fare questo...

((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber2))    // The orders magic number is the same as the magic number used in this ea

il motivo per cui penso questo è . . . cosa equivale a questo? (OP_BUYSTOP||OP_SELLSTOP) Potrebbe funzionare se le variabili fossero bool. . . ma non credo che possa funzionare con int.

Una cosa minore, non hai bisogno di OderSelect prima di OrderDelete. In generale hai bisogno di OrderSelect solo quando usi una funzione Order che non usa int ticket. ad esempio OrderComment( ), OrderCommission( ), ecc

 
Ok grazie Raptor, ho appena aggiornato il codice sul mio post. Mi sono appena ricordato come voi ragazzi avete detto che non andava bene usare le barre per un contatore, così l'ho cambiato per usare il tempo delle barre. Sistemerò la logica e vedrò se funziona.
 

Ok ho riparato la logica. Ma non cancella ancora gli ordini.


Come ho detto prima ho cambiato il contatore da bar a bar...


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;

// * EVERYTIME A TRADE GETS TRIGGERED 

bartraded = TimeHour(TimeCurrent());


   if(TimeHour(TimeCurrent()) > (bartraded + pendinglimit) && Tradeopen()==true)      // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 

dazamate:
Ok grazie Raptor, ho appena aggiornato il codice sul mio post. Mi sono appena ricordato di come voi ragazzi avete detto che non andava bene usare le barre per un contatore, così l'ho cambiato per usare il tempo delle barre. Sistemerò la logica e vedrò se funziona.
"Bars è inaffidabile (una volta raggiunto il massimo di barre sul grafico non cambierà e il codice si rompe.) Volume[0]==1 è inaffidabile, se si perde un tick il codice si rompe. Usa sempre il tempo".

è vero, ma è necessario guardare il contesto di quando questo commento è stato fatto . . . Le barre sono inaffidabili . . .

int Bars 

Number of bars in the current chart

ma questo non significa che non puoi usare i numeri delle barre invece del numero di ore. Per esempio, come si comporterà il vostro codice il venerdì sera e la domenica? Il pendinglimit è uguale a 4 ore o a 4 barre?

Inoltre, cosa succede se un trade viene piazzato alle 22:00? 22 + 4 = 26?

if(TimeHour(TimeCurrent()) > (bartraded + pendinglimit) && Tradeopen()==true)      // Check to see if pending orders have expired
 

Va bene, vedo il problema con la strategia temporale. Ma se usiamo le barre come contatore, una volta che il grafico raggiunge le barre massime, fallirà anche lì, giusto?

Ci tornerò sopra e vedrò cosa posso fare...

 

Ok, che ne dici di questo approccio


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;
 
// * EVERYTIME A TRADE GETS TRIGGERED* 

bartraded = 0;


  if (Time0 == Time[0]) return; Time0 = Time[0];          // make sure each bar is only scanned once
       {   
//-----------------------------------------------------------------------------------------------------------------------------------------------
//TRADE COUNTER
   

   bartraded++;  // Each time a new bar opens add 1 to the counter

//------------------------------------------------------------------------------------------------------------------------------------------------
// DELETE PENDING ORDERS THAT HAVE NOT BEEN TRIGGERED WITHIN 'pendinglimit'

   if(bartraded > pendinglimit && Tradeopen()==true)      // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 
dazamate:

Va bene, vedo il problema con la strategia temporale. Ma se usiamo le barre come contatore, una volta che il grafico raggiunge le barre massime, fallirà anche lì, giusto?


No, la barra H1 corrente è sempre la barra 0 . . tra 60 minuti la barra H1 corrente sarà la barra 0 . .il problema delle barre è se usi Bars, cioè il numero totale di barre sul tuo grafico, o se stai guardando le barre all'estrema sinistra del tuo grafico.

Il numero di barra per TimeHour(TimeCurrent () è 0, potete ottenere il numero di barra per il tempo in cui il vostro trade è stato piazzato (dovete calcolarlo, non memorizzarlo!!!) usando iBarShift e poi fare qualcosa del genere.

if (iBarShift(symbol, TF, Time_order_Placed)+1 >  pendinglimit) && Tradeopen()==true)  
 

Ok, terza volta fortunata, mi ci è voluto un po' per capire cosa stavi cercando di dire. Ecco cosa ho fatto. Ma gli ordini non vengono ancora cancellati >:(


static datetime tradeopened;


//Everytime a trade is opened I run
 tradeopened = TimeCurrent();


 if((iBarShift(hothand(),60 ,tradeopened)>pendinglimit) && Tradeopen()==true)          // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))     // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 
Sì, ho appena riletto il tuo commento e quello che ho fatto è sbagliato,
tradeopened = TimeCurrent()
non mi darà il tempo di apertura della barra dovrei usare Time[0]?
 

Prova questo ;-)

OrderDelete(OrderTicket( ) );                    // Delete it
Motivazione: