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

 

Quelle nuit fructueuse j'ai passée ce soir ! J'ai reçu tellement de choses intéressantes pendant que je dormais, et j'en suis éternellement reconnaissant ! Et vos matins étaient plus sages que les soirs aussi !

Un rapide coup d'œil à toutes les suggestions soulève toujours des questions, comme toujours, mais pour l'instant je veux juste savoir s'il est possible de faire la dernière expression avec une seule Action(), car elle est assez étendue :

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


Il me semble que ça pourrait être plus rapide. Certes, cela n'empêche pas de vérifier toutes les conditions si seule la dernière est exécutée, ou alors je me trompe, ce qui serait mieux pour moi.

Qu'en pensez-vous ?

 
FAQ:
Ceux qui n'aiment pas "putain de MQL4" pourraient aussi bien aller courir, courir. Parce que ce qu'il fait ici n'est pas clair, malgré tous les mérites et l'ancienneté du compte.
Veuillez l'expliquer aux non-initiés !
 
Meat:
En général, l'option la plus rapide serait celle-ci :

Cependant, la ligneresult=false devrait être combinée avec la première,elle n'affectera pas la vitesse.En général, si A, B, C et D contiennent des conditions simples (avec un minimum d'arithmétique, sans appels de toutes les fonctions mathématiques et autres), alors vous n'obtiendrez pas beaucoup de gain de performance d'une telle optimisation (sauf si cette construction s'exécute des dizaines de millions de fois, bien sûr). Mais la surcharge de code peut être significative.

J'ai écrit à ce sujet dans l'un des fils de discussion que tout doit être traité rationnellement. Pour une raison quelconque, il me semble que votre code est plein d'endroits plus importants dont l'optimisation donnerait vraiment un gain de performance énorme. Vous devriez commencer par l'algorithme de base. La plupart des débutants ont une vérification stupide de toutes les conditions concernant les TS ou les ordres ouverts à chaque tick. Mais dans la plupart des cas, il suffit de vérifier uniquement les conditions limites, par exemple lorsque la hausse ou la baisse atteint une certaine valeur, ou lorsqu'une nouvelle barre apparaît. Ce n'est qu'après cela que vous pouvez effectuer d'autres vérifications.

En dehors des calculs gourmands en ressources, vous devez envisager de transférer ces calculs dans une DLL. Sinon, rester assis et attendre pendant 13 minutes dans ce putain de MQL4 (alors que vous pouvez obtenir le même résultat en 2-3 minutes) semble être malheureux :)


bien que je sois absolument d'accord avec la première partie.
 
icas:

C'est encore plus rapide comme ça.

Un conte me vient à l'esprit :

"Il y avait deux questions lors d'une réunion du conseil d'administration d'une entreprise :

1. La décision de construire le synchrophasotron.

2. La décision de construire un parking à vélos pour les employés.

Sur la première question, la discussion a duré 1 minute,

le 2, le débat a duré plus de 2 heures".

Ouais, c'est ça... A propos du parc à vélos...
 
borilunad:

Quelle nuit fructueuse j'ai passée ce soir ! J'ai reçu tellement de choses intéressantes pendant que je dormais, et j'en suis éternellement reconnaissant ! Et vos matins étaient plus sages que les soirs aussi !

Un rapide coup d'œil à toutes les suggestions soulève toujours des questions, comme toujours, mais pour l'instant je veux juste savoir s'il est possible de faire la dernière expression avec une seule Action(), car elle est assez étendue :

Il me semble que ça pourrait être plus rapide. Certes, cela n'empêche pas de vérifier toutes les conditions si seule la dernière est exécutée, ou alors je me trompe, ce qui serait mieux pour moi.

Qu'en pensez-vous ?

Nah, ça ne marche pas comme ça. Tout d'abord, il doit y avoir quelque chose après if(), au moins un simple point-virgule (c'est-à-dire un opérateur vide). Deuxièmement, à laquelle des "si" votre autre opérateur est-il censé appartenir ? S'il s'agit uniquement de la dernière (comme vous l'avez écrit), alors l'action ne sera exécutée que si la condition D est vraie, à condition que A, B et C soient fausses. Il est toujours conseillé de placer des accolades pour que la logique soit claire.

 
FAQ:

Merci ! Pour l'instant, j'évite l'utilisation de DLL et d'autres trucs pro-MCLogo.

Je profite de l'occasion pour répondre à Alexey (Meat) que toutes les ouvertures de position se font sur une nouvelle barre, bien que sur M1, mais tout le reste fonctionne sur chaque tick. J'utilise également beaucoup de fonctions nécessaires (si je vérifiais tout au démarrage à chaque fois, alors le code serait vraiment lourd). Il y a même un MathPow(), que je vais essayer de remplacer par l'exposant suggéré par Mathematician. Pour le reste, tous les dépassements nécessaires pour les modifications et les fermetures. Comment s'en passer ?

 
Faites attention au suivi et au recalcul des ordres. C'est ce que les conseillers font généralement le plus.
 
alsu:

Non, ça ne marche pas comme ça. Premièrement, il doit y avoir quelque chose après if(), au moins un simple point-virgule (c'est-à-dire un opérateur vide). Deuxièmement, à quel "si" votre autre opérateur est-il censé appartenir ? S'il ne s'agit que de la dernière (comme vous l'avez écrit), alors l'action ne sera exécutée que si la condition D est vraie, à condition que A, B et C soient fausses. Il est toujours souhaitable de placer des accolades pour voir clairement la logique.

Merci ! Mais j'ai besoin d'une seule Action() ; mais je ne sais pas comment faire ! Pouvez-vous me donner un indice ?

 
FAQ:
Faites attention au contrôle et au recalcul des ordres. C'est ce que les conseillers font généralement le plus.
Mais ils sont inévitables, sinon il y aura des erreurs !
 

Dans mes programmes, s'il y a beaucoup de ifs, j'utilise cette construction, en mettant des conditions qui donneront le plus souvent faux en premier lieu :

if (A>B)
{  if (C>=10)
   {  if (D<=5)
      {  if(E=1)
         Action:
      }
   }
}
Et s'il est nécessaire de vérifier un grand nombre de "si", alors c'est comme ceci
if (A>B || N<M)
{  if (C>=10 || P<100)
   {  if (D<=5 || R>1)
      {  if(E=1 || S!=0)
         Action:
      }
   }
}