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

Comment on fait en MQL pour ...

  • furynick

    Tu es sur une fausse route, tu te fais guider par le code alors que c'est toi qui l'écrit ;)

    Prends un peu de recul et demande-toi ce dont tu as besoin, la réponse est simple : "J'ai besoin d'une fonction qui ouvre un ordre et j'ai besoin de savoir si l'ordre à été ouvert ou non".

    Donc, le prototype de ta fonction devrait ressembler à ça :
    Code
    bool LaunchOrder()

    Ensuite il faut essayer de ne pas coder du jetable mais du réutilisable : "de quoi ma fonction aurait-elle besoin pour pouvoir être réutilisée dans tous mes programmes ?"
    Soit tu définis une interface de dialogue commune en définissant des noms de variables globales soit tu passes les paramètres en arguments à ta fonction ce qui me semble plus judicieux. De plus, la valeur de retour pourrait renvoyer le n° du ticket plutôt que vrai/faux.
    On obtiens donc le prototype minimaliste suivant :
    Code
    int LaunchOrder(string symb, int type, double lots, int slippage, string comment, int magic)

    Si on veut pousser un peu plus loin le raisonnement on peut spécifier un nombre d'essai d'ouverture d'ordre et fixer une valeur par défaut aux valeurs optionnelles :
    Code
    int LaunchOrder(string symb, int type, double lots, int slippage = 2, int maxtry = 5, string comment = "", int magic = 0)

    Enfin, pour faciliter l'utilisation il faut placer les arguments en fonction de leur fréquence d'utilisation ce qui donnerait par exemple :
    Code
    int LaunchOrder(string symb, int type, double lots, int magic = 0, string comment = "", int maxtry = 5, int slippage = 2)

    Comme je l'avais indiqué il y a quelque temps il est préférable de ne pas fixer les TP/SL à l'ouverture des ordres car certains brokers ne le supporte pas. Dans ce cas il faudra également créer une fonction ModifyOrder avec par exemple le prototype suivant :
    Code
    bool ModifyOrder(int ticket, double sl, double tp)

    Passons ensuite au code à proprement parler :
    Code
    int LaunchOrder(string symb, int type, double lots, int slippage, int maxtry, string comment = "", int magic = 0) { int err, try = 0; int ticket = -1; double price; while (ticket < 0 && try < maxtry) { // on essaye tant que le ticket est invalide et que la limite d'essai n'est pas dépassée if (type == OP_BUY) price = MarketInfo(symb, MODE_ASK); else price = MarketInfo(symb, MODE_BID); ticket = OrderSend(symb, type, lots, price, slippage, 0, 0, comment, magic); err = GetLastError(); // on récupère la dernière erreur : celle de l'OrderSend if (err == 0) // s'il n'y a pas d'erreur on sort de la boucle break; if (err == ERR_PRICE_CHANGED || err == ERR_REQUOTE) { // si le prix a changé on rafraichit le cours et on réessaie immédiatement RefreshRates(); try++; continue; } // s'il y a une autre erreur on attend un quart de seconde et on réessaie, idéalement il faut vérifier tous les types d'erreur et sortir de la boucle en cas d'erreur critique (inutile d'essayer 5 fois si les paramètres passés sont incorrects) Sleep(250); RefreshRates(); try++; } return(ticket); }
  • Lorka85

    Merci fury, je n'ai pas de mots pour qualifié ta sympathie !! énorme quand même, wooooww !! :)
  • Lorka85

    vous avez une idée pour avoir le drawdow maximum d'un compte ? c'est a dire savoir a combien il était de porucentage négatif maximum a un moment donnée ?

    j'utilise ça pour acceder a l'historique des ordres ::
    Code
    int i, hstTotal=OrdersHistoryTotal(); for(i=0;i<hstTotal;i++) { //---- check selection result if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Access to history failed with error (",GetLastError(),")"); break; } code pour récupérer les infos sur les ordres . } }

    si c'est trop complexe dites le moi je lache l'affaire, il doit falloir voir avec la date des ordres, etc nan ?
  • furynick

    Si tu as le point de départ du trade (OrderOpenPrice et OrderOpenTime) ainsi que la fin (OrderClosePrice et OrderCloseTime), tu peux utiliser Low[iLowest(...)] pour un ordre Buy et High[iHighest(...)] pour un ordre Sell et faire la différence en pips.

    Je te laisse le soin de trouver les bons paramètres des deux fonctions citées et t'aider de iBarShift si nécessaire.

    Bonne fouilles ;)
  • Nicolab

    Bonjour,

    vous avez une idée de comment faire un système score (achat, vente et attendre) valide uniquement sur x bougies sans incrémenté à chaque tick si le score a déjà été comptabilisé durant ces x bougies ?

    Par exemple si un signal de vente a eu lieu il y a 20 bougies, ça ne sert à rien de le comptabiliser (on ne compte que le nombre de signal par tranche de x bougies).
    La base serait quelques choses comme ça :
    Code
    // Score d'achat, vente et attendre int scoreBuy = 0; // acheter int scoreSell = 0; // vendre int scoreLaze = 0; // attendre extern int scoreCandleLimit = 3; // On compte les signaux uniquement sur les x dernières bougies int start() { op = checkSignal(); if (op == OP_BUY) { price = Ask; scoreBuy++; } }
  • Nicolab

    Re bonjour,

    2 autres questions :
    - vous savez comment on fait en MQL pour lister les ordres ouverts depuis le graphique où l'EA est actif (même si l'EA a été ajouté après l'ouverture de certains ordres) ?
    - OrderModify() ne prend apparemment pas en compte la modification de commentaire, est-il possible de modifier un commentaire ? Sinon il y a t-il un moyen d'attribuer une sorte de type (ou ID) à un ordre ? Exemple je souhaite catégoriser mes ordres, pour savoir dans quelle phase de ma stratégie ils se trouvent, ce qui donne des ordres pouvant être ciblé par "phase1", "phase2", ...
    En se servant des commentaires je peux mettre "phase1" mais je ne trouve pas comment modifier par "phase2".

    Bon week end :)
  • nivti1

    bonjour à tous,

    Je me lance dans l'écriture d'un EA et je voudrais calculer l'ecart-type. Or je n'arrive pas à trouver dans la documentation comment obtenir la racine carrée. Avez-vous une idée?

    Cordialement
  • nivti1

    J'aurais mieux fait d'aller lire en page 6 de ce forum et j'aurais eu la solution immédiatement!
    pour les fonctions mathématiques, il faut chercher à mathxxx...
    a+
  • Lorka85

    bonjour

    j'ai un petit bout de code qui trace les point pivot poru chaque jours sur tous les jours possible dans le passé.

    j'aimerais que ca ne les trace que pour la journé actuelle, a la limite pouvoir spécifier le nombre de jours.

    voici le code qui gere ça je supose :

    Code
    int start() { int limit,firstDay; int counted_bars=IndicatorCounted(); if (counted_bars<0) return(0); if (counted_bars==0) { limit=Bars-1; i=1; firstDay=TimeDay(Time[limit]); while (TimeDay(Time[limit-i])==firstDay) i++; limit=limit-i-PERIOD_D1/Period(); } if (counted_bars>0) limit=Bars-counted_bars; return(0); }

    Gros merci pour toutes pistes :)
  • Lorka85

    c'est bon j'ai trouvé : PERIOD_D1/Period(); donne le nombre de bougie depuis le début de la journé sur le timeframe actuelle

    for (shift=PERIOD_D1/Period();shift>=0;shift--)
    {
    if (isNewDay(shift)) GetRSofDay(shift);

    else CopyLevelsDay(shift);
    }
Page 7