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

EA qui donne le volume de la position en fonction du stoploss indiqué en prix et pas en pips

  • gravdigaz6

    Bonjour à tous,
    je cherche un EA qui permet de calculer en live sur le graph le volume de ma future position en fonction d'un stoploss prépositionné sur le graphique ou si pas possible d'un stoploss sur un niveau de prix et pas en distance de pips! car n'ayant pas le temps de faire la soustraction pour prendre rapidement la position sur signal.

    Merci par avance.
  • riden — en réponse à gravdigaz6 dans son message #109946

    Tu veux quelque chose de ce genre:
    Un petit EA peut par exemple dessiner par défaut une ligne horizontale à quelques pips du prix, en suite, tu sélectionnes la ligne pour la mettre où tu veux. Si, par exemple, tu places cette ligne au-dessus du prix, le EA va la considérer comme un emplacement d'un SL pour une futur position de vente et t'affiche le volume de la position selon des paramètres prédéfinis, par exemple : la perte doit être égal à 2% du capital.
  • gravdigaz6 — en réponse à riden dans son message #109950

    oui c'est exactement cela tu en connais un?
  • riden — en réponse à gravdigaz6 dans son message #109953

    Non mais je vais développer un petit EA qui fait ça :)
    J'essayerai d'en finir ce weekend.
  • gravdigaz6 — en réponse à riden dans son message #109964

    super!
  • riden

    J'ai fini.
    Il y a une variable externe MM qui doit être entre 0 et 100 (par exemple 2 signifie que pour chaque position tu risques 2% du capital)
    La ligne est, par défaut placée à 20 pips au-dessus du prix. après tu peux la sélectionner pour la placer où tu veux.
    L'EA ne supprime pas la ligne même après la fermeture et l'ouverture de MT4 donc si tu ne vois plus la ligne (elle est loin en haut ou en bas), tu peux la supprimer avec: clic-droit-->Lister les Objets puis supprimer la 'ligne11", comme ça l'EA va la redessiner dans son emplacement par défaut.
    J'ai développé ce petit EA aujourd'hui(dimanche), je n'ai pas pu le tester vraiment (juste un test avec la fonction OnInit) il ne devrait y avoir aucun problème mais si tu auras une remarque demain lorsque tu le testes, dis-le moi.



    //+------------------------------------------------------------------+
    //| Expert initialization function |
    //+------------------------------------------------------------------+

    extern string info = "Le MM doit être compris entre 0 et 100%";
    extern double MM = 2;
    double prix_sl, volume,perte_pips,A_perdre;
    string typ_pos, pref;

    //-----------------------------------------compatibité 2 & 4 digits---------------------------------------
    double dig(string paire){
    if( (MarketInfo(paire,MODE_DIGITS)==4) || (MarketInfo(paire,MODE_DIGITS)==2) ) return(0.1);
    if( (MarketInfo(paire,MODE_DIGITS)==3) || (MarketInfo(paire,MODE_DIGITS)==5) ) return(1.0);return(1.0);}


    //---------------------------------------------Diff en pips entre deux niveau de prix-----------------------------//

    double diff_pips(string paire, double p1, double p2){
    double res;

    res=MathAbs(p1-p2)/(MarketInfo(paire,MODE_POINT)*10*dig(paire));
    return(res);}


    //---------------------------------------------------------------------------------------------------------------
    int OnInit()
    {
    //---


    //---
    return(INIT_SUCCEEDED);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
    {
    //---
    //ObjectDelete("ligne11";);
    }
    //+------------------------------------------------------------------+
    //| Expert tick function |
    //+------------------------------------------------------------------+
    void OnTick()
    {
    //---


    if(ObjectFind("ligne11";)<0){
    ObjectDelete("ligne11";);ObjectCreate("ligne11", OBJ_HLINE, 0, iTime(Symbol(),Period(),40), Bid+200*(Point*dig(Symbol())) );ObjectSet("ligne11", OBJPROP_COLOR,BlanchedAlmond);ObjectSet("ligne11", OBJPROP_STYLE,STYLE_DOT);}

    prix_sl = ObjectGet("ligne11", OBJPROP_PRICE1);

    if(prix_sl<Bid) {typ_pos = "achat"; pref = "d'";} if(prix_sl>Ask) {typ_pos = "vente"; pref="de ";}


    perte_pips = MathMin( diff_pips(Symbol(),prix_sl,Bid),diff_pips(Symbol(),prix_sl,Ask) ) + MarketInfo(Symbol(),MODE_SPREAD)/(dig(Symbol())*10) ;


    A_perdre = MM * 0.01 * AccountFreeMargin() ;




    volume = A_perdre / ( perte_pips * (MarketInfo(Symbol(),MODE_TICKVALUE)*(dig(Symbol())*10)) ) ;

    //Comment("Tick value in the deposit currency= "+MarketInfo(Symbol(),MODE_TICKVALUE)+"\n"+DoubleToString(Point,5)+"\n"+MarketInfo(Symbol(),MODE_SPREAD));

    Comment(
    "\nEquité: "+AccountEquity()+" Marge disponible: "+AccountFreeMargin()+" "+AccountCurrency()+
    "\nMM: "+MM+"% // je suis prêt à perdre: "+A_perdre+" "+AccountCurrency()+
    "\n\nEventuelle perte en pips (y compris spread "+MarketInfo(Symbol(),MODE_SPREAD)/(dig(Symbol())*10)+";): "+DoubleToString(perte_pips,2)+" pips\n"+
    "volume pour cette position "+pref+typ_pos+": "+DoubleToString(volume,2));
    //





    }
    //+------------------------------------------------------------------+

    Modifié le 2017-11-27 15:28:56 par AliX : [code]
    riden a joint une image
    ea-qui-donne-le-volume-de-la-position-en-fonction-du-stoploss-indique-en-prix-et-pas-en-pips-10758
  • riden

    certains symboles ont été remplacés par des Smiley. Remplaces les quatre smiley par :
    )
  • gravdigaz6

    j'ai testé ça fonctionne parfaitement merci!!
    Le top serai qu'après que l'on ai positionné notre stoploss; le volume de la position donné se mette automatiquement à la place du volume par défaut du ticket d'ordre.
    Là on sera au top!

    Si tu peux faire cela c'est génial si non merci beaucoup c'est déjà superbe.
  • riden

    Malheureusement MT4 ne le permet pas.
    Cela est possible en full automatique avec OrderSend mais en prise de position manuelle on peut choisir un volume fixe par défaut ou le volume de la dernière position.
  • riden

    Merci Alix, j'ai oublié comment insérer un code (ça fait longtemps que je l'ai pas fait) :)

    La ligne ci-dessous a été divisée sur trois, peux-tu la remettre en une seule ligne ou mette // devant la deuxième et la troisième (sinon erreur de compilation , car c'est un commentaire)

    //Comment("Tick value in the deposit currency= "+MarketInfo(Symbol(),MODE_TICKVALUE)+"\n"+DoubleToString(Point,5)+"\n"+MarketInfo(Symbol(),MODE_SPREAD))
    ;
    Modifié le 2017-11-27 12:42:38 par riden
  • gravdigaz6 — en réponse à riden dans son message #109972

    Salut, petite amélioration possible; lorsque je bouge la ligne du stoploss le résultat de la distance en pips et donc du volume de la position ne se met à jour qu'au prochain pips du coup lorsque le marché est plus que calme faut attendre 20 secondes parfois pourrais-tu changer cela?

    Merci.
  • AliX — en réponse à riden dans son message #109973

    riden, le 27/11/2017 dit :
    Merci Alix, j'ai oublié comment insérer un code (ça fait longtemps que je l'ai pas fait) :) La ligne ci-dessous a été divisée sur trois, peux-tu la remettre en une seule ligne ou mette // devant la deuxième et la troisième (sinon erreur de compilation , car c'est un commentaire) //Comment("Tick value in the deposit currency= "+MarketInfo(Symbol(),MODE_TICKVALUE)+"\n"+DoubleToString(Point,5)+"\n"+MarketInfo(Symbol(),MODE_SPREAD)) ;


    Hello, écoute j'ai enlevé les balises codes du coup parce que lors de la modération cela ne change rien, donc je ne voyais pas d'erreur par rapport a ce que tu décris...
    Tu peux éditer toi même pendant 30 min si jamais tu veux reposter un code une fois et qu'il y aurait des erreurs avec la balise code ;)
    Modifié le 2017-11-27 15:32:28 par AliX
  • riden — en réponse à gravdigaz6 dans son message #109975

    gravdigaz6, le 27/11/2017 dit :
    Salut, petite amélioration possible; lorsque je bouge la ligne du stoploss le résultat de la distance en pips et donc du volume de la position ne se met à jour qu'au prochain pips du coup lorsque le marché est plus que calme faut attendre 20 secondes parfois pourrais-tu changer cela? Merci.


    Oui la fonction OnTick() comme son nom l'indique s'exécute à chaque changement de prix. Je vais trouver une solution lorsque je rentres à la maison le soir.
  • riden

    Voilà maintenant ça actualise chaque seconde.

    Code
    //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ extern string info = "Le MM doit être compris entre 0 et 100%"; extern double MM = 2; double prix_sl, volume,perte_pips,A_perdre; string typ_pos, pref; //-----------------------------------------compatibité 2 & 4 digits--------------------------------------- double dig(string paire){ if( (MarketInfo(paire,MODE_DIGITS)==4) || (MarketInfo(paire,MODE_DIGITS)==2) ) return(0.1); if( (MarketInfo(paire,MODE_DIGITS)==3) || (MarketInfo(paire,MODE_DIGITS)==5) ) return(1.0);return(1.0);} //---------------------------------------------Diff en pips entre deux niveau de prix-----------------------------// double diff_pips(string paire, double p1, double p2){ double res; res=MathAbs(p1-p2)/(MarketInfo(paire,MODE_POINT)*10*dig(paire)); return(res);} //--------------------------------------------------------------------------------------------------------------- int OnInit() { //--- create timer EventSetTimer(1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- if(ObjectFind("ligne11")<0){ ObjectDelete("ligne11");ObjectCreate("ligne11", OBJ_HLINE, 0, iTime(Symbol(),Period(),40), Bid+200*(Point*dig(Symbol())) );ObjectSet("ligne11", OBJPROP_COLOR,BlanchedAlmond);ObjectSet("ligne11", OBJPROP_STYLE,STYLE_DOT);} prix_sl = ObjectGet("ligne11", OBJPROP_PRICE1); if(prix_sl<Bid) {typ_pos = "achat"; pref = "d'";} if(prix_sl>Ask) {typ_pos = "vente"; pref="de ";} perte_pips = MathMin( diff_pips(Symbol(),prix_sl,Bid),diff_pips(Symbol(),prix_sl,Ask) ) + MarketInfo(Symbol(),MODE_SPREAD)/(dig(Symbol())*10) ; A_perdre = MM * 0.01 * AccountFreeMargin() ; volume = A_perdre / ( perte_pips * (MarketInfo(Symbol(),MODE_TICKVALUE)*(dig(Symbol())*10)) ) ; Comment( "\nEquité: "+AccountEquity()+" Marge disponible: "+AccountFreeMargin()+" "+AccountCurrency()+ "\nMM: "+MM+"% // je suis prêt à perdre: "+A_perdre+" "+AccountCurrency()+ "\n\nEventuelle perte en pips (y compris spread "+MarketInfo(Symbol(),MODE_SPREAD)/(dig(Symbol())*10)+"): "+DoubleToString(perte_pips,2)+" pips\n"+ "volume pour cette position "+pref+typ_pos+": "+DoubleToString(volume,2)); // }