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

EA MT4 Mise en place d'ordre StopBuy et StopSell simultanément

  • lefeuvr3

    Dès qu'un ordre d’achat ou de vente est passé....les ordres en attente sont supprimés.

    EURUSD 1mn
    Code
    //+------------------------------------------------------------------+ //| eaxtwoependingaorders.5.volatility.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern int MagicNumber=20100807; //magic extern string Name_EA = "eaxtwoependingaorders .1" ; extern double LotFactor =198; //lotsize factor double lot; extern int barnumber =51; // extern int TakeProfitBuystop = 41; extern int TakeProfitSellstop = 42; extern int StopLossBuystop = 60; extern int StopLossSellstop = 20; // //extern int TakeProfit = 100; //extern int StopLoss = 140; // extern int ecartask=6; extern int ecartbid=8; int last_bar = 0; extern bool trail=true; extern double TrailingStop=1; input int MaxSpreadAllow = 10; // Enter Maximum allowed spread //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double MyPoint=Point; if(Digits==3 || Digits==5) MyPoint=Point*10; new_del () ; // // if (last_bar == Bars) return(0); //last_bar = Bars; // static datetime tmeBar0; bool newBar = false; if ( tmeBar0 != Time[0] ) { tmeBar0 = Time[0]; newBar = true; } double Spread = MarketInfo(Symbol(), MODE_SPREAD); // This will Obtain broker Spread for current pair if(Spread > 0 && Spread <= MaxSpreadAllow) // This part compares broker spread with maximum allowed spread, and refuse trade if maxSpread is exceeded if ( OrdersTotal () == 0 ) if(AccountFreeMargin()>(1000*(AccountEquity() * 0.01 /LotFactor))) { double HighOfLastBars = iHigh ( Symbol (), PERIOD_M1 , iHighest ( Symbol (), PERIOD_M1 , MODE_HIGH, barnumber , 0 )); double LowOfLastBars = iLow ( Symbol (), PERIOD_M1 , iLowest ( Symbol (), PERIOD_M1 , MODE_LOW, barnumber , 0 )); int buystop = OrderSend(Symbol(),OP_BUYSTOP, NR(Lot_Volume()),Ask +ecartask*Point,5,LowOfLastBars-StopLossBuystop*Point,HighOfLastBars +TakeProfitBuystop*Point,"eaxtwoependingaorders .1",MagicNumber,0,clrBlue); int sellstop = OrderSend(Symbol(),OP_SELLSTOP, NR(Lot_Volume()),Bid-ecartbid*Point,5,HighOfLastBars +StopLossSellstop*Point,LowOfLastBars-TakeProfitSellstop*Point,"eaxtwoependingaorders .1",MagicNumber,0,clrBlue); } return ( 0 ); } //-------------------- ( to close pending order) --------------- int new_del() { if(trail) trail(); int i,a; int total = OrdersTotal(); string comentario,par; for (i=total-1; i >=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) { for (a=total-1; a >=0; a--) { if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES)) if(OrderType()==OP_SELLSTOP) { bool modify1= OrderDelete(OrderTicket()); Print("Deleting SELL_STOP"," Ordertype:",OrderType()); return(1); } if(OrderType()==OP_BUYSTOP) { bool modify2= OrderDelete(OrderTicket()); Print("Deleting BUY_STOP"," Ordertype:",OrderType()); return(1); } } } } return ( 0 ); } //+------------------------------------------------------------------+ //| Trailing Stoploss après Breakeven | //+------------------------------------------------------------------+ void trail() { for (int i = OrdersTotal()-1; i >= 0; i --) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(Bid - OrderOpenPrice() > TrailingStop *10* MarketInfo(OrderSymbol(),MODE_POINT)) { if(((OrderStopLoss() < Bid - TrailingStop *10* MarketInfo(OrderSymbol(), MODE_POINT))&& ((Bid-OrderOpenPrice())>(Point*TrailingStop)))|| (OrderStopLoss()==0)) { bool modify1=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*10*MarketInfo(OrderSymbol(),MODE_POINT),OrderTakeProfit(),clrGreenYellow); } } } else if(OrderType()==OP_SELL) { if(OrderOpenPrice()-Ask>TrailingStop*10*MarketInfo(OrderSymbol(),MODE_POINT)) { if(((OrderStopLoss()>Ask+TrailingStop*10*MarketInfo(OrderSymbol(),MODE_POINT))&& ((OrderOpenPrice()-Ask)>(Point*TrailingStop)))|| (OrderStopLoss()==0)) { bool modify2=OrderModify(OrderTicket(),OrderOpenPrice(), Ask+TrailingStop*10*MarketInfo(OrderSymbol(),MODE_POINT),OrderTakeProfit(),clrGreenYellow); } } } } } } //+------------------------------------------------------------------+ //Calculates Lot Size based on balance and factor //+------------------------------------------------------------------+ double NR(double thelot) { double maxlots=MarketInfo(Symbol(),MODE_MAXLOT), minilot=MarketInfo(Symbol(),MODE_MINLOT), lstep=MarketInfo(Symbol(),MODE_LOTSTEP); double lots=lstep*NormalizeDouble(thelot/lstep,0); lots=MathMax(MathMin(maxlots,lots),minilot); return (lots); } //+------------------------------------------------------------------+ double Lot_Volume() { lot=AccountEquity() * 0.01 /LotFactor ; return(lot); } //+------------------------------------------------------------------+
    lefeuvr3 a joint une image
    ea-mt4-mise-en-place-d-ordre-stopbuy-et-stopsell-simultanement-12271
  • R231

    salut, perso je ne bosse qu'avec des ordres dans stop moi aussi et les résultats sont toujours bien meilleurs. Par contre les backtest sont tellement plus long...
    c'est énorme 4600 trades en si peu de temps ? ton backtest a du être long non ?
  • lefeuvr3

    Bonjour ...non ...le backtest n'est que sur 2 mois....il a fallu que je me casse un peu la tête ...cette stratégie a déjà été étudiée plusieurs fois mais avec une erreur reprise dans tous les EA ...erreur que j'ai retrouvée et corrigée.
  • Matthieuw31

    Bonjour Lefeuvr3,

    J'ai backtesté ton code en tick par tick, avec les mêmes paramètres d'entrée mais j'obtiens un résultat totalement différent. La seule différence est que nous n'utilisons pas les mêmes brokers (Activtrades pour toi et Vantage FX pour moi). Est-ce que seul le changement de broker et donc d'historique justifie une telle différence? Ça me paraît bizarre.

    En fait, j'ai pas mal d'idées à tester mais la fiabilité des backtests me rebute. As-tu confiance en tes backtests? Si oui, quels sont tes conseils pour avoir des backtests fiables?
    Matthieuw31 a joint une image
    ea-mt4-mise-en-place-d-ordre-stopbuy-et-stopsell-simultanement-12275
  • lefeuvr3

    Bonjour ....il est un fait que le backtests sont assez imparfaits du fait de la variation des spread sur les 24 heures ...
  • Matthieuw31

    Exact mais pour moi ce n'est pas le point bloquant: dans mes backtests je prends un spread assez élevé et dans mes programmes, je prends l'ordre si le spread actuel est en dessous d'une valeur max prédéfinie.

    Je pense qu'il y a d'autres facteurs qui font que les backtests ne sont pas aussi fiables qu'ils le devraient. Lorsque tu testes en live des robots ayant fait leurs preuves en backtests, est-ce que les résultats sont bons?
  • lefeuvr3

    les resultats sont inconstants ...je backteste en ce moment avec un ecart de spread de 10...et j'interdis au robot de trader a + de 10
  • R231 — en réponse à Matthieuw31 dans son message #119278

    le fait de changer de broker à une incidence certaines. l'objectif pour un algo c'est qu'elle soit minimale. Or, le problème d'un broker à l'autre ce n'est que rarement la cotation mais la qualité de l'historique. en fait la cotation sera partout sensiblement la même (si le broker est plus ou moins réglo) par contre l'historique chez le broker n'a rien à voir avec les données enregistrées en temps réelle par leur cotation, souvent, plus tu remonte dans l'historique, plus c'est un historique "reconstitué" et ça c'est souvent la merde...

    par exemple il est possible que tu te retrouve avec des bug de mèches sur une partie de ton historiques (parfois plusieurs années alors que la cotation originale à ce moment là chez ce même broker n'est avait pas. ça va biaiser tes backtest et tes résultats alors que probablement que l'algo serait fonctionnel.

    Pour en être certain il faut que tu importes toi même un historique dont tu es certain de la qualité.

    Si tu es certain de ton historique et que l'algo ne fonctionne pas dessus mais fonctionnait sur un autre, c'est qu'il est overfit et donc non robuste. c'est systématiquement direction la poubelle...

    Pour pallier à ça il faut obligatoirement passer des tests de robustesse en dégradant volontairement ton historique (celui qui est fiable et dont tu es sûr de la qualité). Personnellement, je test ma stratégie sur mon historique et ensuite je retest sur 200 historiques dégradés aléatoirement pour vérifier la stabilité des performances. Si la perf chute, alors c'est clairement de l'overfit. Si ça tient la route, c'est que ma stratégie est robuste et que peu importe le broker je ne risque absolument rien même si certaines bougies ne sont pas justes ;)
  • Matthieuw31

    Oui les résultats en réel ne reflètent pas les backtests, c'est pourquoi je cherche des pistes pour avoir des backtests les plus fiables possibles, car en l'état actuel j'ai l'impression que le backtest ne sert à rien.
  • R231 — en réponse à Matthieuw31 dans son message #119283

    ils peuvent refléter la réalité mais il faut leur faire passer beaucoup de tests... c'est beaucoup de boulot (bien plus que la stratégie elle même) mais c'est indispensable.

    le strict minimum c'est :
    - historique le plus long possible (pour ne pas être overfit sur une phase ou un sens de marché)
    - modification aléatoire de l'historique (pour ne pas être overfit sur le bruit d'un historique particulier)
    - modification aléatoire des paramètres des indicateurs, sl, tp etc... (pour ne pas se retrouver avec un stratégie sur-optimisée)
    - slippage + spread aléatoire et superieurs à la normale (pour ne pas avoir des résultats trop optimistes par rapport à la réalité)
    - plusieurs test Out of sample (pour faire de vrais tests à l'aveugle)

    mais c'est vraiment le minimum du minimum, c'est loin d'être assez pour être représentatif.

    Mais tu as à 100% raison, en l'état actuel, un backtest ne sert quasiment à rien. c'est simplement la toute première étape du boulot simplement pour vérifier si une hypothèse mérite qu'on y passe un peu plus de temps ou non. ;) Les gens crachent souvent sur les backtest déjà parce qu'ils ne savent pas les lire mais en plus parce qu'ils imaginent que c'est l'objectif final :/
    Modifié le 2020-07-08 13:59:21 par R231
  • Matthieuw31

    Merci R231 pour ces précisions et idées.

    Ce qui me rebute le plus, c'est la fiabilité des données historiques: comment savoir si les données sont fiables? Par exemple ici, en backtestant le même programme avec les mêmes paramètres sur la même période mais avec les historiques de 2 brokers différents, on obtient 2 résultats complètement différents!
    Lefeuvr3 va trouver l'EA intéressant alors que personnellement je ne m'y serais pas penché plus après mon backtest.

    C'est ça mon vrai problème: avoir et être sûr d'avoir des données historiques fiables.
  • R231

    pour l'historique il faut soit l'acheter, soit le récupérer en live soit fouiller pour en trouver des gratuits mais c'est compliqué...
    pour s'assurer qu'un historique est fiable il faut le verifier par toi même, il existe des logiciels qui analysent chaque bougies et notes chaque potentielle erreur de cotation. si tu vois que tout est concentré à un endroit il faut vérifier pour voir si ce n'est pas un problème.

    attention, c'est aussi probable que ton historique soit bon et que celui de l'autre broker soit le mauvais et pourtanr, si le robot est créé sur le mauvais historique et fonctionne mais ne fonctionne plus sur le bon alors c'est que la stratégie est overfit et donc qu'elle est bonne pour la poubelles
  • lefeuvr3

    Nouveau backtest avec un spread de 10

    Code
    //+------------------------------------------------------------------+ //| eaxtwoependingaorders.5.volatility.mq4 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern int MagicNumber=20100807; //magic extern string Name_EA = "eaxtwoependingaorders .1" ; extern double LotFactor =150; //lotsize factor double lot; extern int barnumber =46; // extern int TakeProfitBuystop = 17; extern int TakeProfitSellstop = 10; extern int StopLossBuystop =84; extern int StopLossSellstop = 32; // //extern int TakeProfit = 100; //extern int StopLoss = 140; // extern int ecartask=15; extern int ecartbid=8; int last_bar = 0; extern bool trail=true; extern double TrailingStop=1; input int MaxSpreadAllow = 10; // Enter Maximum allowed spread
  • Matthieuw31 — en réponse à R231 dans son message #119292

    R231, le 09/07/2020 dit :
    pour l'historique il faut soit l'acheter, soit le récupérer en live soit fouiller pour en trouver des gratuits mais c'est compliqué... pour s'assurer qu'un historique est fiable il faut le verifier par toi même, il existe des logiciels qui analysent chaque bougies et notes chaque potentielle erreur de cotation. si tu vois que tout est concentré à un endroit il faut vérifier pour voir si ce n'est pas un problème. attention, c'est aussi probable que ton historique soit bon et que celui de l'autre broker soit le mauvais et pourtanr, si le robot est créé sur le mauvais historique et fonctionne mais ne fonctionne plus sur le bon alors c'est que la stratégie est overfit et donc qu'elle est bonne pour la poubelles


    Merci pour ces précisions, je n'avais pas eu le temps de répondre plus tôt.
    Si tu as des historiques gratuits ou payants fiables à me donner ou même un logiciel d'analyse, je suis preneur, ça me ferait peut-être gagner du temps!