Questions sur la POO dans MQL5 - page 29

 
Dmitry Fedoseev:

Oui, voici une autre question qui revient sans cesse et qui n'a pas de réponse claire. Lorsque vous devez hériter de votre propre classe, qu'est-ce qui est le mieux à faire, en hériter ou écrire une nouvelle version étendue de votre classe.

Tout dépend de l'idée générale que l'on se fait de ce que l'on veut au bout du compte.

si vous prévoyez d'utiliser la classe ailleurs, vous devez la rendre complète sans héritage.

dans mon exemple, la classe CError peut obtenir GetLastError(), se désinscrire avec une description et retourner la valeur (int) de l'erreur. je compte l'utiliser partout, de toute façon, il n'y a qu'un constructeur qui définit la langue dans une variable statique et le cas qui retourne le texte de l'erreur

Mais il y a une autre méthode utile - bool ServerDisable() ; - elle définit la disponibilité du serveur (code MT4/МТ5 multiplateforme), très bonne fonction, elle semble être nécessaire quelque part ailleurs dans le code, mais j'ai pensé que je l'utiliserai quand même pour les opérations commerciales - je l'ai mise dans la classe COrder

.....

et si je veux l'utiliser pour le suivi ? .... - beaucoup d'espace pour l'imagination, mais en fin de compte, il sera utilisé comme un objet dans COrder - où pourrait-il être utilisé autrement ?


imho, tout semble lourd, il est plus facile d'inclure la bibliothèque de fonctions de service avec le linker, et le compilateur n'inclura pas de lui-même les parties inutilisées dans l'exécutable

la classe entière serait assez compacte dans le style procédural, je vous ai montré un exemple pour une fonction pour ouvrir un ordre qui peut stocker dans des constantes statiques le volume de l'ordrehttps://www.mql5.com/ru/forum/85652/page17#comment_12805083

 
Dmitry Fedoseev:

Est-il vraiment important de rester dans les limites ? S'il est important de rester dans les limites, vous pouvez également écrire des fonctions.

Je répondais dans le contexte de votre message selon lequel si vous n'utilisez pas de classes, vous devrez vous embêter avec des signatures d'appel peu pratiques. J'ai montré que vous n'avez pas à vous embêter.

 
Alexey Navoykov:
Qu'est-ce qui m'empêche d'envoyer le nom du symbole au constructeur, rendant ainsi la classe flexible et polyvalente ? Vous n'envisagez pas, par principe, la possibilité de faire du trading de portefeuille ?

en considérant tout,

Mais jusqu'à présent, je me suis contenté de faire des recherches - maintenant, je suis presque prêt à faire des recherches sur les 1000 et 1 façons de MM et toutes sortes d'astuces avec les systèmes d'ordre ;))).

Mais je pense toujours que ce ne serait pas trop flexible au final, j'ai déjà écrit 2 fois plus haut qu'un style procédural + de petites classes avec des fonctions bien réglées de traitement des commandes serait mieux.

je vais passer à l'essai de mes idées pour l'instant et ensuite je verrai ce que je modifie souvent dans le code et ce que je laisse inchangé

 
Igor Makanu:

.....

Et si je veux l'utiliser pour le suivi ? .... Il y a plus de place pour l'imagination, mais en fin de compte, il sera toujours utilisé comme un objet dans le COrder - où pourrait-il être utilisé autrement ?


Les barres de suivi sont distinctes car elles n'ont rien à voir avec la logique principale. Ils peuvent exister ou ne pas exister du tout.

***

Les barres de guidage et autres fonctions de maintenance similaires doivent être considérées comme des descendants d'une classe, et leurs instances doivent être créées dans un tableau. Si une fonction est activée, une instance est ajoutée au tableau et exécutée. Si toutes les fonctions sont désactivées, le tableau est vide et les ifs inutiles ne sont pas exécutés. Vous pouvez insérer au moins 100 barres de suivi dans l'EA, et cela n'affectera pas la vitesse de son exécution.

 
Alexey Navoykov:
Ce n'est pas comme ça qu'il faut faire. Vous devez au moins appeler à la fois Bid() et Ask(). Votre code ressemble à une simple variable, faisant croire que sa valeur reste inchangée, alors qu'en réalité il n'en est rien.

hélas, cela a toujours été fait de cette façon, dans MT4 c'est toujours Bid et Ask et aucun caprice du Créateur ne vient gâcher cette utilisation simple et obtenir les prix actuels ;)

fxsaber:

J'ai le schéma suivant où je n'ai rencontré aucun problème.

  1. J'écris TC seulement pour Testeur. Pas de journaux, de gestionnaires d'erreurs et autres. Le code est très concis, compréhensible et se prête à des modifications, si elles sont effectuées par le biais de la POO (mais ce n'est pas crucial). J'ai déjà posté l'exemple dans KB. Le bonus est l'optimisation rapide.
  2. L'essentiel est qu'il soit disponible pour le testeur et dans des blocs indépendants. La génération de signaux de trading - un bloc. Le commerce des signaux - un autre bloc.
  3. Le transfert vers le compte réel se fait toujours en plusieurs fois. Le TS est placé dans un environnement virtuel sans aucune modification du code. Plusieurs TS peuvent être placés dans un seul environnement ou chaque TS dans son propre environnement, alors la POO devient particulièrement pratique. Ensuite, nous prenons un copieur (le marché en est rempli, les gens sont donc doués pour la logique du copieur), qui copie simplement les transactions/commandes de l'environnement virtuel à l'environnement réel.
  4. Avec ce système, la rédaction de TS est rapide et facile. Le transfert vers le réel (qui est vraiment rare) se fait toujours de manière uniforme, rapide et claire.

s'agit-il de ce code ?https://www.mql5.com/ru/code/22770

j'aime beaucoup l'implémentation. vraiment bien pour le testeur et l'optimiseur, je vais probablement l'utiliser comme base, le code est court et lisible, pour être honnête je suis surpris de lire votre code, vous avez un style d'écriture beaucoup plus sophistiqué, j'ai l'habitude de faire du plug and play, je sais que je ne peux pas comprendre la logique

 
Igor Makanu:

hélas, il en a toujours été ainsi, dans MT4 cela reste Bid et Ask et aucun caprice de créateur ne vient détruire cette utilisation simple et obtenir les prix actuels ;)

Mais leurs valeurs sont invariables dans le traitement de l'événement en cours (à moins que vous n'appeliez RefreshRates de force bien sûr). Ce sont donc des variables, pas des fonctions. Et vos fonctions ressemblent à des variables

 

Donnez aux FP une tâche réelle de gestion et de traitement de tableaux de centaines de mégaoctets ou de gigaoctets de données et tout leur modèle de message de conte de fées (les données sont immuables) s'envolera.

Ce sont des théoriciens, juste à temps pour s'affranchir des tâches du monde réel et diffuser dans leur univers fictif :) les histoires de télécoms sont des passes de données débiles.

En fait, la seule chance de lutter contre la complexité est de l'emballer dans des objets.
 
Alexey Navoykov:

Mais leurs valeurs restent inchangées dans le traitement de l'événement en cours (sauf si vous appelez RefreshRates de force). Ce sont donc des variables, et non des fonctions. Et vos fonctions ressemblent à des variables

Je ne sais même pas comment expliquer le problème évoqué dans votre exemple, je vais essayer de l'expliquer humainement - pour moi, qui ai eu le premier PC Pentium-90, il est pénible de voir que pour obtenir une utilisation pratique, il faut un appel de fonction supplémentaire, ce qui implique de mettre les valeurs des registres sur la pile et ... voilà...

Je sais que maintenant tout est mis en cache de manière répétée au niveau du processeur, et je soupçonne les développeurs de compilateurs de rendre plus efficace le "appel de fonction à partir d'un appel de fonction".

alors votre exemple devrait ressembler à ceci :

#define  Ask(dummy) SymbolInfoDouble(_Symbol,SYMBOL_ASK)
#define  Bid(dummy) SymbolInfoDouble(_Symbol,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask());
   Print("Bid = ",Bid());
  }

Ou comme ça :

#define  Ask(symbol_) SymbolInfoDouble(symbol_,SYMBOL_ASK)
#define  Bid(symbol_) SymbolInfoDouble(symbol_,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask(_Symbol));
   Print("Bid = ",Bid(_Symbol));
  }
 
Dmitry Fedoseev:

Vasiliy, cet article vous serait très utile - pour ne pas vous torturer en extrayant la POO pour le plaisir de la POO.

J'ai une idée de cadre fonctionnel pour MT. Il n'y aura pratiquement pas d'opérations hors site. Uniquement les fonctions, les "monades" et autres pseudo-fonctionnalités FP. J'écris tout entre guillemets, puisqu'il est impossible de faire des FP à part entière dans MQL.

 
Dmitry Fedoseev:

Les commentaires sont inutiles.

vous ne vous aimez pas tant que ça, ou alors c'est le contraire de 2 gays qui cherchent une porte de sortie pour eux-mêmes)

j'ai aimé vos articles d'ailleurs, les experts sont nuls, faibles, mais je l'aime tout autant,

et je ne suis pas gay.

Raison: