Questions sur l'assistant MQL5 et la bibliothèque standard de classes de trading - page 12

 
Reshetov:

Jusqu'à présent, il n'existe qu'une seule solution pour remédier aux inconvénients susmentionnés :

Ouvrir l'accès à la lecture des valeurs retournées par la méthode Direction() du module signal à partir des modules de gestion des positions et de gestion des capitaux et des risques.

Ajoutez une méthode supplémentaire, par exemple, avec l'identifiant double getMainSingnal(), qui fait référence à une instance de la classe du module de signaux et renvoie le résultat de la méthode Direction() du module de signaux. Comme cet échange d'informations se fait en mode lecture seule, la sécurité n'est en aucun cas compromise.

Pour ce faire

  1. Allouer des champs dans les classes CExpertMoney et CExpertTrailing pour stocker une instance de la classe CExpertSignal, c'est-à-dire le module principal des signaux.
  2. Cette même instance de la classe CExpertSignal, c'est-à-dire le module de signal, doit être transmise aux modules de gestion des positions et de gestion de l'argent lors de l'initialisation des instances de ces classes de modules et de son enregistrement dans les champs spécifiés à l'étape 1. Évidemment, avant de faire cela, vous devez vérifier (vous assurer) qu'il existe déjà une instance de la classe du module de signal, c'est-à-dire qu'elle a été créée.
  3. Créez dans les classes CExpertMoney et CExpertTrailing des méthodes supplémentaires, avec l'identifiant double getMainSignal(), qui se réfère à l'instance de classe du module de signaux, stockée dans les champs appropriés de ces classes et renvoie comme résultat, le résultat de la méthode Direction() du module de signaux.

Presque tout est clair. La seule chose que je veux clarifier : "pourquoi ce désir de votre part de voir le signal au niveau MM et au niveau de la queue doit être implémenté au niveau de la classe de base ?

Je ne pense pas que ce soit une bonne chose (c'est-à-dire une mauvaise chose). L'algorithme n'est pas typique (de mon point de vue). Si je comprends bien, vous disposez de vos propres modules MM et trailing (avec leurs propres algorithmes liés au signal).

Ici et mettez en eux correspondant 1.,2.,3.

 
uncleVic:

Presque tout est clair. La seule chose que j'aimerais clarifier est "pourquoi ce désir de votre part de voir le signal au niveau MM et au niveau de la queue devrait être implémenté au niveau de la classe de base ?".

Je ne pense pas que ce soit une bonne chose (c'est-à-dire une mauvaise chose). L'algorithme n'est pas typique (de mon point de vue). Si j'ai bien compris, vous avez vos propres modules de MM et de trailing (avec vos propres algorithmes liés au signal).

Donc, mettez les 1, 2, 3 appropriés.

Le fait est que Master prend la classe SEhregt comme base. Et par conséquent, je ne peux pas surcharger les fonctions nécessaires dans les modules que je crée, parce qu'ils sont déjà incompatibles avec cette classe CEhregt très basique dès le début parce qu'ils n'ont pas accès à une instance de classe de module de signaux.

Parce que l'instance de la classe du module de signal est stockée uniquement dans le champ de la classe SEhregt dans le fichier Expert.mqh, ligne 67

CExpertSignal    *m_signal;                   // trading signals object

et ce champ n'est pas partagé (inaccessible) avec les autres classes et modules créés à partir d'elles.

Pour cette raison, je ne peux pas modifier les classes CExpertMoney et CExpertTrailing pour les rendre compatibles avec l'assistant.

Après tout, si l'accès est refusé dans les classes mères, les descendants ne l'obtiendront en aucun cas.


Aller à la racine (c) "Aphorismes" par Kozma Prutkov

 

J'ai trouvé comment faire passer les signaux de trading du module de signaux aux modules de maintien des positions et de gestion de l'argent et des risques sans passer les instances de CExpertSignal.

Ajoutons deux lignes chacune aux classes CExpertMoney et CExpertTrailing :

  double m_signaldirection; // Direction from signals module
 
  void              setSignalDirection(double value)  { m_signaldirection = value; }
  

Pour le fichier ExpertMoney.mqh :

class CExpertMoney : public CExpertBase
  {
protected:
   //--- Direction from signals module  
   double m_signaldirection;
   //--- input parameters
   double            m_percent;

public:
                     CExpertMoney();
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   //--- methods of setting adjustable parameters
   void              Percent(double percent)    { m_percent=percent; }
   //--- method of verification of settings
   virtual bool      ValidationSettings();
   //---
   virtual double    CheckOpenLong(double price,double sl);
   virtual double    CheckOpenShort(double price,double sl);
   virtual double    CheckReverse(CPositionInfo* position,double sl);
   virtual double    CheckClose(CPositionInfo* position);
  };

Pour le fichier ExpertTrailing.mqh :

class CExpertTrailing : public CExpertBase
  {
protected:
   
    //--- Direction from signals module
   double m_signaldirection;
public:
   //---
   void              setSignalDirection(double value) { m_signaldirection = value; }        
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double& sl,double& tp)  { return(false); }
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double& sl,double& tp) { return(false); }
  };


