Loop e chiusura o cancellazione di ordini - pagina 4

 
ggekko:

Ciao esperti, qual è la vostra opinione su questa soluzione?

while(OrdersTotal()>0)
Significa che è incompatibile con ogni altro EA (incluso se stesso) e con il trading manuale. (Negozi su altri grafici)
 
WHRoeder:
ggekko:

Ciao esperti, qual è la vostra opinione su questa soluzione?

Significa che è incompatibile con ogni altro EA (incluso se stesso) e con il trading manuale. (Negoziazioni su altri grafici)

Naturalmente. Questo è un totale chiudere tutto.

A volte ci sono situazioni (per esempio vuoi chiudere immediatamente troppi trade aperti) in cui la versione "originale" non funziona. Questa versione va bene per questo.

 
ggekko:

Naturalmente. Questa è una chiusura totale.

A volte ci sono situazioni (per esempio vuoi chiudere immediatamente troppi trade aperti) in cui la versione "originale" non funziona. Questa versione va bene per questo.

Perché non cerchi di reagire agli errori? Non dovresti analizzare l'errore e reagire di conseguenza? Per alcuni errori puoi riprovare, per altri devi smettere di provare.
 

Ciao,


Ho una domanda sui loop while. Voglio eseguire l'EA corrente in un ciclo il più frequentemente possibile. Quindi, il mio pensiero è quello di mettere il codice corrente all'interno di un loop while con una funzione sleep inclusa all'interno che fa sì che il while venga eseguito solo ogni 1 millisecondo.


Tuttavia, quando ho fatto questo, (ho inserito alcune chiamate di funzione Print("...") che tengono traccia di ciò che sta accadendo in ogni ciclo), vedo questo blocco e non ci sono più stampe sullo schermo.

Mi sto chiedendo quale possa essere il problema. Va bene far girare l'EA su un ciclo così frequente come 1ms? Ci sarebbe un problema nel cercare di ottenere l'ultimo bid/ask per esempio dal server ogni millisecondo? Questo metterebbe troppo carico lì, causando il freeze?

Forse qualcos'altro che il mio algoritmo sta facendo sta causando questo, non sono sicuro.


L'ho eseguito su cicli di 200ms e ottengo ancora lo stesso problema (anche se non così immediato). Potrebbe esserci un problema con la stampa di troppe righe nel file di log?



Grazie per qualsiasi consiglio su questo.

saluti,


C.

 
Può essere un problema di codice - ma senza conoscere il codice?
 

14967057:

Ho una domanda sui loop while. Voglio eseguire l'EA corrente in un loop il più frequentemente possibile.

Quindi, il mio pensiero è quello di mettere il codice corrente all'interno di un loop while con una funzione sleep inclusa all'interno che fa sì che il while venga eseguito solo ogni 1 millisecondo.

Ci sarebbe un problema nel cercare di ottenere l'ultima offerta/domanda.

Potrebbe esserci un problema con la stampa di troppe linee nel file di log?

  1. Questo thread riguardava la chiusura e l'eliminazione di ordini. Non dirottare i thread per domande fuori tema. Postane uno nuovo.
  2. Perché volete fare un ciclo continuo? Non sta cambiando nulla. Tutto quello che state facendo è sprecare tempo di CPU.
  3. Ritornate dall'inizio e quando Bid/Ask cambia, il vostro inizio sarà chiamato il più velocemente possibile.
  4. Sì, avete riempito tutta la ram disponibile con le righe, più velocemente di quanto Windows possa metterle su disco. Tutti i programmi vengono paginati fuori. Tutto si blocca.
 

Ciao,

Ho scoperto che il problema che avevo non era dovuto all'incapsulamento del mio codice EA all'interno di un ciclo while con uno sleep di 1ms. Questa parte sembra a posto (indipendentemente da dove stampo a schermo o meno), dato che l'ho fatto girare per l'ultima mezz'ora senza problemi.


Il problema era dovuto a un altro subdolo while che avevo nel codice e che alla fine ha fatto sì che l'EA rimanesse intrappolato in un ciclo infinito.

Grazie per l'input Gooly e Roesder.

saluti,

 

Ciao a tutti. Ho letto questo argomento e ho una domanda. Cerco di fare un codice che cancelli l'ordine pendente (solo STOP, nessun LIMIT), ma solo se è stato attivato un altro ordine pendente (inizio OP_SELL o OP_BUY). Quindi il codice è questo (ma ci sono degli errori, ma non so dove). Potreste dare un'occhiata al mio codice per favore?

 bool   result;
   int   i, j, cmd, cmd2,total;

   total=OrdersTotal();

   for(i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         cmd=OrderType();
         
         if(cmd!=OP_BUYSTOP && cmd!=OP_SELLSTOP)  //take an orders which was activated 
           {
           for(j=0; j<total; j++)   //another variable j 
     { 
     if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)){ cmd2=OrderType();
     if(cmd2!=OP_BUY && cmd2!=OP_SELL)
           {
            
            OrderPrint();
            
            result=OrderDelete(OrderTicket());  //first pending order become to OP_SELL or OP_BUY, second pending order will be delete
            if(result!=TRUE) Print("LastError = ", GetLastError());
            break;
           }
        }
       }
     }
     }
   }
 

OrdersTotal() non corretto...

Sono stato sorpreso da una sequenza di codice di looping che utilizza OrdersTotal() che non dà risultati corretti (osservato con due diversi broker).

Sto usando MT4 versione 1090 su un desktop Linux Ubuntu-MATE 16.04, con WINE 3.0

Ecco cosa ho usato...

for(int cc = 0; cc < OrdersTotal(); cc++)
{
if (!OrderSelect(cc, SELECT_BY_POS, MODE_TRADES) ) continua;
se (OrderSymbol() != Symbol() ) continua;
if (OrderType() > 1) continue; //--ignorare le operazioni in sospeso

OpenTradecnt++; //-conta per ogni posizione live di quel simbolo che esiste
Print("count of the open trades of this symbol is: ", OpenTradecnt);
}

Ho notato con due diversi broker che il valore di OrdersTotal() non sempre concorda con quello che viene mostrato nella scheda 'Trade' del broker MT4. Inizialmente, ho pensato che fosse il broker a causare il non corretto funzionamento di OrdersTotal(). Quando l'ho notato sul secondo broker, ho iniziato a chiedermi se MT4 avesse un 'problema' interno, o se il mio codice fosse sbagliato O se fosse un problema con MT4 che si sincronizza correttamente con il server....?

Dopo aver letto questo thread del forum, mi chiedo se avrei un cambiamento nei risultati per cambiare il ciclo for:

for(int cc = OrdersTotal() - 1; cc >= 0; cc--)
{
...........
}

O, c'è un flag o una linea di codice che assicuri che OrdersTotal() sia correttamente sincronizzato durante un evento OnTick()?

Qualsiasi chiarimento su questo sarebbe molto utile e sarebbe molto apprezzato!

 

Usa il pulsante </> per inserire il tuo codice.


Motivazione: