Rejoindre la communauté
banner_forum
Devenez membre de la plus grande
communauté francophone sur le Forex
Partagez, échangez et apprenez en gagnant des crédits sur votre compte de trading

Vidéos - Les bases de la prog MQL4 et Programmer votre premier EA

  • bperrin

    Bonsoir,

    Petit sujet, pour savoir ce que vous pensez de mes 3 vidéos sur comment créer sont premier EA sous MT4...

    Vidéo 1, les base de la prog : http://www.forexagone.com/videos/traders/bperrin/64-les-bases-de-la-programmation-en-mql4
    Vidéo 2, votre premier EA sous MT4 partie 1 : http://www.forexagone.com/videos/traders/bperrin/65-partie-1-programmez-votre-premier-expert-advisors-sur-mt4
    Vidéo 3, votre premier EA sous MT4 partie 2 : http://www.forexagone.com/videos/traders/bperrin/66-partie-2-programmez-votre-premier-expert-advisors-sur-mt4

    Si vous vous demandez pourquoi j'ai fait deux parties pour les vidéos : "Votre premier EA sous MT4", c'est simplement que youtube n'accepte pas les vidéos de plus de 15 min...

    (PS : je pense faire des vidéos pour faire son premier EA sous MT5... En reprenant la même stratégie histoire que vous voyez les différences et les atout de la POO ! ^^)
  • JJFlash

    Ha ! tu m'as devancé ! je voulais faire des vidéos aussi pour présenter la programmation sous mq4 ^^
  • bperrin

    PS... J'avoue que j’aurais pu faire mieux... C'est un peu bof des fois... Mais bon c'est la 1er fois que je fais des vidéos ^^

    Et puis, pour MQL5, je ferais un truc top... (Même si... ça va être dure pour ceux qui n'ont jamais fait de POO ^^...
  • JJFlash

    T'aurais dû plus présenter MetaEditor, se qu'on trouve dans les onglets etc...
  • bperrin

    Mouif...

    Même si bon... Je ne le connais pas trop encore..

    D'ailleurs j'ai remarqué un truc chelou...

    Faut croire qu'en MQL4, les types : unsigned et float n'existe pas...
    Idem pour la boucle : do...while...
  • JJFlash

    oui j'ai remarqué sa pour le unsigned aussi, c'est bizarre, mais bon on peut s'en passer ^^
  • bperrin

    Alors qu'en MQL5 ! Tout cela existe ! ^^ Enfin les unsigned c'est sous forme : ulong... ^^
  • wimz01

    Salut les gars vous pouvez passer faire un tour la http://www.forexagone.com/forum/expert-advisors-robots/besoin-d-aide-pour-la-prog-de-mon-1-er-ea-14233#63032 j'ai besoin de votre aide avis au autre programmateur du forum
  • furynick

    Puisque tu demande un avis voici le mien :

    L'idée de présenter les bases de la prog en vidéo me parait assez ambitieux, complexe et j'ai quelques doutes sur l'utilité de la démarche.

    J'ai donc visionné la 1ère vidéo par curiosité et mes doutes se sont confirmés. La programmation est un domaine qui se doit d'être précis et rigoureux mais ta présentation est fouillis et aléatoire. On s'interroge sur la préparation qui a été (aurait dû être) faite et je pense peut-être à tort que cette vidéo est une improvisation pure et simple.

    Les premières minutes de la vidéo commencent même très mal avec la confusion entre le slash (/) et l'anti-slash ou back slash (\) qui n'ont absolument pas la même signification, les accolades sont même renommées accroches (!??!) et le signe pipe "|" (prononcer païpe) se voit nommé "trait vertical". Le langage utilisé est trop familier et efface toute trace de sérieux et de rigueur. Les blancs sont trop nombreux, les explications (relecture de wikipedia) laconiques.

    La définition d'un entier est complètement fausse, le type int en MQL4 est codé sur 32 bits et la plage de valeur est donc -2 147 483 646 à 2 147 483 647. Les valeurs énoncées dans la vidéo correspondent à un codage sur 16 bits et est également faux puisque la plage en question va de -32767 à 32768. Je rappelle que les entiers sur 16 bits ne sont plus d'actualité depuis les années 90 grâce à l'apparition du processeur Intel 386 en 1986.

    Les maths ne sont pas non plus ton fort, exprimer un nombre réel comme tu le fais est la confirmation que tu ne comprends même pas de quoi tu parles puisque la double négation produit un nombre positif, il ne suffit pas de recopier bêtement ce que tu vois sur le site de doc du MQL4 (qui contient de nombreuses erreurs). Tu aurais pu consulter la doc MQL5 qui elle est correcte : 2.2250738585072014e-308 à 1.7976931348623158e+308

    Le caractère optionnel des accolades n'est pas évoqué et l'enchainement else if n'est pas compris. Pour préciser cette syntaxe voici l'explication :
    La condition if est suivi d'un bloc d'instruction d'une ou plusieurs lignes. Si le bloc d'instructions contient plusieurs lignes il doit être entouré d'accolades. Par exemple :
    Code
    if (a == 5) Print ("La variable a vaut 5");

    Cette condition peut-être complétée par un bloc d'instruction si l'instruction logique est fausse :
    Code
    if (a == 5) Print ("La variable a vaut 5"); else Print("La variable a contient une valeur incorrecte");

    Le bloc d'instructions qui suit le "else" pouvant lui aussi être une condition on obtient la forme else if mais la mise en forme correcte est la suivante :
    Code
    if (a == 5) Print ("La variable a vaut 5"); else if (b == 3) Print ("a est sauvé par b");

    En notation complète (avec les accolades) on obtient donc ceci :
    Code
    if (a == 5) { Print ("La variable a vaut 5"); } else { if (b == 3) { Print ("a est sauvé par b"); } }
    Les imbrications comme celle-ci peuvent être multipliées dans certaines limites.

    La liste des conditions n'est pas exhaustive, il manque les booléens et la négation explicite :
    Code
    bool b = false; if (!b) Print("b est faux");

    L'instruction break est également inconnue, il ne s'agit pas d'une bizarrerie de syntaxe mais une instruction à part entière qui n'est pas obligatoire. Par exemple on peut utiliser le switch pour traiter plusieurs cas avec une même action :
    Code
    switch (a) { case 1: case 3: case 5: case 7: case 11: Print("a est un nombre premier"); break; default: Print("a n'est pas un nombre premier ou est supérieur à 12"); }

    En conclusion, je serais tenté de penser que c'est uniquement dans le but de gagner le concours que ce screencast à été mis en ligne plutôt qu'un réel intérêt pédagogique. Je prendrai le temps de visionner les deux autres vidéos et donnerai également mon avis dessus.
  • JJFlash

    C'est vrai que la vidéo n'était pas du tout préparé, sa aurai du être plus structuré, surtout si c'est une vidéo qui se trouve quand les vidéo "officiel" de forexagone (je ne sais pas comment les définir ^^). Donc je te conseil pour les prochaine vidéo de prévoir exactement dans quelle ordre tu va dire les choses, et même peut être déjà préparer des bouts de code que tu complète en live ensuite sur ta vidéo.
    Voilà voilà mes petites suggestions ! ^^

    @furynick : je te trouve quand même un peu dure avec lui, c'est vraiment pas cool je pense. Comme il l'a dit c'est sa première vidéo donc bon faut être indulgent et pas le déglinguer comme sa ! Juste lui donner des conseils pour les prochaine vidéo sa aurai suffit largement !
  • bperrin

    @furynick :

    Alors pour te répondre... Je connais bien plus le C que le MQL4... De plus le fait que si tu n'as qu'une seul instruction dans une condition du type "if"..."else" tu ne soit pas obliger de mettre les accroches n'est pas essentiel pour comprendre la programmation ! Je dirais même que c'est une fois que l'on comprend bien que l'on peu se permettre de faire cela !

    En ce qui concerne "la mise en forme" du "else if"... Je te cite : "la mise en forme correcte est la suivante"... Euh... Oui si tu veux perdre ton temps tu peu l'écrire comme cela... Mais cela n'a aucun intérêt...

    Pour la négation explicite c'est pareil ! Elle n'est pas essentiel pour un programmeur débutant ! Étant donnée que tu peu très bien écrire : "b == false" ou "b == true" !

    Pour l'instruction break, il me semble l'avoir bien mit dans ma présentation du switch ! Même si j'ai omit le fait que cette instruction n'est pas obligatoire et permet de faire une même action pour plusieurs cas... Mais encore la, c'est une histoire de ne pas tout dire et perdre le "lecteur débutant" !

    En ce qui concerne le slash (/) et l'anti-slash ou back slash... Je suis confus ! En effet grosse erreur ! Idem pour le "trait vertical" ! Même si au moins on comprend de quoi je parle sans connaitre un vocabulaire soutenu !

    De plus c'est mes premières vidéos ! Et pour les prochaines ! Elles seront toutes aussi simpliste ! Car je ne veux pas tout définir sur la programmation qui est bien plus compliquer qu'une simple vidéo de 40 min ! Mais je ferais un effort considérable pour structuré mes dires...
  • wimz01

    Ben oui soyez indulgents, c'est pas parce qu’il vous a doubler qu'il faut lui mettre des bâtons dans les roues lol.

    En plus moi franchement ça m'a aidé, mais c'est galère, donc furinick t'as l'air de t'y connaitre pas mal toi aussi can you help me ?
  • furynick

    Addendum :
    La pésentation du langage souffre également de l'absence des autres types de variables (string, color, datetime) ainsi que l'évocation des tableaux.

    En ce qui concerne la création d'un EA il est dommage de ne pas avoir eu plus de détails sur l'assistant et notamment l'ajout de paramètres qui sont indispensables dans la plupart des cas.
    De plus, on constate là encore l'absence de préparation globale puisque les fonctions auraient dû être présentées dans la vidéo des bases.

    L'utilisation des variables globales est incorrecte, dans le cas d'un expert simpliste où seule la fonction start sera utilisée, il est préférable d'utiliser des variables locales (interne à la fonction start). L'utilité des variables globales étant de conserver certaines valeurs qui seront utilisées lors du tick suivant, les variables locales étant détruites à la fin de la fonction dans laquelle elles ont été déclarées.
    Leur utilisation est d'autant plus erronée que les constantes ne doivent pas (sauf certains cas particuliers) être stockées dans des variables mais définies statiquement par la directive #define (cas d'école pour le MAGIC).

    De mon point de vue (il ne s'agit là que de mon avis de programmeur), l'exemple de la fonction isTrade aurait pu faire l'objet d'une optimisation, le code suivant
    Code
    bool isTrade () { if (OrdersTotal() >= 1) { return(true); } else { return(false); } }

    d'une part peut être syntaxiquement simplifiée et la condition rendue plus efficace (la comparaison complexe ">=" consommant plus de ressource qu'un simple ">";) :
    Code
    bool isTrade () { if (OrdersTotal() > 0) return(true); else return(false); }

    et même considérablement réduite :
    Code
    bool isTrade() { return(OrdersTotal() > 0); }

    L'utilisation des booléens dans les conditions est laborieuse, l'instruction if vérifiant si la condition est true ou false il est totalement inutile d'en faire la comparaison, le code suivant est amplement suffisant :
    Code
    if (! isTrade()) { }

    L'explication du MA shift est honteusement écartée, preuve supplémentaire de la méconnaissance du sujet. Le décalage de la moyenne mobile correspond à une translation de la courbe de n bougies vers la droite. En pratique elle est très rarement utilisée.

    Les ticks et les bougies sont également confondus pour l'utilisation du dernier paramètre de la fonction de l'indicateur, un tick étant l'arrivée d'une nouvelle cotation de la paire, une bougie étant comme chacun sait un intervalle de temps caractérisé par les données OHLC (Open/High/Low/Close).

    La sélection d'un ordre par OrderSelect en mode ticket n'utilise pas le pool, un numéro de ticket étant unique il sera correctement sélectionné s'il existe

    Outre ces petites ombres il y a un problème plus général de conception de mon point de vue. Cependant, il n'y a pas de vérité absolue en programmation donc il ne s'agit là que de ma propre vision.
    Je pense qu'il aurait été plus efficace de traiter de l'évènementiel, à savoir réagir uniquement lors d'un croisement des MA :
    si croisement par le base des MA alors fermer l'ordre de vente s'il existe et ouvrir un ordre d'achat
    si croisement par le haut des MA alors fermer l'ordre d'achat s'il existe et ouvrir un ordre de vente
    Cela évite d'avoir à dupliquer les conditions d'entrée et de sortie qui deviendront source d'erreurs en cas de changement de celles-ci.

    De plus, la vérification du magic n'est pas faite, l'expert fermera donc arbitrairement tous les ordres passés sur la plateforme même s'il n'en est pas l'auteur.

    En conclusion, le programme est mal écrit, ne dispose d'aucun commentaire rendant difficile sa compréhension et sa maintenance, ne propose aucune vérification des erreurs et a des effets de bord catastrophiques. J'irai presque jusqu'à dire que c'est le bon exemple de ce qu'il ne faut pas faire.

    Juste à titre d'exemple, voilà comment j'aurais programmé l'EA :
    Code
    //+------------------------------------------------------------------+ //| SMACross.mq4 | //| Copyright 2012, N. Tuffier | //| http://www.furyweb.fr/forex/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, N. Tuffier" #property link "http://www.furyweb.fr/forex/" #define MAGIC 375403 //--- input parameters extern int MAPeriodSlow=10; extern int MAPeriodFast=5; extern double LotSize=0.1; string s; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- s = Symbol(); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int cnt, i, ticket = 0; bool signalBuy, signalSell; double prevSlowMA, prevFastMA, curSlowMA, curFastMA; // recherche de l'ordre en cours passé par le robot, // si aucun ordre trouvé la variable ticket reste à 0 cnt = OrdersTotal(); for (i = 0; i < cnt; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderMagicNumber() == MAGIC) { ticket = OrderTicket(); break; } // détection des signaux d'achat/vente prevSlowMA = iMA(s, 0, MAPeriodSlow, 0, MODE_SMA, PRICE_CLOSE, 1); prevFastMA = iMA(s, 0, MAPeriodFast, 0, MODE_SMA, PRICE_CLOSE, 1); curSlowMA = iMA(s, 0, MAPeriodSlow, 0, MODE_SMA, PRICE_CLOSE, 0); curFastMA = iMA(s, 0, MAPeriodFast, 0, MODE_SMA, PRICE_CLOSE, 0); signalBuy = prevFastMA < prevSlowMA && curFastMA > curSlowMA; // croisement par le bas signalSell = prevFastMA > prevSlowMA && curFastMA < curSlowMA; // croisement par le haut // ouverture et fermeture des ordres if (signalBuy) { // fermeture de l'ordre de vente s'il existe if (ticket != 0 && OrderType() == OP_SELL) OrderClose(ticket, OrderLots(), Ask, 3); // ouverture d'un nouvel ordre OrderSend(s, OP_BUY, LotSize, Ask, 3, 0.0, 0.0, "", MAGIC); } if (signalSell) { // fermeture de l'ordre d'achat s'il existe if (ticket != 0 && OrderType() == OP_BUY) OrderClose(ticket, OrderLots(), Bid, 3); // ouverture d'un nouvel ordre OrderSend(s, OP_SELL, LotSize, Bid, 3, 0.0, 0.0, "", MAGIC); } //---- return(0); } //+------------------------------------------------------------------+
  • bperrin

    Le MAGIC je l'ai mit en externe pour que l'utilisateur puisent le modifier sans toucher une ligne de code...

    En ce qui concerne la fonction isTrade en effet ! Et en tant que programmeur je la trouve même inutile ! Mais c'est pour expliquer ! Je ne vais pas faire un "return(OrdersTotal() > 0);" ! A quelqu'un qui n'a jamais fait de programmation dsl !

    De plus, je n'ai pas vu dans mes tuto le passage de paramètre au fonction personnelle... Donc oui j'ai tout mis en globale pour des raisons de simplicité ! ^^
    Modifié le 2012-11-25 10:13:51 par bperrin
  • furynick

    J'ai bien conscience que je suis assez dur mais mes motivations sont très sérieuses :

    d'une part la programmation doit être, pour être efficace, extrêmement précise et rigoureuse et doit être préparée.
    d'autre part, on parle de programmation de robots agissant dans un environnement financier et les sécurités doivent être d'autant plus respectées.

    Il est vrai que je sois assez puriste et donc très pointilleux. Ceci dit, il ne s'agit pas de pouvoir aligner quelques lignes de code pour se prévaloir programmeur et ce raccourci amène très souvent à de grandes désillusions.

    Quant au fait que ce soit ta première vidéo ça n'excuse en rien sa qualité. Tu notera tout de même que je n'ai pas fait mention des blancs, des doutes, de la longueur, des reprises et sans parler de taper 3 ou 4 fois MODE_SMA pour réussir à le taper correctement.
    Le fait justement que ce soit tes premières vidéos auraient du t'inciter à les faire parfaitement (au moins à y mettre les moyens, il est bien évident qu'on ne peut attendre un résultat professionnel d'un particulier qui fait ses premiers pas).
    A titre d'exemple tu peux visionner les vidéos que j'ai faite il y a un moment qui elles aussi étaient les premiers screencast de ma vie et que j'ai recommencé plusieurs fois (peut-être une dizaine pour la première) pour que la qualité soit au minimum au rendez-vous.

    Disons que je pense (et j'ai fait pareil) que tu as fait ces vidéos pour obtenir les points et gagner le concours. En soi ce n'est pas critiquable bien au contraire mais c'est un sujet vraiment pointu que tu as évoqué qui ne laisse pas de place à l'aléatoire.
  • bperrin

    @furynick :

    Je te promet de faire quelque chose de bien plus pointilleux ! Dans mes prochaines vidéos ! Mais j'avoue que je connais la programmation mais pas trop MQL4... Donc oui les noms de constantes ne me sont pas encore familière... Comme : "MODE_SMA" ^^

    Et tiens... pourquoi les mots clefs : "unsigned", "float", "char" n'existent pas... Tout comme la boucle : "do... while(...);" ? Je trouve que c'est vraiment un manque dans MQL4... ! Bien plus que d'avoir omis de parler des "types" datetime... string... color... (Qui sont enfaites des structures...) et non des types de bases... (Enfin en C...)... Et je suppose qu'ils ont du faire de même en MQL4... Basé sur un compilateur C ^^
    Modifié le 2012-11-25 10:27:04 par bperrin
  • furynick

    C'est effectivement des manques en MQL4 mais finalement assez simplement contournable.

    Le do ... while peut être remplacé par x=true; while (x) ... qui fait strictement la même chose. Quant aux types de données il ne s'agit en aucun cas de structures, que ce soit en C ou en MQL4, les types color et datetime ne sont rien d'autre que des int tout comme time_t en C et le string est un char * donc également un entier (un pointeur n'est autre qu'un entier en C).
    Le cas particulier du string en fait est qu'ils peuvent effectivement être des structures, le développement de DLL pour MT4 est d'ailleurs assez sensible sur ce point.

    Enfin, l'unsigned n'est pas très utile en fait, les plages de données étant assez larges. L'utilité de l'unsigned était autrefois (à l'époque du 16bit) pour justement éviter certaines limitation de plage pour stocker jusqu'à 65536 valeur dans un int ou pour l'utilisation spécifique des pointeurs qui ne peuvent être négatifs même si en C on peut les utiliser quand même.
  • bperrin

    Oui on peu "toujours" contourner comme tu dis... Mais bon...

    En ce qui concerne les types... Il sont défini par des "typedef" je suppose non ?
    Exemple : typedef int datetime ?
    Donc quand je parle de "type" de base, je parle réellement de ceux de base...

    En ce qui concerne les unsigned... Oui pas obligatoire mais quand même bien pour être sur à tout moment que l'on ne peu avoir qu'un nombre positif dans sa variable...
    Modifié le 2012-11-25 11:30:06 par bperrin
  • matconi

    Si je peux me permettre et sans vouloir dire que les vidéos sont faites pour gagner des points, il me semble que Furynick à raison. Il semblerait qu'il s'agit plus d'une erreur de support plutot qu'autre chose.

    Faire une video sur ce genre de sujet vraiment complexe n'est vraiment pas l'idéal. Il est très difficile de revenir en arrière (ou de trouver) un point qui a été mal compris, de sauter des étapes sur ce que l'on connait déjà etc... personnellement (et ce n'est rien de personnelle) mais regarder ce genre de vidéo pour apprendre je trouve cela très "barbant"

    Je pense que pour ce genre de tutorial les versions écrites sont beaucoup plus efficaces (avec des screenshots par exemple). Avantages non négligeable c'est qu'il est possible d'imprimer ou bien même de faire un copier/coller d'une ligne de code.

    Je pense donc comme Furynick à savoir que c'est une erreur de faire des vidéos sur des sujets aussi complexe.
    Modifié le 2012-11-25 12:37:22 par matconi
  • bperrin

    C'est pas si complexe que ça ! Une fois que l'on comprend les principes ! Je ne cherche pas a tout enseigner ! Juste les principes ! Après faut aller voir les documentations... ^^...