Ce faisant, nous avons défini les champs et les méthodes nécessaires pour transmettre les signaux de trading. Nous devons maintenant transmettre ces signaux de négociation aux classes du module. Nous le ferons dans Expert.mqh, c'est-à-dire pour la classe CExpert

Nous allons écrire une ligne pour transmettre nos signaux de trading à la classe de support des positions.

m_trailing.setSignalDirection(m_signal.Direction());

et l'insérer au tout début de la méthode, qui est appelée avant chaque trailing stop, c'est-à-dire CheckTrailingStop() :

bool CExpert::CheckTrailingStop()
  {
//--- Set signal direction to trailing stops module
   m_trailing.setSignalDirection(m_signal.Direction()); 
//--- position must be selected before call
   if(m_position.PositionType()==POSITION_TYPE_BUY)
     {
      //--- check the possibility of modifying the long position
      if(CheckTrailingStopLong()) return(true);
     }
   else
     {
      //--- check the possibility of modifying the short position
      if(CheckTrailingStopShort()) return(true);
     }
//--- return without operations
   return(false);
  }

Nous allons écrire une ligne pour passer les signaux de trading dans la classe de gestion de l'argent et des risques :

m_money.setSignalDirection(m_signal.Direction());

et l'insérer au tout début de la méthode, qui est appelée avant chaque ouverture de position, c'est-à-dire CheckOpen() :

bool CExpert::CheckOpen()
  {
//--- set signal direction to money management module
   m_money.setSignalDirection(m_signal.Direction());
   if(CheckOpenLong())  return(true);
   if(CheckOpenShort()) return(true);
//--- return without operations
   return(false);
  }

Et c'est tout, le problème est résolu.

Maintenant, nous pouvons obtenir la valeur actuelle des signaux de négociation dans les modules de gestion des positions et de gestion des actions et des risques en accédant à la valeur du champ m_signaldirection. Il ne nous reste plus qu'à enregistrer les nouveaux champs et méthodes des classes CExpertMoney et CExpertTrailing dans la documentation et à ajouter les fichiers modifiés aux mises à jour.

 

Voici les fichiers. Dans l'Expert, les lignes 100 et 123 sont écrites à la main.

Si vous avez d'autres questions, n'hésitez pas à les poser.

 
uncleVic:

Voici les fichiers. Dans l'Expert, les lignes 100 et 123 sont écrites à la main.

Si vous avez d'autres questions, n'hésitez pas à me contacter.

Quel genre de personnes sont ces développeurs ? Quand commenceront-ils à écouter les besoins des traders, qui ont déjà de l'expérience dans la création de systèmes de trading, au lieu de concevoir des systèmes de trading qui sont pratiquement inutilisables pour les utilisateurs finaux parce qu'ils doivent modifier manuellement le code source ? Combien de fois dois-je expliquer que je peux entrer manuellement dans le code source et le corriger, et que même dans ce cas, il me faudra beaucoup de temps pour comprendre ce qui se passe, même si je connais bien la programmation. Et l'utilisateur final a peu de chances d'entrer dans le code, car il ne comprend pas la programmation. Vous avez vous-même déclaré, et je cite :

"La connaissance des langages de programmation n'est plus un prérequis pour créer des robots de trading."Voir https://www.mql5.com/ru/articles/240.

"La première version de l'assistant MQL5 offrait déjà la possibilité de créer rapidement un Expert Advisor prêt à l'emploi sous la forme d'un ensemble de modules simples sous la forme d'un code source en MQL5. Vous n'aviez même pas besoin de connaître MQL5- il vous suffisait de lire"Build your own Expert Advisor in MQL5 Wizard" (voir https://www.mql5.com/ru/articles/275).

Il s'avère maintenant que la connaissance des langages de programmation est nécessaire, car l'utilisateur doit entrer le code après l'assistant et y modifier quelque chose. C'est-à-dire que toutes les déclarations précédentes sont des inventions et des tromperies des développeurs.

Par exemple, si j'écris mon propre module de gestion de l'argent et des risques qui doit ouvrir une position en fonction du niveau du signal de transaction émis par un module écrit par un autre développeur de modules. En conséquence, mon module sera incompatible avec l'assistant. Comment expliquer aux utilisateurs qu'ils doivent aller quelque part dans le code et insérer des chaînes de caractères pour que le module fonctionne ? Après tout, les développeurs de modules devraient créer des modules, et master devrait les combiner automatiquement en un système cohérent, de sorte que les modules, au minimum, n'entrent pas en conflit les uns avec les autres et soient entièrement compatibles entre eux. Mais dans votre cas, l'assistant ne le fait pas, car après l'assistant, vous devez aller dans le code et tout refaire manuellement.

Est-il vraiment si difficile de mettre seulement six lignes dans les fichiers de classe des parents, ce que j'ai signalé dans mon précédent message ? Et le problème se résoudra de lui-même et personne ne devra entrer dans les sources et y changer quelque chose. Qu'est-ce qui va tomber de vos mains ? Pourquoi perdre votre temps sur un charabia avec démonstration de la façon dont quelque chose doit être corrigé manuellement après l'assistant ? Ne pouvez-vous pas consacrer ce même temps à une tâche plus utile, afin que personne ne doive entrer dans le code pour résoudre des problèmes similaires plus tard ?

Quelle est l'idéologie de votre entreprise ? D'un côté, elle déclare l'automatisation complète, mais dans la pratique, elle suggère d'entrer dans le code et de tout refaire à la main après la soi-disant "automatisation" ?

En somme, comme je le comprends, il est inutile d'expliquer tout cela. Il ne faut pas s'étonner que les traders ne veuillent pas passer à MT5, car la plateforme est rudimentaire et développée non pas pour la commodité de l'autotrading, mais pour la commodité des développeurs de cette même plateforme. Et à moins que l'utilisateur n'apprenne à fond la programmation, il vaut mieux qu'il reste à l'écart du trading automatisé.

Si tu ne veux pas, tu n'es pas obligé de le faire. Si vous n'avez rien d'autre à faire, restez assis ici et expliquez à chaque utilisateur où et comment il doit entrer dans le code source avec ses mains et ce qu'il doit corriger exactement.

Собери свой торговый советник в Мастере MQL5
Собери свой торговый советник в Мастере MQL5
  • 2011.01.14
  • MetaQuotes Software Corp.
  • www.mql5.com
Знание языков программирования теперь не является обязательным условием для создания торговых роботов. Если раньше это действительно служило непроходимым препятствием для реализации своих торговых стратегий, то появление Мастера MQL5 в корне изменило ситуацию. Начинающие трейдеры могут перестать тревожиться из-за отсутствия опыта программирования - с новым визардом, позволяющим быстро генерировать код советника, он не понадобится.
 
Je crains que vous ne soyez sous l'emprise du maximalisme ou que vous ne compreniez tout simplement pas les limites de l'applicabilité des outils.

En tout cas, avec ce niveau d'argumentation et en prenant presque chaque question au-delà des limites de l'exagération, il ne peut y avoir de travail avec vous. Le vrai travail implique une prise de décision consciente, pas une démagogie verbale.
 
Renat:
Je crains que vous ne soyez sous l'emprise du maximalisme ou que vous ne compreniez tout simplement pas les limites de l'applicabilité des outils.

En tout cas, avec ce niveau d'argumentation et en prenant presque chaque question au-delà du niveau acceptable d'exagération, il ne peut y avoir de travail avec vous. Le vrai travail implique une prise de décision consciente, et non une démagogie verbale.

En général, je n'ai pas demandé à travailler, c'est-à-dire à gagner de l'argent, et j'étais très heureux de coopérer sur une base volontaire. C'est moi qui décide comment et où je gagne ma vie.

Eh bien, ça ne sera pas le cas et ça n'a pas à l'être. Notre métier est de proposer, vous avez le droit de refuser. Comme on dit : le maître est le patron.

Si votre entreprise a déjà tout compris et a même appris aux nuls à créer des Expert Advisors dits "prêts à l'emploi". De plus, le fait est qu'ils ne sont bons que pour la démonstration de l'Assistant, mais ils ne sont pas très bons pour l'autotrading, car même sur les données historiques, la courbe d'équité semble inconsidérable.

Bonne chance !

 
Reshetov:
...

Par exemple, si j'écris mon propre module de gestion de l'argent et des risques, qui doit ouvrir une position en fonction du niveau du signal de négociation émis par le module écrit par un autre développeur de modules. Le résultat sera que mon module est déjà incompatible avec l'assistant. Comment expliquer aux utilisateurs qu'ils doivent aller quelque part dans le code et insérer des chaînes de caractères pour que le module fonctionne ? Après tout, les développeurs de modules devraient créer des modules, et l'assistant devrait les combiner automatiquement en un système cohérent, de sorte que les modules, au minimum, n'entrent pas en conflit les uns avec les autres et soient entièrement compatibles entre eux. Et vous avez un assistant qui ne le fait pas, car après lui, vous devez aller dans le code et tout refaire manuellement.

Est-il vraiment si difficile d'écrire seulement six lignes dans les fichiers de classe des parents, comme je l'ai signalé dans mon précédent message ? Et le problème se résoudra de lui-même et personne ne devra aller dans les sources et y changer quelque chose. Qu'est-ce qui va tomber de vos mains ? Pourquoi perdre votre temps sur un charabia, en démontrant comment réparer manuellement quelque chose après l'assistant ? Ne pouvez-vous pas consacrer ce même temps à quelque chose de plus utile, de sorte que personne ne doive entrer dans le code plus tard pour résoudre des problèmes similaires ?

...

Votre approche viole l'encapsulation des classes, ce qui entraîne une confusion hiérarchique.

Lisez le livre de Steve McConell "The Perfect Code" à votre guise.

Imaginez une usine de production de gants, il y a un timbre à cinq doigts pour la main droite et la main gauche, mais arrive ensuite une petite commande de gants à six doigts. Il y a des gens comme ça, après tout. Mais au lieu de leur fabriquer un tampon (qui fera un lot et y restera un moment), vous proposez de modifier le tampon à cinq doigts en fabriquant un doigt glissant. Il semble être universel et tout est génial, mais la force du timbre à cinq doigts sera affaiblie au nom de l'universalité (au nom d'un minuscule besoin de produire occasionnellement des gants à six doigts). Et puis un lot de 300 quatre-doigts sera commandé, et à nouveau, le modèle fiable et éprouvé s'effritera.

On vous l'a dit plus haut :

"pourquoi votre désir de voir le signal au niveau MM et trailing doit-il être implémenté au niveau de la classe de base ?".

Je ne pense pas que ce serait bon (c'est-à-dire mauvais). L'algorithme n'est pas typique (de mon point de vue). Si je comprends bien, vous disposez de vos propres modules MM et trailing (avec leurs propres algorithmes liés au signal).

Au lieu de modifier la bible standard, il serait préférable d'effectuer des développements pour l'étendre (par héritage). Alors ce serait vraiment intéressant.

HZZ De plus, pour que les gens n'aient pas à s'occuper des subtilités du code (comme vous l'avez écrit plus haut), vous pouvez envelopper les modules prêts à l'emploi dans biblio et les déverser de façon transparente sur le marché, puis il suffit de brancher le module de Reshetov et d'appuyer sur le bouton [download dough].

 
Urain:

Votre approche viole l'encapsulation des classes et, par conséquent, introduit une confusion hiérarchique.

Lisez le livre de Steve McConell "Perfect Code" à votre guise.

Pour faire simple, imaginez le sorcier comme une fabrique de gants. Il y a un timbre à cinq doigts pour la main droite et la main gauche, mais une petite commande arrive pour des gants à six doigts. Après tout, il y a des gens comme ça. Mais au lieu de leur fabriquer un tampon (qui fera un lot et y restera un moment), vous proposez de modifier le tampon à cinq doigts en fabriquant un doigt glissant. Il semble être universel et tout est génial, mais la force du timbre à cinq doigts sera affaiblie au nom de l'universalité (au nom d'un minuscule besoin de produire occasionnellement des gants à six doigts). Et puis un lot de 300 quatre-doigts sera commandé, et à nouveau, le modèle fiable et éprouvé s'effritera.

On vous l'a dit plus haut :

Au lieu d'apporter des modifications à la bible standard, il serait préférable d'effectuer des développements pour l'étendre (par le biais de l'héritage). Alors ce sera vraiment intéressant.
Combien de fois pouvons-nous dire que nous ne pouvons pas hériter de ce qui n'est pas disponible dans les classes parentes ? Quand allez-vous enfin prendre connaissance du livre "Code Complete" écrit par Steve McConell lui-même ?
  1. Mon approche ne viole pas les principes d'encapsulation, car dans la version que j'ai proposée, tout le superflu est caché, et les modules ne reçoivent un signal de transaction que sous la forme d'une valeur de type double et uniquement en mode lecture. Contrairement à certaines personnes, je n'ai pas seulement lu les livres sur la POO, mais je les ai soigneusement étudiés.
  2. Je n'ai pas suggéré de créer des gants à six doigts pour les modèles, c'est-à-dire d'attacher les sixièmes doigts comme des modules supplémentaires, mais simplement de faire correspondre tous les modules existants avec les signaux du module des signaux, qui est en fait le principal pour les systèmes de trading car tout le système doit fonctionner sur sa commande. C'est vous qui avez suggéré la modularité, c'est-à-dire des gants aux doigts interchangeables. Mais puisque vous avez fait en sorte que la main droite ignore ce que fait la main gauche, c'est-à-dire que les autres modules ne peuvent pas obtenir d'informations du module de signalisation et synchroniser leurs actions avec celui-ci, les gants auront des doigts (modules) de tailles différentes, lorsque l'utilisateur mettra le gant sur sa main et verra qu'un de ses doigts est petit et ne rentre pas dedans, tandis que l'autre est grand et excessif.

Par exemple, un stop suiveur est exécuté selon un système de signaux distinct développé par un développeur tiers du module, tel qu'une onde mobile ou parabolique, dont les signaux contredisent à certains moments les signaux du module et le système de trading commence à fonctionner de manière incohérente. Le module de gestion de l'argent et des risques ne peut pas non plus deviner par télépathie que le signal de trading est faible et qu'il est temps de réduire le volume des positions ouvertes et d'agir selon certaines règles indépendantes du module de signal, c'est-à-dire que l'un d'eux demande de ralentir dans les virages et l'autre d'accélérer. Et tout le système de trading, créé avec l'aide de votre soi-disant maître, se révèle comme dans la fable de Krylov intitulée "Le crabe et le brochet". Ni plus ni moins. Et cette même idéologie de fable consistant à rassembler des conseillers téméraires, votre société tente de nous l'imposer pour l'autotrading. En avons-nous besoin ?

Il en résulte des systèmes de trading dont les graphiques d'équité et d'équilibre ne peuvent qu'effrayer les traders et les investisseurs, voir https://www.mql5.com/ru/code/833.




Ce n'est pas parce que le créateur du module, dans ce cas précis Nikolay Kositsin, a fait quelque chose de mal, mais parce que les autres modules du système de trading ne peuvent pas être coordonnés entre eux et fonctionnent de manière incohérente.

Mais il est inutile de l'expliquer. Les développeurs de la plateforme, au lieu d'écrire une misérable six lignes pour résoudre les problèmes, écriront des kilomètres de notes de bas de page dans les forums, accusant les développeurs de systèmes de trading de répandre la démagogie, les violations de l'encapsulation et autres péchés mortels, mais ils ne lèveront pas le petit doigt pour corriger leurs propres déficiences et incompréhensions.

Il n'y a donc pas lieu de poursuivre les discussions. Restez-en à votre opinion et faites ce que vous voulez. J'en ai marre et ça ne sert à rien, parce que les développeurs de la plateforme n'en ont rien à faire, parce qu'ils ne font pas leurs propres trucs et si ces mêmes outils peuvent être utilisés par les utilisateurs de la plateforme pour l'autotrading, les développeurs s'en fichent. Celui qui est plein d'affamés ne sait pas de quoi il a faim.

Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
Модуль торговых сигналов, выполненный на основе индикатора Heiken_Ashi_Smoothed
  • votes : 7
  • 2012.02.23
  • Nikolay Kositsin
  • www.mql5.com
Модуль торговых сигналов для Мастера MQL5. Сигналом для открытия позиций служит изменение цвета свечи, формируемой индикатором Heiken_Ashi_Smoothed.
 
Reshetov:
...

Reshetov, je ne peux même pas lire vos gribouillages émotionnels. Vous voulez argumenter, argumentez votre cas.

L'intérêt d'un assistant est de créer un modèle qui répond aux besoins de la plupart des traders. J'ai un modèle d'EA sur Cherver (je l'ai écrit moi-même), il définit la fonctionnalité de base. Et dans la pratique, elle doit toujours être corrigée. Mais les modifications sont minimes. Si j'avais créé un modèle pour ne pas l'éditer du tout, cela aurait été un énorme code pour toutes les occasions, dans lequel on aurait pu se perdre.

L'assistant crée un modèle qui fonctionne déjà, et une personne qui ne sait pas programmer peut l'utiliser tel quel. Si vous comprenez le codage, il est facile de le modifier pour obtenir ce que vous voulez. Il suffit d'une seule fois pour comprendre comment les choses sont créées et où elles sont séparées dans la bibliothèque standard. En outre, vous pouvez également utiliser la bibliothèque standard comme modèle et copier simplement les sections qui vous intéressent dans votre propre code.

Raison: