Branchement conditionnel - 'GoTo' Kluge ? - page 3

 
FourX:

D'après ce que j'ai pu comprendre jusqu'à présent Raptor, il n'y a rien comme les commandes GoSub / Return ou la possibilité de créer une telle fonction dans MQL4. D'où ma tentative de trouver une fonction dans MQL4 pour réaliser cette capacité.

Une fonction fait la même chose que GOSUB/RETURN . . .

start()
  {
  Print("About to call a function called, a_function . . .");
  a_function();                                               //  GOSUB
  Print("Just returned from a function called, a_function");
  return(0);
  } 
   
   
   
void a_function()
   {
   Print("a_function has been called . . . ");
   return;                                          // RETURN
   }
   
   
   
 
RaptorUK:

Une fonction fait la même chose que GOSUB/RETURN....

Je reconnais que d'innombrables fonctions standard et personnalisées peuvent être "appelées" et utilisées à n'importe quel endroit (approprié) Raptor, mais il n'y a rien dans MQL4 comme un GoSub et/ou GoTo à un endroit spécifique dans le programme comme GoTo Ligne 185 ou une étiquette/fonction spécifique etc, comme vous l'avez décrit vous-même. Il suffit ensuite de l'exécuter et de revenir à l'endroit du programme d'où il a été appelé, ou peut-être de continuer à partir de cette sous-routine et/ou section de programme/fonction appelée, en fonction du résultat conditionnel de cette sous-routine. Comme vous l'avez déclaré, vous avez utilisé GoSub vous-même pendant des années et faire un saut conditionnel au-delà de quelques lignes de code séquentielles n'est pas du tout la même chose. Je ne veux pas continuer à débattre de cette distinction que nous connaissons déjà et qui ne remplit pas du tout la même fonction. D'où ce post. Nous n'avons toujours pas compris comment utiliser un véritable "GoSub" qui, par exemple, peut sauter à un endroit antérieur du programme et réutiliser la même fonction nécessaire déjà établie dans le programme plutôt que d'avoir à la coder de manière répétée chaque fois qu'elle est nécessaire.

Pour votre information : Le MetaEditor plante environ 85% des fois où je copie du texte. Ceci sur de nombreuses instances différentes de MT4, sur de nombreux ordinateurs différents et sur 3 versions différentes de Windows. Sans compter les systèmes 32 et 64 bits sur lesquels j'ai utilisé MQL4. MT4 est bien, l'éditeur MQL4 ne l'est pas. Le copier-coller n'est donc pas vraiment une option viable pour moi. Même si c'est le cas, cela n'offre toujours pas les mêmes capacités qu'un 'GoSub' ou un 'GoTo'.

 

Y a-t-il vraiment un intérêt à cela ? C'est un fait que mql4 est mql4, donc quand vous codez en mql4, vous devez penser mql4 ; il est inutile d'essayer de coder dans un langage en considérant comment vous l'auriez résolu dans un autre qui supporte des constructions différentes. Si vous avez un problème de codage en mql4 qui, selon vous, ne peut être résolu que par l'utilisation de GoSub/Return et de GoTo, j'aimerais le voir, car je pense que vous découvrirez qu'il y a toujours plus d'une façon d'écorcher un chat.

 

FourX:

Même si c'est le cas, cela n'offre toujours pas les mêmes capacités qu'un 'GoSub' ou un 'GoTo'.

Je suis désolé, j'ai vraiment du mal à comprendre votre point de vue selon lequel une fonction MQL4 et un GOSUB sont différents en quoi que ce soit. (Goto est une toute autre paire de manches).

Restons-en à cette histoire de Gosub. Une fonction MQL4 est une sous-routine. Elle peut ou non retourner une valeur. Tous les appels de sous-routine retournent à la ligne suivante dans le code principal d'où ils ont été appelés. Je suis 100% d'accord avec Raptor sur ce point.

