È possibile evitare molti "o" (||) nelle condizioni che causano la stessa azione? - pagina 7

 

Che notte fruttuosa ho passato stanotte! Ho avuto così tante cose interessanti che mi sono state gettate addosso mentre dormivo, di cui sono eternamente grato! E anche le tue mattine erano più sagge delle serate!

Una rapida occhiata a tutte le cose suggerite solleva ancora domande come sempre, ma per ora voglio solo scoprire se è possibile fare l'ultima espressione con una sola Action(), poiché è abbastanza estesa:

if (!A) if (!B) if (!C) if (!D)
else Action();


Mi sembra che potrebbe essere più veloce. Vero, non preclude il controllo di tutte le condizioni se solo l'ultima viene eseguita, o mi sbaglio, il che sarebbe meglio per me.

Cosa ne pensate?

 
FAQ:
Chi non ama il "fottuto MQL4" potrebbe anche andare a correre, correre. Perché non è chiaro cosa stia facendo qui, nonostante tutti i meriti e l'antichità del racconto.
Per favore, spiegatelo ai non addetti ai lavori!
 
Meat:
In generale, l'opzione più veloce sarebbe questa:

Tuttavia, un'altra linearesult=false dovrebbe essere meglio combinata con la prima, non influenzerà la velocità.In generale, se A, B, C e D contengono condizioni semplici (con un minimo di aritmetica, senza chiamare tutte le funzioni matematiche e altre cose), allora non si otterrà un gran guadagno di prestazioni da tale ottimizzazione (a meno che questa costruzione non venga eseguita decine di milioni di volte, ovviamente). Ma il sovraccarico di codice può essere significativo.

Ho scritto in uno dei thread che tutto deve essere gestito razionalmente. Per qualche motivo, mi sembra che il tuo codice sia pieno di posti più importanti l'ottimizzazione dei quali darebbe davvero un enorme guadagno di prestazioni. Dovresti iniziare con l'algoritmo di base. La maggior parte dei neofiti hanno un controllo stupido di tutte le condizioni riguardanti TS o ordini aperti ad ogni tick. Ma nella maggior parte dei casi, è sufficiente controllare solo le condizioni limite, per esempio quando l'haul o il low raggiunge un certo valore, o quando appare una nuova barra. Solo dopo si possono eseguire ulteriori controlli.

Beh, oltre ai calcoli ad alta intensità di risorse, dovete pensare a spostare questi calcoli in una DLL. Altrimenti, sedersi e aspettare per 13 minuti nel fottuto MQL4 (mentre si può ottenere lo stesso risultato per 2-3 minuti) sembra essere spiacevole :)


anche se sono assolutamente d'accordo con la prima parte.
 
icas:

In questo modo è anche più veloce.

Mi viene in mente un racconto:

"Ci sono state due domande durante una riunione del consiglio di amministrazione di un'azienda:

1. La decisione di costruire il sincrofasotrone.

2. La decisione di costruire un parcheggio per biciclette per i dipendenti.

Sulla prima questione, la discussione è durata 1 minuto,

il 2, il dibattito è durato più di 2 ore".

Sì, giusto... Riguardo al parco biciclette...
 
borilunad:

Che notte fruttuosa ho passato stanotte! Ho avuto così tante cose interessanti che mi sono state gettate addosso mentre dormivo, di cui sono eternamente grato! E anche le tue mattine erano più sagge delle serate!

Una rapida occhiata a tutte le cose suggerite solleva ancora domande come sempre, ma per ora voglio solo scoprire se è possibile fare l'ultima espressione con una sola Action(), poiché è abbastanza estesa:

Mi sembra che potrebbe essere più veloce. Vero, non preclude il controllo di tutte le condizioni se solo l'ultima viene eseguita, o mi sbaglio, il che sarebbe meglio per me.

Cosa ne pensate?

No, non funziona così. In primo luogo, ci deve essere qualcosa dopo if(), almeno un punto e virgola (cioè un operatore vuoto). In secondo luogo, a quale dei se è destinato il vostro altro operatore? Se si riferisce solo all'ultimo (come l'hai scritto tu), allora l'Azione sarà eseguita solo se la condizione D è vera, purché A,B e C siano false. È sempre consigliabile mettere le parentesi graffe per vedere chiaramente la logica.

 
FAQ:

Grazie! Sto evitando l'uso di DLL e altre cose pro-MCLogo per ora.

Ne approfitto per rispondere ad Alexey (Meat) che tutte le aperture di posizione sono fatte su una nuova barra, anche se su M1, ma tutto il resto funziona su ogni tick. Uso anche molte funzioni necessarie (se controllassi tutto all'avvio ogni volta, allora il codice sarebbe davvero pesante). C'è anche una MathPow(), che cercherò di sostituire con l'esponente suggerito da Mathematician. Per il resto, tutti i superamenti necessari per le modifiche e le chiusure. Come farne a meno?

 
Prestare attenzione al monitoraggio e al ricalcolo degli ordini. questo è ciò che i consulenti di solito fanno di più.
 
alsu:

No, non funziona così. Innanzitutto, ci deve essere qualcosa dopo if(), almeno un punto e virgola (cioè un operatore vuoto). In secondo luogo, a quale dei se appartiene il vostro altro operatore? Se si riferisce solo all'ultimo (come l'hai scritto tu), allora l'Azione sarà eseguita solo se la condizione D è vera, purché A,B e C siano false. È sempre auspicabile mettere le parentesi graffe per vedere chiaramente la logica.

Grazie! Ma ho bisogno di una sola Action(); ma non so come! Puoi darmi un suggerimento?

 
FAQ:
Prestare attenzione al controllo e al ricalcolo dell'ordine. questo è ciò che i consulenti di solito fanno di più.
Ma sono inevitabili, altrimenti ci saranno errori!
 

Nei miei programmi, se ci sono molti if, uso questa costruzione, mettendo le condizioni che daranno più spesso false in primo luogo:

if (A>B)
{  if (C>=10)
   {  if (D<=5)
      {  if(E=1)
         Action:
      }
   }
}
E se è necessario controllare molti if, allora è così
if (A>B || N<M)
{  if (C>=10 || P<100)
   {  if (D<=5 || R>1)
      {  if(E=1 || S!=0)
         Action:
      }
   }
}
Motivazione: