Page 1 sur 1

[MT4] Initiation aux classes

Publié : 24 août 2015, 15:11
par Zechatdoc
Les classes, c'est la classe !!!

Petit exemple de bidouille d'un EA pour le passer en Programmation Orientée Objet.

Deja a quoi ca sert ?
Pour schématiser, un EA c'est un truc qui a des entrées et des sorties.
En entrées, (tout ce dont l'EA a besoin pour fonctionner) on a :
-> Les evements OnInit(), OnTick()...etc
-> Les données des cours Bid[0], des indicateursiMA()..etc
-> Les données sur les ordres ouverts & fermés (OrderSelect/OrdersTotal...etc)
En sortie, on a (tout ce que produit l'EA):
-> Des trades (OrderSend/OrderClose)

L'idée de base, est de mettre des couches de code supplémentaires au niveau des entrées&sorties pour etre un peu + libre de faire ce que l'on veut.
Exemple :
-le faire tourner sur des series style renko ou autre faites maison
-faire du position centric plutot que du trade centric
-faire croire a l'EA qu'il trade, alors qu'on envoit les trades reels que sous certaines conditions
Bref, tout plein de choses.

Ci-dessous un peu exemple simple :
Je pars de l'EA livré avec MT4, et avec un minimum de modifications dans le code (et moins de 5mins de taff), faire tourner 2 EAs conjointement en un seul backtest.(exemple le 1er sur une MM10 l'autre sur une MM20)
Mais pour l'instant, on a les pattes un peu liées, on a un fichier .mq4 qui contient un EA, et on lance le backtest sur ce fichier.
L'idée est donc de décorréler le fichier de test de la notion d'EA.
Voici le fichier de départ :

Code : Tout sélectionner

//+------------------------------------------------------------------+
//|                                               Moving Average.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Average sample expert advisor"

//--- Inputs
input double Lots          =0.1;
input int    MovingPeriod  =12;
input int    MovingShift   =6;
input int MagicNumber=20131111;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//--- sell conditions
   if(Open[1]>ma && Close[1]<ma)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MagicNumber,0,Red);
      return;
     }
//--- buy conditions
   if(Open[1]<ma && Close[1]>ma)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MagicNumber,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//---
  }
//+------------------------------------------------------------------+

Ca tombe bien pour transformer ca en une classe, tout comme dans une classe, dans le fichier de test ca a :
- des parametres (input double Lots/input MovingPeriod...etc)
- des fonctions ( CalculateCurrentOrders,CheckForOpen,CheckForClose,OnTick)
- des variables globales (pas de bol ici il n'y en a pas exceptées les variables "input")


ETAPE 1 :

Allons-y, je crée une classe que j'appelle cMMA
Au départ, ca ressemble a ca :

Code : Tout sélectionner

class cMMA
  {
private:

public:
                     cMMA(){;};
                    ~cMMA(){;};
  }; // <<---- fin de l'entete


cMMA::cMMA()
  {
  }

cMMA::~cMMA()
  {
  }
Il y a 2 parties, la 1ere (jusqu'a fin de l'entete) sert a declarer le comportement de notre classe, on va y trouver les membres de la classe (variables dont on a besoin, et la signature des méthodes de la classe (des fonctions).
Ici de base, l'assistant a créé 2 methode, l'une du nom de la classe et l'autre ~NomDeLaClasse
La 1ere est le constructeur (i.e. en qlqsorte la méthode OnInit() appelée lors de la création de notre objet)
La 2eme est le destructeur (i.e. en qlqsorte la méthode DeInit() appelée lors de la destructeur de notre objet)
Pour chaque membre/fonction on peut choisir s'ils seront publics ou private. Ca veut juste dire, est-ce qu'il seront accessible ou non depuis l'exterieur de la classe.
La 2eme partie, c'est le corps des fonctions que l'ont a definies dans l'entete (ici constructeur et destructeur qui ne font rien)


ETAPE 2 :
Mon EA pour fonctionner aura besoin des variables declarées input du fichier de depart, je fais donc un copier-coller, je vire le mot "input" et les valeurs par defaut, on obtient ca :

Code : Tout sélectionner

class cMMA
  {
private:
   double Lots;
   int MovingPeriod;
   int MovingShift;
   int MagicNumber;
public:

                     cMMA();
                    ~cMMA();
  };

cMMA::cMMA()
  {
  }

cMMA::~cMMA()
  {
  }
ETAPE 3 :
L'algo de l'EA, on va declarer les signatures de ses 4 fonctions CalculateCurrentOrders/CheckForOpen/CheckForClose/OnTick
Alors les 3eres, c'est sa toutouille interne, donc on va les mettre en private, par contre OnTick() on aura besoin de la declencher donc on la met publique :

Code : Tout sélectionner

class cMMA
  {
private:
   double Lots;
   int MovingPeriod;
   int MovingShift;
   int MagicNumber;
   
   int CalculateCurrentOrders(string symbol);
   void CheckForOpen();
   void CheckForClose();
   
public:

                     cMMA();
                    ~cMMA();
                    void OnTick();
  };

cMMA::cMMA()
  {
  }

cMMA::~cMMA()
  {
  }

ETAPE4 : On copie-colle les 4 fonctions dans notre classe, la seule difference, c'est dans la signature, ou "void OnTick()" devient "void cMMA::OnTick()" :

Code : Tout sélectionner

void cMMA::OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//---
  }

Une fois ceci fait, normalement ca compile.
Il ne reste plus qu'a pouvoir passer des valeurs a nos membres Lots/MovingPeriod/MovingShift/MagicNumber
Ceci, on va le faire dès la creation de notre objet. Donc on choisi de prendre ces valeurs en parametre de notre constructeur,
Je modifie donc la declaration du constructeur :

Code : Tout sélectionner

public:

                     cMMA(double lots, int period,int shift,int magicNumber);
                    ~cMMA();
                    void OnTick();


Puis dans son code (qui etait vide jusqu'alors), j'affecte les valeurs passées en paramètres aux membres :

Code : Tout sélectionner

cMMA::cMMA(double lots, int period,int shift,int magicNumber)
  {
  Lots=lots;
  MovingPeriod=period;
  MovingShift=shift;
  MagicNumber=magicNumber;
  }
(Et ca compile toujours)

Ca y est mon EA est devenu une classe !
... je le remets pour ceux qui n'ont pas suivi :

Code : Tout sélectionner

//+------------------------------------------------------------------+
//|                                                         cMMA.mqh |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "http://www.mql4.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cMMA
  {
private:
   double Lots;
   int MovingPeriod;
   int MovingShift;
   int MagicNumber;
   
   int CalculateCurrentOrders(string symbol);
   void CheckForOpen();
   void CheckForClose();
   
public:

                     cMMA(double lots, int period,int shift,int magicNumber);
                    ~cMMA();
                    void OnTick();
  };

cMMA::cMMA(double lots, int period,int shift,int magicNumber)
  {
  Lots=lots;
  MovingPeriod=period;
  MovingShift=shift;
  MagicNumber=magicNumber;
  }

cMMA::~cMMA()
  {
  }
  
  
  int cMMA::CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void cMMA::CheckForOpen()
  {
   double ma;
   int    res;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//--- sell conditions
   if(Open[1]>ma && Close[1]<ma)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MagicNumber,0,Red);
      return;
     }
//--- buy conditions
   if(Open[1]<ma && Close[1]>ma)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MagicNumber,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void cMMA::CheckForClose()
  {
   double ma;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void cMMA::OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//---
  }




Reste a l'appeler...
Je crée un nouveau fichier EA, en virant tout sauf la fonction OnTick()
Dans ce fichier, je vais avoir besoin de ma classe qui est dans un autre fichier, donc j'ajoute
#include "cMMA.mqh"

OnInit() va me servir a instancier (~= creer un cMMA en lui passant les parametres), et OnTick(), on va l'utiliser pour pour appeler le OnTick() de mon cMMA.
Comme toute variable utilisée dans 2 fonctions differentes, on la déclare au niveau de l'EA :

Code : Tout sélectionner

#property strict
#include "cMMA.mqh"

cMMA mma1; // declaration de la variable

void OnTick()
  {

  }
La ca ne compile pas, on obtient un msg "default constructor not defined"
Effectivement, on a ajouté 4 parametres a notre constructeur donc il faut mettre par exemple
cMMA mma1(0.1,12,6,123456);
Dès cette declaration, le code que l'on a ajouté dans le constructeur est exécuté.
enfin dans le OnTick() du fichier EA, on va appeler le OnTick() de notre classe.
Voici le fichier obtenu au final :

Code : Tout sélectionner

#include "cMMA.mqh"
cMMA mma1(0.1,10,6,123456);

void OnTick()
  {
   mma1.OnTick();
  }
5 lignes... plus aucune intelligence dans le fichier backtesté, on a complétement décorrélé fichier de BT et EA.
A ce stade si on le fait tourner on obtient les memes resultats que l'EA de départ.
Maintenant je veux faire tourner 2 EAs, il suffit de declarer une autre variable, et d'appeler son OnTick :

Code : Tout sélectionner

#include "cMMA.mqh"

cMMA mma1(0.1,10,6,123456);
cMMA mma2(0.1,20,6,987654); // <--- ne pas oublier de passer un MagicNumber different !!!

void OnTick()
  {
   mma1.OnTick();
   mma2.OnTick();
  }
La, si on lance un BT, on a comme trades la somme de 2 BTs du fichier original
C'est tout pour le moment, mais si ca peut donner des idées a des gens... :)

Re: [MT4] Initiation aux classes

Publié : 24 août 2015, 20:24
par UKLM
je n'y connais rien mais ça respire la compétence donc respect,

juste pour que ce post ne reste pas sans réaction positive quand il y a volonté d' éclairer en face.

Re: [MT4] Initiation aux classes

Publié : 25 août 2015, 15:02
par Zechatdoc
Merci bien pour cette gentille attention UKLM :)

C'est vrai que ca ferait tjs plaisir si ca pouvait donner des idées a quelqu'un plutot que ce qu'il s'enferme dans les contraintes a priori inamovibles des pauvres petits outils mis a disposition des particuliers.
Mais après bon bin si ça passe a la trappe, c'est pas super-grave non plus vu, qu'il n'y a aucun but mercantile derrière (et c'est d'autant + compréhensible que le public francophone pour ce genre de choses est super restreint en +)

Re: [MT4] Initiation aux classes

Publié : 25 août 2015, 16:47
par FullPips
Je voulais prendre le temps de comprendre le truc avant de t'adresser mes chaleureux remerciements pour ton partage.

Mais là, j'ai pourtant rien bu, mais après la journée d'hier sur les marchés, j'ai la gueule de bois.

Donc un grand merci pour le partage. Pour le côté technique, j'ai besoin d'un peu de temps pour essayer d'assimiler le truc. Suis amateur moi, pas super pro comme toi ;-)

Pour info Zechadoc c'est un vrai cador en codage. Et c'est pas juste une flatterie !

Et en plus d'être un cador, il partage volontiers ses compétences de professionnel avec les amateurs que nous sommes.

Cette file en est une illustration, mais j'utilise tout les jours des tuyaux et astuces qu'il avait partagé sur trading-automatique.fr

Et il y a pas mal de code à Zechadoc dans mes EA, grâce à ses contributions dans le cadre d'un projet collaboratif que j'avais initié également sur trading-automatique.

Tient, Nicolas si tu passes par là... :wink:

Re: [MT4] Initiation aux classes

Publié : 28 août 2015, 12:53
par SSTD
Ce n'est pas parce qu’une personne maîtrise le fonctionnement des classes que c'est un grand programmeur loin de la.

Les classes sont la base de la prog.


Un grand programmeur est quelq' un qui sait bien débugger et factoriser au max les lignes de code,connaissant les fondements de l'informatique,du hardware au software mais en aucun cas un mec qui crée une classe est impressionnant.


La plupart des particuliers sont en admiration total devant un programmeur,car cela reflète toujours l'image du génie mais la réalité est tout autre.


Je n'ai rien contre zehadoc et ne connait pas son niveau mais une mise au point s'imposait car le manque de culture autour de tout ça est frappant.

FullPIPS tu sembles être la ramasse sur beaucoup de sujet mon ami :lol:

Re: [MT4] Initiation aux classes

Publié : 28 août 2015, 14:53
par FullPips
SSTD a écrit :FullPIPS tu sembles être la ramasse sur beaucoup de sujet mon ami :lol:
Déjà je ne suis pas ton ami, et ton attitude critique et négative sur tout est juste détestable.

Qui est-tu pour jouer au donneur de leçon et ramener ta fraise ?

Jusqu'à PREUVE du contraire, tu n'es juste personne.

Sur un point je te donne cependant raison : un informaticien professionnel est toujours impressionnant pour un codeur amateur.

Une chose est certaine : je préfère l'attitude de Zechadoc qui partage son travail sans arrière pensée, à un prétentieux qui vient déblatérer ses théories fumeuses.

Re: [MT4] Initiation aux classes

Publié : 28 août 2015, 16:56
par SSTD
Ah ben voila il lache ce qu il avait dans le coeur depuis un moment.

