Loop e chiusura o cancellazione di ordini - pagina 2

 

Cosa succede se OrderSelect non riesce a selezionare l'ordine?
La condizione OrderMagicNumber==MagicNo non sarebbe mai vera. Quindi non c'è bisogno di controllare il risultato di OrderSelect e continuare se non è valido.

È meglio se si vuole controllare OrderSelect per diminuire la variabile del ciclo. Esempio:

for(PositionIndex = 0; PositionIndex < OrdersTotal() ; PositionIndex ++)  
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }
 
  1. Se orderSelect fallisce, potresti ottenere il numero magico dell'ultimo ordine selezionato o qualcosa rimasto in memoria e che potrebbe corrispondere. Controllate sempre.
  2. Dovete SEMPRE fare il conto alla rovescia. Supponiamo che mentre stavate lavorando sulla posizione 3 la posizione 0 si sia chiusa. Il prossimo ordine su cui volevate lavorare era la posizione 4 ma sarà alla posizione 3 quando farete il loop e incrementerete positionIndex a 4. Ora ne avete perso uno. Facendo il conto alla rovescia potresti elaborare lo stesso ordine una seconda volta ma non ne perderai nessuno.
 
WHRoeder:
  1. Se orderSelect fallisce, potresti ottenere il numero magico dell'ultimo ordine selezionato o qualcosa rimasto in memoria e che potrebbe corrispondere. Controlla sempre.
  2. Devi SEMPRE fare il conto alla rovescia. Supponiamo che mentre stavi lavorando sulla posizione 3 la posizione 0 si sia chiusa. L'ordine successivo su cui volevi lavorare era la posizione 4 ma sarà alla posizione 3 quando farai il loop e incrementerai positionIndex a 4. Ora ne hai perso uno. Facendo il conto alla rovescia potresti elaborare lo stesso ordine una seconda volta ma non ne perderai nessuno.

1- Chi te l'ha detto? E di quale memoria parli?


2- Non ho menzionato il conteggio verso il basso o verso l'alto. il codice fornito di per sé non è un conteggio verso il basso.

 
  1. OrderMagicNumber() e gli altri restituiscono SEMPRE qualcosa. Se OrderSelect() fallisce, si ottiene spazzatura casuale, residui, forse dalla precedente selezione riuscita, forse per il valore dell'ultimo ordine chiuso, forse per quello che è in un registro. Avete mai provato a dereferenziare un puntatore su un oggetto cancellato? La memoria, è il piccolo chip nero sul circuito. Provate questo
    int start(){    Print(Whatever()); }
    double Whatever(){
       for(i=0; i<10; i++) double tmp=Close[i];
       // no value returned
    }
    e pubblica qualche risultato.
  2. So che "il codice fornito in sé non fa il conto alla rovescia". Questo è il problema. Conta sempre alla rovescia! Il tuo decremento NON FUNZIONA ed è un potenziale ciclo infinito.
    if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }

 

C'è una ragione specifica per cui hai codificato :

if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;

invece di (?)

if( OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) )
{
  // statements if true
}

So che è considerato un no-no da alcuni standard di codifica. Dà una performance migliore o è solo una preferenza?

 
burgie:

C'è una ragione specifica per cui hai codificato :

invece di (?)

So che è considerato un no-no da alcuni standard di codifica. Dà una performance migliore o è solo una preferenza?

Nessuna ragione specifica che io ricordi... non so davvero quale sia la cosa più logica da fare, perché OrderSelect() dovrebbe mai fallire e se fallisce cosa si dovrebbe fare?
 
burgie:

C'è una ragione specifica per cui hai codificato :

invece di (?)

So che è considerato un no-no da alcuni standard di codifica. Dà una performance migliore o è solo una preferenza?


All'interno di un ciclo, questo è esattamente lo stesso, scegliete quello che preferite.
 
burgie:

C'è una ragione specifica per cui hai codificato :

invece di (?)

So che è considerato un no-no da alcuni standard di codifica. Dà una performance migliore o è solo una preferenza?

 

se(orderselect(......)) esegue questo //---non si torna indietro

if(!orderselect(.......))continuare //tornare indietro e controllare

 
MirTD:

se(orderselect(......)) esegue questo //---non si torna indietro

if(!orderselect(.......))continuare //tornare indietro e controllare

Ho già risposto alla domanda che mi è stata fatta sulla mia codifica . . .