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 ...

  • Lorka85

    merci de cette aide furynick, tu a raison, mais le code dans le fichier me semble beaucoup plus propre que copié/coller ici ;)

    j'ai utiliser ta petite astuce pour normaliser une valeur en pips :
    TPPoints = TakeProfit * Point * MathPow(10, Digits % 2);
    SLPoints = StopLoss * Point * MathPow(10, Digits % 2);
    BO = BreakEvenAt * Point * MathPow(10, Digits % 2);
    SE = StopEvenAt * Point * MathPow(10, Digits % 2);

    ca marche plutot bien, mais ca fait tjs ce petit bug pour les pairs au format 1.44000 mais pas les 110.75 asiatiques.
    je t'ai uploader le fichier sur megaupload, le code est relativement court et plus lisible que sur le forum, surtout que j'ai fait bien sur l'effort d'aéré le code, corriger les valeur booleenes, et commenté le code comme tu me l'a conseillé :)

    http://www.megaupload.com/?d=75M87C36
    a mettre dans le dossier expert.

    je teste en 1 minutes avec 2 ordres manuelles parallèle (buy et sell) sans stoploss ni tp, tous est deja parametré par defaut, donc je regarde sur l'eur/jpy (sans probleme) et gpb/usd par exemple (pair a problème de part son format comme dit plus haut, j'ignore d'ou peu venir ce petit bug)
  • furynick

    Autre conseil : si tu dois utiliser un même calcul plus d'une fois, mets-le dans une variable.

    Code
    pip2point = Point * MathPow(10, Digits % 2); TPPoints = takeprofit * pip2point; SLPoints = stoploss * pip2point; BO = BreakEvenAt * pip2point; SE = StopEvenAt * pip2point;

    Là aussi ça allège le code.
    Je regarderai ton code à l'occasion mais essaie de mettre des
    Code
    Print("le script va faire telle action et les variables sont x="+x+" y="+y);
    C'est fastidieux mais c'est ultra efficace !
  • Weakifix (invité)

    Bonsoir je souhaitais me baser sur sur les moyennes qui vont de 0 a -100 pour avoir les signaux bullish et bearish donc j'ai reussi a trouvé la combine

    [ code ] (iWPR(Symbol(), 0, 5, 0) >= -65) [ / code ] Ceci a l'air de bien marché.


    Merci :)






  • Lorka85

    Merci Fury, superbe :)

    Weakifix tien nous au courant de tes sympatique robots :)
  • Lorka85

    Bon fury j'ai revu le code c'est bon merci infiniment :)

    autre question : je tente de fermer partiellement l’ordre quand X pip franchi, si l'ordre était a 0.20 lot, il ferme 0.10 lot si 25 pips franchi sur le TP a 50 par exemple.

    voici le code :

    Code
    void OrdersList() { for (int cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS); if (OrderSymbol()==Symbol() ) { if (OrderType()==OP_BUY) { if (MarketInfo(OrderSymbol(),MODE_BID)-OrderOpenPrice()>=FTP) { if (OrderStopLoss()<=OrderOpenPrice()) OrderClose(OrderTicket(),OrderLots() / 2,Bid,3); } } } }

    le probleme est que j'ai peur que l'ea tente sans arret de diviser le lot de l'ordre restant par 2 a chaque tick si le cours est superieur aux X pips défini.
    je m'inquiete pour rien ?
  • furynick

    Et oui, tu as vu juste, si tu ne mets pas en place une vérification l'EA n'aura aucun moyen de savoir si la division à déjà été faite et tentera l'opération à chaque tick.

    Il faut également savoir que la fermeture partielle d'ordre altère le commentaire qui devient from/to #xxxx selon qu'il s'agit de l'ordre restant ou partiellement clôturé.
  • Lorka85

    et on peu stocker l'information dans une variable externe pour que meme au redemarage de MT4 il sauvegarde si oui ou non il a deja pris le tp partiel ?

    et a tu un bout de code pour vérifier si aucune ordre BUY d'ouvert n'existe par exemple ? ce qui me servira a réinitialiser la variable

    sur la base de la boucle
    for (int cnt=0;cnt<OrdersTotal();cnt++) je supose :)

    merci
  • Weakifix

    Bonjour a toutes et a tous,
    Je cherche a utiliser les bande de bollinger dans mon EA, je veux les utiliser avec différent mode. Pour mes signaux achat je veut utiliser les Bollinger en PRICE_LOW, MODE_UPPER et vente en mode PRICE_LOW, MODE_LOWER.

    Dans le code ci dessous j'ai bien réussi a entrée les variables recherche mais sa ne fonctionne pas comme je l'entend, quand je backtest je n'obtiens que 2 prises de positions une en achat et une autre en vente, Et bien sur celle ci ne respecte pas mes paramètre. et ceux sur toute ma période de test (6mois).
    Quand je met une partie du code en /* */ pour ne garder que BOLLINGER ACHAT ou BOLLINGER VENTE, les condition de prise de position sont rempli a la perfection, mais une seule position de prise et peut importe la période utilise pour les backtest.

    ma question est:

    Comment utiliser mes condition et prendre plus d'une position sur mes periode de backtest






    Code
    int ii; int date, date1; double Boll, Boll1; bool reperage = false; bool reperage1 = false; //---------------- //---------------- int start() { //------------- Boucle pour ne prendre qu'une position for(int ii = 0; ii < OrdersTotal(); ii++) { if(OrderSelect(ii, SELECT_BY_POS, MODE_TRADES) == false) { break; } NumPos++; } //-BOLLINGERACHAT---------------------- avoir la valeur voulu de bollinger pour achat if (reperage == false){ date = TimeDay(Time[0]); Boll = iBands("eurusd",PERIOD_M15,20,2.0,0,PRICE_LOW,MODE_UPPER,1); reperage = true; } if ( reperage != TimeDay(Time[0])){ reperage= false;} //---- ordre d'achat avec les condition if ( !NumPos && (iHigh ("eurusd",15,1)<= reperage )&& ( reperage <= iHigh("eurusd",15,0) )){ OrderSend (Symbol (), OP_BUY, 0.1, Ask, 0, Ask - 250 * Point, Ask + 300 * Point, "Test achat", 030820112314, 0, Green); } //-BOLLINGER VENTE--------------------------- valeur bollinger vente if (reperage1 == false){ date1 = TimeDay(Time[0]); Boll1 = iBands("eurusd",PERIOD_M15,20,2.0,0,PRICE_HIGH,MODE_LOWER,1); reperage1 = true; } if ( reperage1 != TimeDay(Time[0])){ reperage1= false;} //------- condition vente if ( !NumPos && (iLow("eurusd",15,1) >= reperage1 ) &&( reperage1 >= iLow("eurusd",15,0) )){ OrderSend (Symbol (), OP_SELL, 0.1, Bid, 0, Bid + 250 * Point, Bid - 300 * Point, "Test achat", 030820112314, 0, Green); } //---- return(0); }
  • Weakifix

    J'ai fais le mauvais copier coller :)

    ici :
    //-BOLLINGERACHAT---------------------- avoir la valeur voulu de bollinger pour achat
    double band = iCustom(Symbol(), PERIOD_M15, iBands("eurusd",PERIOD_M15,20,2.0,0,PRICE_LOW,MODE_UPPER,1), MODE_UPPER,0);
    //---- ordre d'achat avec les condition
    et
    //-BOLLINGER VENTE--------------------------- valeur bollinger vente
    double band1 = iCustom(Symbol(), PERIOD_M15, iBands("eurusd",PERIOD_M15,20,2.0,0,PRICE_HIGH,MODE_LOWER,1), MODE_LOWER,0);
    //------- condition vente

    C'est le code utiliser beaucoup plus simple a lire et ayant la meme utilité

    Par contre mon problème reste le nombre de prise de position soit il en prend trop soit il n'en prend qu'une.

    Merci pour votre aide
  • furynick

    @Lorka : Non, pas de variable externe ... tu dois passer par l'enregistrement dans un fichier pour ça.
    Code
    bool isThereOrdersOfType(int type) { int i, cnt = OrdersTotal(); for (i = 0; i < cnt; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType() == type) break; return (i < cnt); }
    PS : J'aime bien le code qui fait réfléchir ... cet exemple est un bon exercice de logique ;)

    @Weakfix : commence d'abord par relire ton code et te poser les bonnes questions comme par exemple :
    Est-ce que cette condition a-t-elle une chance d'être vraie un jour sachant que reperage1 est un booléen qui vaut soit "true" soit "false" ?
    Code
    if ( reperage1 != TimeDay(Time[0]))

    Un peu de rigueur et quand vous codez, essayez de ne faire que ça et de ne pas perdre le fil de vos pensées ;)
  • Weakifix

    Chef du S.H.I.E.L.D je suis d'accord avec toi et c'est d'ailleurs ce qui m'a fais recoder mes conditions et ma fais chercher du coté de iCustom.

    Le codage que j'utilise est la:
    Code
    int NumPos; int TS = 150; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //--- Boucle pour ne pas ouvrir 100² ordre for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) { break; } NumPos++; } //--- Variable et autre joyeuseté string BandUP ; string BandDown ; BandUP = iBands(Symbol(),0,20,2.0,0,PRICE_LOW,MODE_UPPER,1); BandDown = iBands(Symbol(),0,20,2.0,0,PRICE_HIGH,MODE_LOWER,1); double band = iCustom(Symbol(), 0, BandUP, MODE_UPPER,1); double band1 = iCustom(Symbol(), 0, BandDown, MODE_LOWER,1); //--- Condition d'Achat if ( !NumPos && ( band <= iHigh("eurusd",15,0) )){ OrderSend (Symbol (), OP_BUY, 0.1, Ask, 0, Ask - 250 * Point, Ask + 300 * Point, "Test achat", 030820112314, 0, Green); } //--- Condition de Vente if ( !NumPos && (band1 >= iLow("eurusd",15,0) )){ OrderSend (Symbol (), OP_SELL, 0.1, Bid, 0, Bid + 250 * Point, Bid - 300 * Point, "Test achat", 030820112314, 0, Green); } // ----- TrailingStop OrderSelect(0, SELECT_BY_POS); if (OrderType() == OP_BUY) { if (OrderStopLoss() < Ask-Point*TS) OrderModify(OrderTicket(),0,Ask-Point*TS,OrderTakeProfit(),0,Red); } if (OrderType() == OP_SELL) { if (OrderStopLoss() > Bid+Point*TS) OrderModify(OrderTicket(),0,Bid+Point*TS,OrderTakeProfit(),0,Red); } //---- return(0); } //+------------------------------------------------------------------+

    ps: comment on fais pour s'editer pour eviter de crée trop de post ?
  • furynick

    Tout pareil Weakifix, tu as un problème de compréhension des types de données :
    Code
    string BandUP ; string BandDown ; BandUP = iBands(Symbol(),0,20,2.0,0,PRICE_LOW,MODE_UPPER,1); BandDown = iBands(Symbol(),0,20,2.0,0,PRICE_HIGH,MODE_LOWER,1);
    En C tu aurais une grosse insulte du compilo !!

    Je t'invite à éplucher la doc MQL : http://docs.mql4.com et à revoir en détail les types des valeurs de retour.
  • Lorka85

    Merci furynick, j'espere que ça aiderais plein de monde ton aide, tu es formidable de cogitation :)

    petit détail, je n'ai pas compris comment utiliser ta fonction pour savoir si aucun ordre buy n'existe
    je tente de l'utiliser comme ceci :
    Code
    if (!isThereOrdersOfType(OP_BUY)) { Mon code }
    mais j'ai un petit soucis de compilation/avertissement. bien sur la fonction est déclarer plus bas.
  • miczou1

    bonjour a tous amis programateur

    ma question est simple, et au lieu d embeté babs je voudrais essayé de le faire tout seul
    sur mon smi je voudrait mettre une alerte lors de croisement des 2 courbes
    comment on fait en mql
  • miczou1

    sniff .... personne m a repondu
  • furynick

    miczou : Le croisement a déjà été traité dans ce fil, un peu de lecture pour le retrouver.

    lorka : tu as tout compris ... quelle est l'erreur ?
  • miczou1

    tout ce que j ai vu c est cela

    Dite moi, il lest possible de rajouter une alerte sur ce bbsqueeze quand l'histograme croise la ligne zero ?
    http://www.megaupload.com/?d=QL6YWA69
    il y a deja une alerte sur la barre horizontale au changement de couleur (quand les kelktner channel sort de la bollinger band)
    Merci
    P.S : de préférence a la cloture de la bougie ou il y a le signal.
    Je juge que ce post est pertinent

    laissez tomber mon message précédent :)
    autre question, voici le code de l'indicateur trendlord, assez court :
  • Lorka85

    rien mon cher fury, tous est rentré dans l'ordre.

    vous savez comment faire prendre une position manuel par un ea (pour qu'il lui attribue son magic number) ? Sans passer par le bouton metatrader donc.
    J'avais vu des astuce avec un déplacement d'objet sur le template, un membre de ce forum avait meme codé un indicateur pour prendre position en faisant glisser un label BUY ou SELL sur le template. vous avez une piste a me fournir ?

    merci
  • Lorka85

    c'est bon j'ai trouvé en volant ce code la :
    http://www.m-t-a-w.com/indicatorsandea/Training.mq4

    et en le modifiant un peu :) (c'est un trader simulator en local)

    enorme le résultat quand meme, je vous le ferez partager :)
    Lorka85 a joint une image
    G3995FC
  • Lorka85

    J'aimerais faire de ce code une fonction, pour alléger mon code: )

    Code
    BTicket=OrderSend(Symbol(),OP_BUY, lot, CurrentASK,3, Ask-SLPoints, Ask+TPPoints,"",magicNumber,0, BClr); while (BTicket == -1) // tant que l’ordre n’est pas passé { RefreshRates(); //on rafraichit les valeurs du cours de la paire BTicket=OrderSend(Symbol(),OP_BUY, lot, CurrentASK,3, Ask-SLPoints, Ask+TPPoints,"",magicNumber,0, BClr); Sleep(1000); // on attend une seconde }

    j'ai tenter comme ça, mais sans succés :
    Code
    void LaunchOrder(int ticketvalue) { //----------- passage d'ordre 1 avec verif harcelement -------------- while (ticketvalue == -1) // tant que l’ordre n’est pas passé { RefreshRates(); //on rafraichit les valeurs du cours de la paire ticketvalue=ticketvalue; Sleep(1000); // on attend une seconde } //------------ fin passage d'ordre -------------------------------- } Appelle de fonction : BTicket=OrderSend(Symbol(),OP_BUY, lot, CurrentASK,3, Ask-SLPoints, Ask+TPPoints,"",magicNumber,0, BClr); LaunchOrder(BTicket);
    Merci !