Alors si moi je suis personne tu dois être juste une petite merde.


Ensuite si tu est présent sur ce genre de forum,bien que le proprietaire est tres sympa , avec tes commentaires d'amateur total, c'est que tu es un amateur complet mec.

c'est quoi un forward test? mais sa n'existe pas banane n'essaie pas de faire le mec technique t'es juste une bille crétin.

Un forward test? un test sur le futur ,ben on appelle sa un backtest pauvre con va.

Un mec qui s'emerveille devant un type qui crée une classe ben moi tu vois je le considère comme un tout petit dans le monde de la prog d'algo.OK.

Alors arrête de te prendre pr un grand trader car comme la plupart des gens tu gagnes pas un caillou mais en plus tu te fais plumer pauvre idiot.


Je ss sur que fais le kakou devant tes potes en te faisant passer pr un trader mais face à un vrai pro tu te ferais calmer vite fait bien fait.

Et crois moi que je pourrais être ton maitre tranquillement et t'initier aux joutes de la victoire sur les marchés et pas avec des perfs de merde à 3 5 ou 10%.

Pour info j'etais juste venu aider durant les vacances quelques particuliers mais c'est vrai toi tu est trop bon pr ecouter les vrais pros.

Allez je te laisse à ta souffrance permanente à attendre comme une merde pr faire de cacahuètes sur les marchés.

Re: [MT4] Initiation aux classes

Publié : 28 août 2015, 17:13
par FullPips
SSTD a écrit :Alors si moi je suis personne tu dois être juste une petite merde.
:lol: :lol: :lol:

Un Kevin de 15 ans qui a lu un livre sur le trading durant ses vacances. Il me semblait bien.

Bonne chance pour la rentrée des classes mon grand.

Re: [MT4] Initiation aux classes

Publié : 03 sept. 2015, 15:44
par UKLM
De retour, ça chauffe dans le coin, dis donc. :D

en plus c'est de ma faute, ignorant de la chose et voulant apporter un peu de positivisme. :roll:
Je ne suis pas en extase non plus, je me contente d'être bon dans les concepts, pour le reste j'ai toujours pris un grouillot en Russie et Inde toujours en morcelant pour ne pas délivrer une stratégie entière. C'est toujours l'idée fulgurante qui prime sur les moyens de l'exprimer.

Re: [MT4] Initiation aux classes

Publié : 03 sept. 2015, 22:05
par Trader55
Trop bon, faut le garder SSD...
Il a réussi à bien me faire rire ce soir...

Merci.

"...car comme la plupart des gens tu gagnes pas un caillou mais en plus tu te fais plumer pauvre idiot."
SSTD a écrit : tu dois être juste une petite merde.
tu es un amateur complet mec.
t'es juste une bille crétin.
pauvre con va.
un tout petit dans le monde
pauvre idiot.
.
Y'a pas y'a du rythme !!!! :)

Re: [MT4] Initiation aux classes

Publié : 03 sept. 2015, 22:37
par FullPips
Trader55 a écrit :Y'a pas y'a du rythme !!!! :)
Effectivement, je pense que Kevin aura plus de futur dans le slam que le trading après le Lycée.

Quand j'ai lu sa bordée d'insultes, je me suis bien marré. Il me rappelle mon fils de 6 ans quand il veut bagarrer avec son papa.

Il faut bien que jeunesse se passe comme on dit...

Re: [MT4] Initiation aux classes

Publié : 04 sept. 2015, 06:31
par celtinvest
FullPips a écrit :Quand j'ai lu sa bordée d'insultes, je me suis bien marré. Il me rappelle mon fils de 6 ans quand il veut bagarrer avec son papa.
Heu, ton fils de 6 ans te parle comme ça ? :?

Re: [MT4] Initiation aux classes

Publié : 04 sept. 2015, 12:01
par FullPips
FullPips a écrit :Quand j'ai lu sa bordée d'insultes, je me suis bien marré. Il me rappelle mon fils de 6 ans quand il veut bagarrer avec son papa.
celtinvest a écrit :Heu, ton fils de 6 ans te parle comme ça ? :?
Heu non, je te rassures ;-)

Je parlais de bagarre physique, pour s'amuser. Si tu as eu un garçon, je pense que tu vois ce dont je parle.

Ce que je voulais dire, c'est que la réaction du jeune Kevin, était similaire à celle d'un jeune enfant quand tu lui demandes d'éteindre la télé ou que tu lui ranges son doudou.

Mignon quoi.

Re: [MT4] Initiation aux classes

Publié : 04 nov. 2015, 12:24
par Jeff719
Zechatdoc a écrit :Les classes, c'est la classe !!!

Petit exemple de bidouille d'un EA pour le passer en Programmation Orientée Objet.

.../...

La, si on lance un BT, on a comme trades la somme de 2 BTs du fichier original
C'est tout pour le moment, mais si ca peut donner des idées a des gens... :)

Avec un peu de retard, je tiens à féliciter ce post !

On ne saurait être plus clair, pédagogique, assorti d'un exemple à la clef pour montrer l'immense avantage de la programmation objet depuis les builds 600.

J'avais de mon coté été quelque peu surpris du manque de commentaires francophones relatif à l'immense révolution constitué par le remplacement du langage mql4 par le mql5. Par ailleurs, je n'intervenais plus sur les forums, ayant d'autres choses à faire. Qui plus est je me demandais s'il était vraiment sérieux de faire tant soi peu des EA dignes de ce nom avec ce langage.

Un peu d'histoire : je me mets à mql4 au début de cette décennie. Après 10 ans de C suivis de 15 and de C++, voila qui me rappelais ma jeunesse. mql4 c'était pour moi 20 ans en arrière, un petit langage procédural précompilé façon Pascal des temps anciens. A part l'immense intérêt de l'intégration dans la plateforme, je ne croyais pas au début que des gens pouvaient faire de la production avec ça.

Pour maquetter des stratégies élémentaires, pourquoi pas.

Pour ailleurs, je suis rapidement arrivé à une architecture où je ne m'intéresse plus qu'a des tables de robots. J'ai toujours une liste de réglages qui tourne en parallèle. Je ne vais pas développer ici mais les avantages sont immenses. On peut faire des graphiques comparatifs sous Excel de différents réglages, avoir des portefeuilles de réglages ou de stratégies, séparer élégamment les Buy et les Sell, etc.

Sans faire toute une architecture de classe, rien que le polymorphisme (le même non de fonction appelle des versions différentes selon les paramètres envoyés) donne un immense avantage en maintenance et partage.

J'ai donc depuis quelques temps toujours une table de réglages de stratégies qui représente autant de modulations d'une stratégie de départ.

Pour moi la release (été 2013 je crois) a été une révolution. Bien proche de jeter l'éponge pour passer au C# voir aux DLL C++ appelées par MT4, j'ai enfin pu sous MT4 développer les architectures que je recherchais.

Je n'ai pas écrit d'article sur la question. Soit le lecteur est un informaticien et doit trouver assez banals mes propos par rapport à la littérature disponible sur la question. Soit le lecteur est l'un de nos vaillants contributeurs de ce site, tout à fait capables de faire des bricolages pertinents et opérationnels sur des EA, mais franchement, nos histoires de geek concernant la programmation objet, ils doivent trouver cela fumeux.

Encore une fois félicitations à Zechadoc, en espérant que le vomi posté par le troll de service ne freineront pas les velléités de nous éclairer.

Nb : Pour les programmeurs semi pro ou semi amateurs :wink: , relisez de près le post du Chadoc. Vous verrez, une fois franchis l'obstacle d'une abstraction supplémentaire, et une fois pour toutes écrits les pavés de sources qui font les choses, vous ne pourrez plus vous en passer, de le table de bots.

Re: [MT4] Initiation aux classes

Publié : 27 nov. 2016, 23:17
par take_profit91
qui ici ce sert des classes dans la programmation de leurs algos ?

Re: [MT4] Initiation aux classes

Publié : 18 déc. 2016, 18:32
par Jeff719
take_profit91 a écrit :qui ici ce sert des classes dans la programmation de leurs algos ?
Hihi, je n'ai pas répondu ici, car je suis hors concours (Zechadoc l'est aussi).

Le silence assourdissant montre combien l'entraide MT4 est plus ou moins révolue. Dommage, il y a tant à faire. Ceci dit - mais j'en parle ailleurs - l'immense probabilité selon laquelle, même avec la meilleure volonté du monde ainsi que doté de nombreux atouts, il est plus que probable qu'un tradeur retail très compétent pour écrire des EA ait toutes les chance de produire des trucs plus ou moins piteux sur le long terme.

Précisément pour les mêmes raisons que l'immense majorité des traders retail sont perdants.

Ainsi l'engouement pour les EA est très fortement retombée, du moins en ce qui concerne la masse des traders potentiellement intéressés.