Discussion de l'article "Création d’Expert Advisors Multiples sur la base de Modèles de Trading" - page 3

 
Serj_Che:

Je pense que l'article devrait être renommé - pourquoi faire simple quand on peut faire compliqué.

C'est un bon point.

Intéressant:

Au moins, j'ai compris (ou je pense avoir compris) l'essence de ce que l'auteur voulait transmettre aux lecteurs.

C'est de cela que je parle. Tout le monde a compris l'essence de ce qui est écrit. Qui, parmi ceux qui l'ont lu, considérera les codes ci-joints comme une mise en œuvre prête à l'emploi d'une étape de développement quelconque ? Pratiquement personne, sauf l'auteur. L'article s'est avéré être un article d'introduction, dont on ne peut tirer que l'idée, pas le code. Et il n'était pas nécessaire d'écrire autant de lettres pour cela.

Si vous vous considérez comme un chargeur, entrez dans le corps. Si vous décidez d'enseigner aux autres ou de partager votre propre expérience, vous devez écrire en pensant à chaque mot et à la structure de l'information que vous présentez. Si les pensées se promènent et veulent embrasser l'immensité et écrire sur tout ce qui existe dans le monde, alors il n'y a rien à entreprendre pour écrire des articles plan fondamental. Et les mots que c'est la version 1.0 beta ne sont pas appropriés. Car cela gâche la réputation d'un codeur compétent.

Je souhaite que la direction du forum soit plus attentive aux documents publiés et qu'elle effectue un contrôle plus strict des travaux des auteurs (non seulement les articles, mais aussi les codes). Et pour remplir le nombre de publications, il ne faut pas tout prendre à la suite. Il ne faut pas que cela devienne comme Codebase dans MQL4. Des travaux de grande valeur sans analogues sont perdus derrière des centaines de versions bêta 1.0.

 

Руководству форума желаю...

1. Ne me dites pas comment écrire ou quoi écrire.

2. Ne dites pas à MetaQuotes Software Corporation quelle politique commerciale mener et comment évaluer et sélectionner les auteurs pour son produit.

Considérez ces points non pas comme un souhait, mais comme un avertissement. Si vous continuez à répandre de la négativité dans le fil de discussion consacré à mon article et à dire à MetaQuotes ce qu'il faut faire et comment le faire, cela sera considéré par moi comme une tentative de dénigrer le travail que j'ai fait et de remettre en question le professionnalisme de l'équipe de MetaQuotes. Dans ce cas, je déposerai une plainte correspondante auprès des modérateurs de cette section, et j'ai de sérieuses raisons de croire que le conflit entre vous et moi sera résolu en ma faveur.

Ne portons pas l'affaire à la clarification officielle des relations et contentons-nous d'un accord à l'amiable : vous cesserez d'écrire dans le fil consacré à mon article des informations qui n'ont rien à voir avec le sujet dont il est question ici et vous cesserez de dénigrer le travail que j'ai accompli. Il vaudrait mieux que vous cessiez de poster quoi que ce soit ici. Je comprends votre point de vue, vous l'avez exprimé dans les pages précédentes. Je ne suis pas d'accord avec lui et vous n'êtes pas d'accord avec mon opinion. Je pense que nous sommes tous deux des personnes intelligentes et arrêtons cette polémique inutile.

 
udmurt2:

Je souhaite que la direction du forum soit plus attentive aux documents publiés et qu'elle effectue un contrôle plus strict des travaux des auteurs (non seulement les articles, mais aussi les codes). Et pour remplir le nombre de publications, il ne faut pas tout prendre à la suite. Il ne faut pas que cela se passe comme pour Codebase dans MQL4. Des travaux de grande valeur sans analogues sont perdus derrière des centaines de versions bêta 1.0.

+1

Je pense que la section "Articles devrait être utile aux consommateurs! !! Nadelektsya, ne les effraie pas et ne les embrouille pas !

Et maintenant - "Chukcha est un écrivain, Chukcha n'est pas un lecteur" .....

 

>>> Imaginez quevotre Expert Advisor négocie plusieurs dizaines de stratégies de trading, sur tous les instruments disponibles et sur toutes les échelles de temps possibles en même temps ! De plus, cet Expert Advisor est parfaitement testé dans le testeur, et un ou plusieurs systèmes de money management sont disponibles pour toutes les stratégies incluses dans cet Expert Advisor.

C'est exactement comme cela que mon trading d'Expert Advisor au Championnat est organisé. Il me semble que tout est plus simple. L'essentiel est de tout concevoir correctement et de ne pas tout mélanger.

//+------------------------------------------------------------------+
//|Niveaux de Vigueur.mq5 |
//| Copyright 2010, MetaQuotes Software Corp.
//|http ://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Vigor\Strategy.mqh>

#include <Vigor\TradeSignal.mqh>
#include <Vigor\ADXMAStrategy.mqh>
#include <Vigor\ADXStrategy.mqh>
#include <Vigor\MAVSimpleStrategy.mqh>
#include <Vigor\Order.mqh>
#include <Vigor\Dispatcher.mqh>
#include <Vigor\AdaptiveStrategy.mqh>
CDispatcher dispatcher;

//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   int myTick = 60;
   EventSetTimer(myTick);
   dispatcher.tickSeconds = myTick;

  //-- l'objet dispatcher travaille avec les ordres, les objets de stratégie 
// ne traitent que les signaux et ne travaillent pas avec le marché.

  //-- stratégies simples de trading séparément. héritiers de la classe CStrategy
 //--stratégies
   CMAVStrategy *s4 = new CMAVStrategy();
   s4.Symbol = "EURGBP";
   s4.onBars = true;
   s4.TimeFrame = PERIOD_M5;
   s4.HourStart = 7;
   s4.HourEnd = 18;
   s4.Risk = 0.1;
   s4.takeProfit = 2000;
   s4.stopLoss = 450;
   s4.trailingStop = 77;
   s4.lots = 0.1;
   s4.maxLots = 5;
  //--custom ;
   s4.period1 = 2;
   s4.max = 0.0025;
   s4.sensity = 0.39;
   s4.unsensity = 0.53;
   s4.init();
   dispatcher.strategies.Add(s4);



  //--stratégies
   CADXStrategy *s2 = new CADXStrategy();
   s2.Symbol = "GBPUSD";
   s2.onBars = true;
   s2.TimeFrame = PERIOD_M5;
   //s2.mHourStart = 0 ;
   //s2.mHourEnd = 24 ;
   s2.Risk = 0.13;
   s2.takeProfit = 2000;
   s2.stopLoss = 360;
   s2.trailingStop = 150;
   s2.lots = 0.1;
   s2.maxLots = 5;
  //--custom
   s2.period = 17;
   s2.level = 0.0042;
   s2.init();
   dispatcher.strategies.Add(s2);

  //--etc.


  //-- stratégie adaptative contenant en elle-même un 
//échange virtuel de la liste connectée (héritiers de CStrategy à nouveau), 
//également héritier de CStrategy et pour dispetcher'a il n'y a pas de différence.
   CAdaptiveStrategy *sadapt4 = new CAdaptiveStrategy();
   sadapt4.onBars = false;
   sadapt4.mRisk = 0.13;
   sadapt4.lots = 0.1;
   sadapt4.performance_variant = 2;
   sadapt4.maxLots = 5;
   sadapt4.init();
        
        // ***************************************** M30
        CADXStrategy *s_gbpjpy1 = new CADXStrategy();    s_gbpjpy1.Symbol = "GBPJPY";    s_gbpjpy1.onBars = true;    s_gbpjpy1.TimeFrame = PERIOD_M30;  s_gbpjpy1.takeProfit = 2000; s_gbpjpy1.trailingStop = 70; s_gbpjpy1.lots = 0.1; s_gbpjpy1.maxLots = 5; 
        s_gbpjpy1.stopLoss = 300;  s_gbpjpy1.init();
        sadapt4.strategies.Add(s_gbpjpy1); // tout mettre dans la stratégie adaptative
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        //  и т.д.
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        


  dispatcher.strategies.Add(sadapt4);


 // le remplir avec ce que l'on veut

  return(0);
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Fonction de tic-tac expert|
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   dispatcher.control();
  }
//+------------------------------------------------------------------+
 

L'exemple que vous avez donné est en fait très similaire au mien. Il y a moins de différences qu'il n'y paraît. Tout est également implémenté à travers des classes et chaque classe-stratégie a ses propres paramètres indépendants. La plus grande différence réside dans leur disposition : dans votre cas, toutes les stratégies sont gérées par le distributeur, dans le mien, elles sont gérées dans une liste de type CObject. En fait, mon approche n'est pas beaucoup plus compliquée que la vôtre, nous parlons simplement des mêmes choses, mais dans un langage différent.

Au départ, j'avais l'intention de résoudre n'importe quelle combinaison de trois "multis" : multitimeframe, multistrategy, multitool. Aujourd'hui, je vois que c'est bien plus que cela. Dans la deuxième partie, je pense couvrir le problème des décisions de l'expert. L'Expert Advisor décidera comment trader, quoi trader et quand trader. Tout cela permet mon approche. Probablement votre approche aussi, et c'est bien, parce que plusieurs solutions pour la même chose est un développement.

Au fait, pouvez-vous regarder l'implémentation du répartiteur lui-même ?

 
class CDispatcher {
   public:
      CTrade trade;
      CList strategies; 
      CList newOrders; 
      CList currentOrders;
      CList* strategiesResults;
      int repeats;
      int tickSeconds;
   private:
      ulong Magic;            
   public:
      void CDispatcher() {
          strategiesResults = new CList();
          repeats = 5;
          tickSeconds = 1;
      }
      void ~CDispatcher() {
        delete(strategiesResults);
      }
      
      void control();

      bool controlLimits();
      void controlOrders();
      bool controlOpen();
      bool controlClose();
      bool controlModify();      
      ulong ticketOpen(string smb, ENUM_ORDER_TYPE type,double lot,int SL,int TP);
      double countLotByRisk(CSymbolInfo *symbinfo, CStrategy *s, int dist, double risk, double lot, double maxlot);
       double NormalPrice(CSymbolInfo *symbinfo, double d);
      double NormalLot(CSymbolInfo *symbinfo, double lot);
      double BasePrice(CSymbolInfo *symbinfo, int dir);
      double ReversePrice(CSymbolInfo *symbinfo, int dir);
      double ReversType(ENUM_ORDER_TYPE type);
      double NormalTP(CSymbolInfo *symbinfo, int dir,double op,double pr,int TP,double stop);
      double NormalSL(CSymbolInfo *symbinfo, int dir,double op,double pr,int SL,double stop);
      void   checkDeals(CStrategy *s);
       ENUM_ORDER_TYPE getTypeByDirection(int dir);
       int getDirectionByType(ENUM_ORDER_TYPE type);
};
Je ne publierai pas la mise en œuvre. Tout est clair ici. Les stratégies sont toutes des descendants de CObject. Mais elles sont traitées par le distributeur. Nous devons aller du simple au complexe. Une interface simple d'objets, pour un observateur externe, devrait cacher tous les détails de l'implémentation. Je veux juste dire qu'il n'y a rien d'extraordinaire dans les multis. Avec la POO et le polymorphisme, tout se fait simplement.
 
Vigor:
Je ne publierai pas la mise en œuvre. Tout est clair ici. Les stratégies sont toutes des descendants de CObject. Mais elles sont traitées par le distributeur. Nous devons aller du simple au complexe. Une interface simple d'objets, pour un observateur externe, devrait cacher tous les détails de l'implémentation. Je veux juste dire qu'il n'y a rien d'extraordinaire dans les multis. Avec la POO et le polymorphisme, tout se fait simplement.
+1. Je suis tout à fait d'accord. Et en général, je voudrais dire que mon approche ressemble comme deux gouttes d'eau à la vôtre. Les stratégies sont toutes des descendants de la stratégie de base CModel, qui à son tour est un descendant de CObject. Comme vous, tout est initialisé dynamiquement et placé dans une liste. Tout comme vous, j'ai implémenté une interface objet simple qui cache tous les détails de l'implémentation. Une autre chose est que j'ai dû décrire toute l'implémentation dans l'article, et c'est pourquoi beaucoup de gens ont pensé que c'était compliqué. Mais pour utiliser des objets de mon type, vous n'avez même pas besoin de savoir comment tout cela fonctionne à l'intérieur.
 

Vasily, merci beaucoup pour cet article ! Je l'ai lu d'une traite ! C'est venu très facilement, je suppose que je suis mûr pour ce genre de matériel. Comme beaucoup de commerçants, j'ai réfléchi à certaines des questions abordées dans l'article. J'en ai résolu certains, d'autres non. D'autres encore n'étaient qu'une vague idée. Il était très agréable et inattendu de tout voir dans une présentation aussi systématique.

L'ampleur des questions résolues et, en outre, des perspectives est énorme. Tous les "esprits" ne sont même pas assez mûrs pour les soulever, et encore moins pour les résoudre. C'est la raison pour laquelle des commentaires du style de la fable de Krylov "Le renard et les raisins" ont été faits, car "bien que l'œil voie l'œil, la dent ne connaît pas la dent". Et comme le désir de s'affirmer est indomptable, ils commentent en espérant que les autres penseront : "Ah, la mousse ! Je sais qu'elle est assez forte pour aboyer après l'éléphant !" :) Ce n'est même pas la peine d'y prêter attention.

Continuez à créer, nous attendons la suite avec impatience !

P.S. Bien que vous ne puissiez pas encore travailler sur MetaTrader 5 dans la vie réelle, vous pouvez utiliser l'article "Copier le trading de MetaTrader 5 vers MetaTrader 4". Il s'agit d'un article très sensé et éprouvé ! Tout est donc très pertinent et peut être utilisé dans le trading aujourd'hui !

 

......
Pour quoi, sans crainte de péché,
le Coucou loue-t-il le Coq ?

 

il vaut mieux être loué à juste titre qu'étiqueté de manière injustifiée.