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

Programmation MQL4 problématique

  • Se7enRise

    bonjour tout le monde,
    je suis en train de programmer (ou du moins essayer... lol) un EA depuis quelques semaines
    j'ai de nombreuses erreurs, principalement de syntaxe car la structure je pense que c'est bon normalement.
    j'ai acquis les principales bases du langage MQL4 mais je ne comprend pas toujours les erreurs suggéré par mt4.
    voir ci-dessous
    ci quelqu'un a des idées...
    Merci!

    (ps : j'espère ne pas trop vous faire peur...)
    Code
    //+------------------------------------------------------------------+ //| SEVEN_SCALP_BUYSTOP.mq4 | //| Copyright 2018, MetaQuotes Software Corp. | //| https://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //----VARIABLES double a,b,c; //--- bougie 2 (a) double Closea = (iClose (NULL, PERIOD_M5, 2)); double Opena = (iOpen (NULL, PERIOD_M5, 2)); //--- bougie 1 (b) double Closeb = (iClose (NULL, PERIOD_M5, 1)); double Openb = (iOpen (NULL, PERIOD_M5, 1)); //--- bougie 0 (c) double Closec = (iClose (NULL, PERIOD_M5, 0)); double Openc = (iOpen (NULL, PERIOD_M5, 0)); double cours = double coursactuel(); double mbuystop = double mbuy(); extern double lots; double low2 = iLow (NULL, PERIOD_M5, 2); double low1 = iLow (NULL, PERIOD_M5, 1); double low0 = iLow (NULL, PERIOD_M5, 0); double sl; int Current = TimeMinute (TimeCurrent()); int lastone = TimeCurrent = 0; //----FONCTIONS double coursactuel() {(Bid + Ask)/2.0; return(0); } int init() { //--- determinez a,b,c - Close,Open Supérieurs. //--- bougie 2 if (double Closea > double Opena) { double a = double Closea; else (double Opena > double Closea) double a = double Opena; //--- bougie 1 if (double Closeb > double Openb) double b = double Closeb; else (double Openb > double Closeb) double b = double Openb; //--- bougie 0 if (double Closec > double Openc) double c = double Closec; else (double Openc > double Closec) double c = double Openc; } //--- mbuy (moyenne des Close,Open Supérieurs) double mbuy() {(a+b+c)/3.0; return(0); } //--- determinez sl if(low0 < low1 && low2) double sl = double low0 else(low1 < low0 && low2) double sl = double low1 else(low2 < low0 && low1) double sl = double low2 return(0); } int start() { //--- posez les 2 conditions nécessaire pour déclencher Ordre BUYSTOP if(int lastone != Time[0] && cours < mbuystop) { int ticket = OrderSend(string NULL(),OP_BUYSTOP,lots,mbuystop,3,sl,20,"",7,PERIOD_M5*3,blue); return(0) } }
    Se7enRise a joint une image
    programmation-mql4-problematique-10807
  • riden

    Salut,
    Je n'ai pas le temps de corriger ça en un seul post :) (je le ferais dans les prochains posts).
    Commençons par quelques points.

    if (condition) {instructions}
    else (condition) {instructions} -----> faux

    if (condition) {instructions}
    else if (condition) {instructions} -----> Correct

    ------------------------------------

    Start() s’exécute à chaque changement de prix donc tant que les conditions de prise de position sont vérifiées l'EA va ouvrir une position à chaque changement de prix -----> ajouter une condition qui vérifie s'il n'y a pas une position précédemment ouverte par l'EA.

    --------------------------------------------

    double A = double B; -----> faux

    double A,B;
    A=B;

    OU

    double B;
    double A = B;

    -------------------------------------------------------

    double coursactuel()
    {(Bid + Ask)/2.0;
    return(0);
    } cette fonction va retournera 0 toujours

    double coursactuel()
    {double res;
    res = (Bid + Ask)/2.0;
    return(res);
    }

    on écrit "double" devant la fonction uniquement lors de sa déclaration. Après pour l'utiliser: A = coursactuel() pas de "double"
    Modifié le 2018-02-20 23:22:55 par riden
  • Se7enRise — en réponse à riden dans son message #110669

    salut riden!
    tout d'abord Merci de m'avoir répondu,
    ouai je sais y'a beaucoup d'erreurs, en un seul post c'est un peu long !

    je vais essayer de corriger ces erreurs là !!
  • riden

    Salut,
    Je ne voulais pas dire par "je n'ai pas le temps" qu'il y a beaucoup d'erreurs mais il était 23h30.
    On a tous commencé la programmation à zéro avec des EA de quelques dizaines de lignes (j'étais content lorsque mon premier EA prenait une position même si elle est perdante) .
    Tu verras, le langage mql4 est très facile.

    Continuons :
    Voilà la correction de la syntaxe(uniquement la syntaxe), j'ai utilisé MathMax et MathMin pour remplacer les if ... else if ....
    Ajoute la fonction dont je t'ai parlée et tiens nous au courant.

    Code
    extern double lots; //----VARIABLES double a,b,c; //--- bougie 2 (a) double Closea ; double Opena ; //--- bougie 1 (b) double Closeb ; double Openb ; //--- bougie 0 (c) double Closec ; double Openc; double cours ; double mbuystop ; double low2; double low1; double low0; double sl; int Current; int lastone; //----FONCTIONS double coursactuel() {double res; res=(Bid + Ask)/2.0; return(res); } //--- mbuy (moyenne des Close,Open Supérieurs) double mbuy() {double res; res = (a+b+c)/3.0; return(res); } int ticket; int init() { return(0); } int start() { //--- bougie 2 (a) Closea = iClose (NULL, PERIOD_M5, 2); Opena = iOpen (NULL, PERIOD_M5, 2); //--- bougie 1 (b) Closeb = iClose (NULL, PERIOD_M5, 1); Openb = iOpen (NULL, PERIOD_M5, 1); //--- bougie 0 (c) Closec = iClose (NULL, PERIOD_M5, 0); Openc = iOpen (NULL, PERIOD_M5, 0); cours = coursactuel(); mbuystop = mbuy(); low2 = iLow (NULL, PERIOD_M5, 2); low1 = iLow (NULL, PERIOD_M5, 1); low0 = iLow (NULL, PERIOD_M5, 0); Current = TimeMinute (TimeCurrent()); //lastone = TimeCurrent = 0; //--- determinez a,b,c - Close,Open Supérieurs. //--- bougie 2 /* if (Closea > Opena) a = Closea; else if(Opena > Closea) a = Opena; */ a = MathMax(Closea,Opena); //--- bougie 1 /* if (Closeb > Openb) b = Closeb; else if (Openb > Closeb) b = Openb; */ b = MathMax(Closeb,Openb); //--- bougie 0 /* if (Closec > Openc) c = Closec; else if (Openc > Closec) c = Openc; */ c= MathMax(Closec,Openc); //--- determinez sl /* if(low0 < low1 && low0<low2) sl = low0; else if(low1 < low0 && low1<low2) sl = low1; else if(low2 < low0 && low2<low1) sl = low2 ; */ sl = MathMin(low0, MathMin(low1,low2)); //--- posez les 2 conditions nécessaire pour déclencher Ordre BUYSTOP if(lastone != Time[0] && cours < mbuystop) { ticket = OrderSend(NULL,OP_BUYSTOP,lots,mbuystop,3,sl,20,"",7,PERIOD_M5*3,Blue); } return(0);
  • Se7enRise — en réponse à riden dans son message #110672

    salut riden,
    PARFAIT!! ça marche!!! 0 erreurs et tout cela grâce à toi,
    et en plus j'ai maintenant compris la structure du code et comment appelez les fonctions et autres entités.
    maintenant je vais faire la même chose pour un SELLSTOP
    et je vous tient au courant de comment le robot fonctionne, de sa viabilité.
    encore Merci!
  • Se7enRise

    bonsoir,
    après avoir testé mon fameux robot,
    il s'avère que quelques petits changement sont à faire.
    donc en premiers : - je pensais que mon robot passerais 1 ordre par bougie 5 min et ceci à l'ouverture de la bougie,
    avec la fonction timeCurrent mais en fait nan, il m'execute des ordres à chaque tick c'est à dire beaucoup trop ... lol
    j'ai essayé avec la fonction Bars int bougie = 0; if (Bars > bougie) {ordre... }
    mais ca ne marche pas. (sûrement moi qui qui bug avec la syntaxe)

    Et en deuxième : - j'ai l'impression que il ne s'active pas tout le temps
    car quand la moyenne des 3 closes superieurs(variable mbuystop) est au dessus du cours, il devrait m'executer un ordre, que se soit
    à chaque bougie ou à chaque tick , mais il ne le fait pas.

    si quelqu'un voit où est le problème.
    Merci!
  • riden

    Salut,
    je te l'ai dit déjà que l'EA va passer un ordre à chaque changement de prix (à chaque tick), je t'ai ajouté un morceau de code qui te permet d'éviter cela. les SL et TP dans OrderSend doivent représenter un prix (exemple 1.2248 et pas une valeur en pips comme 20).
    Si tu me dis ce que tu veux faire avec l'EA je peux développer un EA qui fait ce qui est demandé mais ce n'est pas le but, tu dois apprendre à le faire par toi même :)
    Je n'ai pas compris le rôle de la variable "lastone".


    Code
    extern int MAX_Ordre_diff = 1; extern int MAX_Positions = 1; extern double lots; //----VARIABLES double a,b,c; //--- bougie 2 (a) double Closea ; double Opena ; //--- bougie 1 (b) double Closeb ; double Openb ; //--- bougie 0 (c) double Closec ; double Openc; double cours ; double mbuystop ; double low2; double low1; double low0; double sl,tp; int Current; int lastone; //----FONCTIONS double coursactuel() {double res; res=(Bid + Ask)/2.0; return(res); } //--- mbuy (moyenne des Close,Open Supérieurs) double mbuy() {double res; res = (a+b+c)/3.0; return(res); } int ticket; int init() { return(0); } int start() { //--- bougie 2 (a) Closea = iClose (NULL, PERIOD_M5, 2); Opena = iOpen (NULL, PERIOD_M5, 2); //--- bougie 1 (b) Closeb = iClose (NULL, PERIOD_M5, 1); Openb = iOpen (NULL, PERIOD_M5, 1); //--- bougie 0 (c) Closec = iClose (NULL, PERIOD_M5, 0); Openc = iOpen (NULL, PERIOD_M5, 0); low2 = iLow (NULL, PERIOD_M5, 2); low1 = iLow (NULL, PERIOD_M5, 1); low0 = iLow (NULL, PERIOD_M5, 0); Current = TimeMinute (TimeCurrent()); //lastone = TimeCurrent = 0; //--- determinez a,b,c - Close,Open Supérieurs. a = MathMax(Closea,Opena);//--- bougie 2 b = MathMax(Closeb,Openb);//--- bougie 1 c = MathMax(Closec,Openc); //--- bougie 0 //-------------------------------------- mbuystop = mbuy(); cours = coursactuel(); //--- determinez sl & tp sl = MathMin(low0, MathMin(low1,low2)); tp = Bid+20*10*MarketInfo(Symbol(),MODE_POINT); //---------------------Fc pour reconnaitre les pos précédemment ouverts------------------------------ int nb_ordre_diff = 0; int nb_pos = 0; for(int k=OrdersTotal()-1;k>=0;k--){ if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)){ if(OrderMagicNumber() == 7){ if(OrderSymbol()==Symbol()){ if((OrderType()==OP_SELL)||(OrderType()==OP_BUY)) nb_pos++; if((OrderType()==OP_SELLSTOP)||(OrderType()==OP_BUYSTOP)||(OrderType()==OP_BUYLIMIT)||(OrderType()==OP_SELLLIMIT)) nb_ordre_diff++;}}}} //--- posez les 2 conditions nécessaire pour déclencher Ordre BUYSTOP if(/*lastone != Time[0] &&*/ cours < mbuystop && b < MAX_Ordre_diff && a < MAX_Positions) { //OrderSend ticket = OrderSend(NULL,OP_BUYSTOP,lots,mbuystop,3,sl,tp,"",7,PERIOD_M5*3,Blue); } return(0); }
    Modifié le 2018-02-22 12:41:32 par riden
  • Se7enRise

    salut riden
    merci pour ces précisions.
    oui je suis d'accord avec toi mais c'est pas evident de se lancer dans la prog avec des infos que sur internet,mais je suis d'accord.
    En ce qui concerne la condition pour le changement de prix je n'avais pas fait gaffe dsl,
    et pour la variable lastone justement je voulais qu'elle me sert a la condition pour passer un seul ordre à chaque bougie m5.
    sinon le tp j'avais corriger mais je vois que ta variable tp est plus "efficace" que la mienne.
    merci encore.