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

 
alsu:
Possiamo accelerare ulteriormente, per esempio se sappiamo che la condizione A è soddisfatta in media più spesso di C e C più spesso di B, allora mettiamole in questo ordine: if(!a){if(!c)if{(!b) M=falso;}}

Si possono accelerare ancora di più le cose combinando la probabilità che una condizione si verifichi con la sua complessità computazionale: per esempio, prendendo come criterio il prodotto della probabilità di verificarsi per il valore inverso del tempo di calcolo, le prime condizioni da controllare sono quelle che sono le più probabili e hanno la minore complessità computazionale, cioè quelle che hanno il valore più alto del nostro criterio dato.
 
TarasBY:

Si possono anche ottimizzare i calcoli in questo modo:

O forse potresti provare in questo modo:

    bool M = false;

    if (A) M = true; else if (B) M = true; else if (C) M = true; else if (D) M = true; else if (E) M = true;
    if (M == true) Action;

Grazie!

 
alsu:

È possibile accelerare ulteriormente le cose combinando la probabilità di una condizione con la sua complessità computazionale: per esempio, prendendo come criterio il prodotto della probabilità di esecuzione per un valore inverso al tempo di calcolo, controllare prima le condizioni che sono più probabili e hanno la complessità computazionale più bassa, cioè quelle che hanno il valore più alto del nostro criterio dato.

Li ho messi in questo ordine molto tempo fa. Ma anche se più di una condizione è soddisfatta, la prima che viene fuori sarà soddisfatta.

Non fa differenza, perché allora le condizioni finali sono comuni a tutte le varianti.

 
alsu:

Potete accelerare ancora di più le cose combinando la probabilità di una condizione con la sua complessità computazionale: per esempio, prendendo come criterio il prodotto della probabilità di esecuzione per il valore inverso del tempo di calcolo, controllate prima le condizioni che sono più probabili e hanno la complessità computazionale più bassa, cioè quelle che hanno il valore più alto del criterio che abbiamo impostato.
Alexey, ancora una volta rispondo al tuo suggerimento di scambiare le condizioni a seconda della loro influenza sulla velocità delle azioni. Ed ecco cosa ho trovato! I calcoli più complessi non sono così lenti come le funzioni che controllano vari dati di mercato necessari e le posizioni aperte per ogni tick. Ho già semplificato abbastanza queste funzioni su consiglio di uno dei membri del forum, buttando fuori tutte le cose inutili nel mio caso, il che ha quasi raddoppiato la loro velocità. Per quanto riguarda la scelta di lavorare su "ogni" tick, ero convinto prima che solo questa modalità mi porta più vicino ai reali risultati possibili. Così, avendo implementato queste funzioni dopo tutti i calcoli, i controlli degli indicatori e i controlli dei prezzi attuali, la velocità è raddoppiata, il che fa ora 7 minuti di funzionamento nel tester durante mezzo anno e 14 minuti all'anno rispettivamente. Non posso rinunciare a funzioni che eseguono i controlli necessari, se le condizioni precedenti lo permettono. Ora cercherò di ottimizzare il codice cambiando && in ) if (. Sarò lieto di sapere quali altre possibilità di ottimizzazione del codice ci sono. Grazie a voi e a tutti per il vostro aiuto!
 
borilunad:

Nessuno degli operatori si adatta. C'è un altro modo senza if(A || B || C || D || E) Azione;?

Chiedo ai moderatori di non inviare al thread delle domande generali a causa dell'importanza della domanda a cui sto pensando e non riesco a trovare una soluzione più razionale! Grazie!


if(A || B || C || D || E) Azione; io farei cosìif((A + B + C + D + E) > 0) Azione; se l'azione ha bisogno di almeno 3 segnali, scrivere 2 invece di 0

la velocità, non l'ho misurata.

 
pako:


if(A || B || C || D || E) Azione; io farei cosìif((A + B + C + D + E) > 0) Azione; se l'azione ha bisogno di almeno 3 segnali, scrivere 2 invece di 0

velocità, non ho misurato


La velocità sarebbe enorme. La soluzione è molto originale
 
Se A,B,C,D sono funzioni, dovresti contare in ordine di complessità, iniziando dalla più facile e controllando costantemente la verità. Questo funzionerà più velocemente.
 
Vinin:

L'accelerazione sarà enorme. La soluzione è molto originale.
Appena arrivato! Grazie, Pako! Grazie, Victor! Ora vado a pranzo e ci provo!
 
FION:
Se A,B,C,D sono funzioni, bisogna contare per complessità, cominciando dalla più facile, e controllare costantemente la verità. Funzionerà più velocemente in questo modo.

Grazie per la vostra partecipazione! A, B, C ... non sono funzioni, ma condizioni che contengono funzioni e non contengono funzioni, e inoltre si escludono a vicenda! E una condizione è sufficiente per saltare ad altre condizioni che già innescano l'azione. Se ci fossero solo funzioni, allora non ci sarebbe un problema:

doppio A = funzione1(); doppio B = funzione2(); doppio C = funzione3(); doppio D = funzione4(); doppio E = funzione5(); e poi come suggerito da Pako:

se((A + B + C + D + E) > 0)

{altra condizione con direzione speculare per chiudere l'azione Byes o Sells};MA:

E ho bisogno di A = condizione1, B = condizione2, C = condizione3, D = condizione4, E = condizione5. È possibile o no! O è impossibile e basta!

Per esempio:

bool a = true;

//или
double a;

а = (isCloseLastPosByTake() == True && Profit > ProClo / clo - GetProfitCloseLastPosByTake() * clo);

Non so cosa provare!

 
borilunad:

E ho bisogno di A = condizione1, B = condizione2, C = condizione3, D = condizione4, E = condizione5. È possibile o no?! O è impossibile e basta!

bool a = true;

//или
double a;

а = (isCloseLastPosByTake() == True && Profit > ProClo / clo - GetProfitCloseLastPosByTake() * clo); <---   10,444 = 8,087 > 3,908 эт на каком языке? 

bool a = false;

if (isCloseLastPosByTake() == True && Profit > ProClo / (clo - GetProfitCloseLastPosByTake() * clo)) a = true;