Est-il possible d'éviter de nombreux "ou" (||) dans les conditions entraînant la même action ? - page 3

 
alsu:
On peut accélérer encore, par exemple si on sait que la condition A est remplie en moyenne plus souvent que C et C plus souvent que B, alors on les met dans cet ordre : if( ! a){if( ! c)if{( ! b) M=false;}}.

On peut encore accélérer les choses en combinant la probabilité de réalisation d'une condition avec sa complexité de calcul : par exemple, en prenant comme critère le produit de la probabilité de réalisation par la valeur inverse du temps de calcul, les premières conditions à vérifier sont celles qui sont les plus probables et qui ont la plus faible complexité de calcul, c'est-à-dire celles qui ont la valeur la plus élevée de notre critère donné.
 
TarasBY:

Vous pouvez également optimiser les calculs de cette manière :

Ou peut-être que vous pourriez essayer de cette façon :

    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;

Merci !

 
alsu:

On peut encore accélérer les choses en combinant la probabilité d'une condition avec sa complexité de calcul : par exemple, en prenant comme critère le produit de la probabilité d'exécution par une valeur inverse du temps de calcul, on vérifie d'abord les conditions qui sont les plus probables et qui ont la plus faible complexité de calcul, c'est-à-dire celles qui ont la valeur la plus élevée de notre critère donné.

Je les ai mis dans cet ordre il y a longtemps. Mais même si plus d'une condition est remplie, la première qui se présente sera remplie.

Cela ne fait aucune différence, car les conditions finales sont alors communes à toutes les variantes.

 
alsu:

On peut encore accélérer les choses en combinant la probabilité d'une condition avec sa complexité de calcul : par exemple, en prenant comme critère le produit de la probabilité d'exécution par la valeur inverse du temps de calcul, on vérifie d'abord les conditions qui sont les plus probables et qui ont la plus faible complexité de calcul, c'est-à-dire celles qui ont la valeur la plus élevée du critère que l'on a fixé.
Alexey, une fois encore, je réponds à votre suggestion de permuter les conditions en fonction de leur influence sur la vitesse des actions. Et voilà ce que j'ai trouvé ! Les calculs les plus complexes ne sont pas aussi lents que les fonctions qui vérifient les diverses données de marché nécessaires et les positions ouvertes pour chaque tick. J'ai déjà simplifié ces fonctions en suivant les conseils de l'un des membres du forum, en supprimant toutes les choses inutiles dans mon cas, ce qui a presque doublé leur vitesse. Quant au choix de travailler sur "chaque" coche, j'étais convaincu auparavant que seul ce mode me rapproche des résultats réels possibles. Ainsi, après avoir implémenté ces fonctions après tous les calculs, les vérifications des indicateurs et des prix actuels, la vitesse a doublé, ce qui fait maintenant 7 minutes de fonctionnement dans le testeur pendant un semestre et 14 minutes par an respectivement. Je ne peux pas renoncer aux fonctions qui effectuent les contrôles nécessaires, si les conditions précédentes le permettent. Maintenant je vais essayer d'optimiser le code en changeant && en ) if (. Je serai heureux de savoir quelles sont les autres possibilités d'optimisation du code. Merci à vous et à tout le monde pour votre aide !
 
borilunad:

Aucun des opérateurs ne convient. Existe-t-il un autre moyen sans if(A || B || C || D || E) Action; ?

Je demande aux modérateurs de ne pas envoyer dans le fil des questions générales en raison de l'importance de la question à laquelle je réfléchis et ne trouve pas de solution plus rationnelle ! Merci !


if(A || B || C || D || E) Action ; je ferais ceciif((A + B + C + D + E) > 0) Action ; sil'Action a besoin d'au moins 3 signaux, écrivez 2 au lieu de 0

la vitesse, je ne l'ai pas mesurée.

 
pako:


if(A || B || C || D || E) Action ; je ferais ceciif((A + B + C + D + E) > 0) Action ; sil'Action a besoin d'au moins 3 signaux, écrivez 2 au lieu de 0

vitesse, je n'ai pas mesuré


La vitesse serait énorme. La solution est très originale
 
Si A,B,C,D sont des fonctions, vous devez compter par ordre de complexité, en commençant par la plus facile et en vérifiant constamment la vérité. Cela fonctionnera plus rapidement.
 
Vinin:

L'accélération sera énorme. La solution est très originale.
Juste à l'intérieur ! Merci, Pako ! Merci, Victor ! Je vais déjeuner maintenant et faire un essai !
 
FION:
Si A,B,C,D sont des fonctions, il faut compter par complexité, en commençant par la plus facile, et vérifier constamment la vérité. Ça ira plus vite comme ça.

Merci de votre participation ! A, B, C ... ne sont pas des fonctions, mais des conditions contenant des fonctions et ne contenant pas de fonctions, et de plus elles s'excluent mutuellement ! Et une condition suffit pour passer à d'autres conditions qui déclenchent déjà une action. S'il n'y avait que des fonctions, il n'y aurait pas de problème :

double A = function1(); double B = function2() ; double C = function3() ; double D = function4() ; double E = function5() ; et ensuite, comme le suggère Pako :

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

{autre condition avec direction miroir pour fermer les Byes ou Sells} action;MAIS:

Et j'ai besoin de A = condition1, B = condition2, C = condition3, D = condition4, E = condition5. Est-ce possible ou non ? Ou bien c'est impossible et c'est tout !

Par exemple :

bool a = true;

//или
double a;

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

Je ne sais pas quoi essayer !

 
borilunad:

Et j'ai besoin de A = condition1, B = condition2, C = condition3, D = condition4, E = condition5. C'est possible ou pas ? ! Ou bien c'est impossible et c'est tout !

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;