(Je suis également d'accord avec le point de vue de SDC ci-dessus).

 

Le but de ce fil de discussion est de voir s'il est possible de faire des branchements conditionnels n'importe où dans le programme, ou même en externe à partir d'autres programmes, pour réutiliser les modules/fonctions du programme de manière répétée, comme cela est prévu dans d'autres environnements tels que ceux mentionnés au début : fGoTo, fGoSub. Je sais déjà que MQL4 ne prévoit pas directement ces fonctions. C'est le but de ce fil de discussion : est-il possible de créer une "solution de contournement (sous-programme ?)", etc. pour réaliser cette fonctionnalité ? D'un point de vue conceptuel, cela présente également des similitudes avec les fichiers 'include' de MQL4.

Similaire à la solution de contournement que nous utilisons tous pour compenser les capacités limitées du débogueur MQL4 en "alertant" ou "imprimant" les valeurs de la fonction GetLastError().

Cela n'a rien à voir avec les fonctions MQL4 normales qui contiennent un certain nombre de booléens conditionnels tels que if, while, loop, continue, return, etc. qui peuvent sauter en avant ou revenir en arrière dans la fonction. La solution que je cherche à fournir pour les capacités telles que les exemples donnés dans d'autres environnements où l'on peut réutiliser n'importe quel module de programmation / fonction à plusieurs reprises, souvent à partir de (beaucoup) plus tôt dans le programme. Déclarez-la une fois : utilisez-la plusieurs fois, pour la plupart des cas, n'importe où dans le programme où l'on a besoin de la fonctionnalité a déjà été prévue. Dans certains environnements, le fGoSub permet aux utilisateurs d'importer et d'utiliser d'autres fSubRoutines, souvent à partir de petits programmes séparés qui sont des modules exécutant une fonction spécifique. Peut-être un peu similaire aux fichiers 'Include' de MQL4.

Ce n'est pas parce qu'elle n'existe pas actuellement que nous ne devrions pas utiliser cette puissante fonctionnalité de programmation si nous pouvons créer une solution de contournement ?

Comme nous le savons tous, il existe de nombreuses façons de programmer quelque chose pour obtenir le même résultat. Il ne s'agit pas d'un cas de "Montrez-moi votre problème et je vous dirai comment le résoudre sans fGoTo ni fGoSub". C'est un cas de : SI nous pouvons créer la fonctionnalité, nous disposons alors d'une flexibilité et d'une capacité de programmation supplémentaires que nous pouvons utiliser de nombreuses manières différentes dans de nombreuses situations différentes.

 

Je ne pense pas que vous compreniez ce qu'est une fonction personnalisée dans mql4... peut-être pouvez-vous donner un exemple de pourquoi une fonction personnalisée mql4 ne fait pas exactement ce que vous décrivez ? Je pense que c'est le cas... J'ai beaucoup de fonctions que je réutilise dans beaucoup d'autres EAs, Indicateurs et Scripts.

Pensez à start() comme le programme. . à partir de n'importe où dans start je peux appeler une fonction personnalisée . . . lorsque la fonction est terminée le programme retourne à la ligne après la ligne où la fonction personnalisée a été appelée . . . tout comme un GOSUB.

 

FourX:

Le but de ce fil de discussion est de voir s'il est possible de faire un branchement conditionnel vers N'IMPORTE OÙ dans le programme, ou même en dehors d'autres programmes, pour réutiliser des modules/fonctions de programme de manière répétée comme cela est prévu dans d'autres environnements tels que ceux mentionnés au début : fGoTo, fGoSub.

Je cherche à fournir des capacités telles que les exemples donnés dans d'autres environnements où l'on peut réutiliser n'importe quel module de programmation / fonction de manière répétée, souvent à partir de (beaucoup) plus tôt dans le programme.

Mql4 est un langage de style ancien, son niveau est d'environ 1990. Mais vos goto et gosub sont des constructions encore plus anciennes, datant d'environ 1970. Quel est l'intérêt de rendre votre style de programmation plus ancien que le MQL4 ? Il vaut mieux utiliser un vrai langage de programmation, comme C#, par le biais de dll-s. La plupart des inventions des années 1990 et 2000 (comme les classes, les interfaces, les objets, les modèles de conception comme les événements et les écouteurs, les méthodes de programmation comme la programmation pilotée par les tests, etc.) ont pour but d'éviter la répétition du code et de vous aider à écrire rapidement des codes réutilisables, fiables et lisibles. Je pense que vous devriez oublier tout ce projet goto.
 
FourX:

Je reconnais que d'innombrables fonctions standard et personnalisées peuvent être "appelées" et utilisées à n'importe quel endroit (approprié) Raptor, mais il n'y a rien dans MQL4 comme un GoSub et/ou un GoTo à un endroit spécifique dans le programme, comme un GoTo à la ligne 185 ou une étiquette/fonction spécifique, etc. Ensuite, exécutez-la et retournez à l'endroit du programme d'où elle a été appelée ;

le retour à l'intérieur d'une fonction la fera revenir à l'endroit d'où elle a été appelée. C'est un substitut à 100% de l'ancien gosub/return. De plus, la fonction permet de passer des valeurs et de retourner des valeurs, elle a même son propre espace de noms et son propre cadre de pile, ce qui fait qu'il n'y a plus besoin de variables globales. Je ne comprends vraiment pas votre problème. Veuillez fournir un exemple concret (peut-être en pseudo-code ou en BASIC) de ce que vous voulez réellement faire et nous pourrions vous montrer comment le même exemple pourrait être réalisé de manière beaucoup plus claire et réutilisable et maintenable avec if/else, switch/case et des appels de fonction.

La seule chose qui manque vraiment, ce sont les exceptions. Essayez-vous de simuler des exceptions ? Vous ne pouvez pas non plus le faire avec GOTO, vous devriez également prendre soin de la pile d'appel (et la dérouler) lorsque vous le faites.

Vous pouvez avoir plusieurs déclarations de retour dans la même fonction et vous pouvez également sortir des boucles avec break, c'est ce qui se rapproche le plus d'un GOTO dans un langage structuré et ces choses (sorties multiples) sont déjà désapprouvées par certains puristes stricts.

 
erzo:
Il est bien mieux d'utiliser un vrai langage de programmation, comme C#, à travers des DLL.

C# n'est pas recommandé pour créer des DLL qui interagissent avec cette API de convention d'appel C de bas niveau. Le C# est parfait si vous voulez interagir avec d'autres C# et divers éléments de Microsoft, mais il n'est pas aussi polyvalent que les autres environnements. Il est très spécialisé.

Si vous voulez créer des DLL qui s'interfacent facilement avec les conventions d'appel C dans un langage de programmation moderne, je vous suggère ObjectPascal (Free Pascal) ou Delphi.

 
7bit:

Le langage C# n'est pas recommandé pour la création de DLL qui interagissent avec cette API de convention d'appel C de bas niveau.

Je connais mieux java, et j'ai envisagé de l'utiliser, mais il est difficile de faire un pont. Mais si vous ne recommandez pas C#, que je pensais qu'il serait plus facile, je vais essayer java cependant. (Le Pascal n'est pas mon style.) Merci pour vos conseils !