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

Ask, bid et spread dans MetaTrader 4

  • Nicolab

    Bonjour,

    je m'emmêle un peu avec le spread, imaginons que je prenne position en achat au cours 1.50 :

    Code
    // trailing stop de la position achat ts = Bid - (10 * vPoint);

    Avec ce TS (basé sur Bid) j’ai pris en compte le spread non ?

    Inversement pour une position short :

    Code
    // trailing stop de la position vente ts = Ask - (10 * vPoint);

    Ca me semble bon mais j’ai pas l’impression que le TS n’est pas déclenché à 10 pips exactement.

    Petite précision, la variable vPoint c’est pour le nombre de digit suivant les brokers, le code est :

    Code
    if(Digits == 2 || Digits == 4) vPoint = Point; else if(Digits == 3 || Digits == 5) vPoint = Point*10;
  • furynick

    Oublie le spread, une position longue (achat) est ouverte au Ask et fermée au Bid donc ton TS doit se baser sur le Bid pour un Buy.

    En raisonnant de la sorte tu n'as pas à te soucier du spread.

    Pour ton vPoint, le double if est carrément pas beau et très long à écrire ;)
    Code
    double vPoint = Point * MathPow(10, Digits % 2);

    Ou mieux si tu fais un EA multipaire :
    Code
    double Pip2Point(string sym, double pip) { return(pip * MarketInfo(sym, MODE_POINT) * MathPow(10, MarketInfo(sym, MODE_DIGITS) % 2)); }

    PS : j'ai écrit le code à la volée, il n'est peut-être pas parfaitement correct
    où sym contient le nom de la paire et pip la valeur en pip à convertir en point pour la paire concernée.
  • Nicolab

    C'est la logique que j'ai adopté (Ask -> Bid) mais mon code buguait, du coup j'ai eu un doute.
    J'ai eu la réponse par Bastien (autoforex). Étourderie qui m'a bien fais bataillé (j'ai mis un - à la place du +).
    En plus je viens de m'apercevoir que les tableaux ne sont pas persistent en MQL ? Ou alors mon tableau se vide de temps en temps, sans que je comprenne.

    Du coup je refais entièrement l'EA pour le rendre plus simple et plus lisible (dur de faire simple).

    Pour ton code pas mal du tout, je vais remplacer merci :)
  • furynick

    Les tableaux sont vicieux en MQL4, j'avais déjà décrit leur fonctionnement dans un fil mais s'ils ne sont pas statiques il doivent être obligatoirement taillés.

    Par ex. cette définition est incorrecte :
    Code
    double prices[]; prices[5] = Open[5];

    Soit il faut utiliser un tableau statique
    Code
    double prices[5];

    ou encore tailler le tableau dynamique :
    Code
    ArrayResize(prices, 6);
  • furynick

    erratum :
    le tableau statique doit avoir 6 éléments pour pouvoir utiliser l'index n°5 puisqu'on démarre à 0
  • Nicolab

    Je me rappelle de ce fil, il m'avait beaucoup aider à comprendre le fonctionnement des tableaux en MQL.
    Surement un problème d'index, j'ai refais mon traitement des tableaux avec un recyclage ou ajout si pas d'entrée de libre.

    J'ai voulu intégrer ta fonction :
    Code
    double Pip2Point(string sym, double pip) { return(pip * MarketInfo(sym, MODE_POINT) * MathPow(10, MarketInfo(sym, MODE_DIGITS) % 2)); }

    Je me suis fais insulter :
    Citation :
    '%' - remainder operator is to be applied to integer values only


    Problème de typage, tu ne serais pas comment y remédier ?

    Merci pour ton aide furynick ;)
  • furynick

    Arf, je l'avais eu celui là en effet ... le MarketInfo renvoie toujours un double même si c'est un entier.
    Il faut passer par une variable transitoire :
    Code
    double Pip2Point(string sym, double pip) { int d = MarketInfo(sym, MODE_DIGITS); return(pip * MarketInfo(sym, MODE_POINT) * MathPow(10, d % 2)); }
  • Nicolab

    ok je viens juste de trouver je venais justement poster la réponse.
    Ta réponse me conforte que je n'ai pas trouver une rustine en forçant le typage lol

    Merci ! :)

  • furynick

    Les rustines de ce type sont monnaies courantes en MQL4 ;)
  • Nicolab

    Je vois ça, peut être que mql5 améliore certaines de ces contraintes. Je regarderais par curiosité.
  • furynick

    Oui et non, il y a plusieurs fonctions en MQL5 là où il n'y en avait qu'une en MQL4.
    MarketInfo est remplacé (en partie) par SymbolInfoInteger, SymbolInfoDouble et SymbolInfoString.

    J'ai cru comprendre aussi qu'il y avait possibilité de "caster" mais je n'ai pas encore approfondi le MQL5.
    Le MQL5 est indéniablement plus puissant et moins limité mais beaucoup plus complexe à utiliser, le simple traitement d'un indicateur passe par deux (voire plus) étapes : l'instanciation et le calcul à quoi il faut ajouter le stockage dont la notion de série est moins triviale qu'en MQL4
  • Nicolab

    Ok, bon vaut mieux que je reste avec mql4 pendant quelques temps. ^^
    C'est surtout les tableaux statique qui sont chiant, le reste est quand même intuitif.
  • furynick

    Les dynamiques sont chiants ... pas les statiques ;)
  • Nicolab

    Un dynamique roule tout seul :P
    Après si on a besoin de maîtriser la taille ou le typage rien en empêche, autant avoir le choix ^^