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

Scalper-GG-7

  • lefeuvr3

    Chers amis
    Il serait formidable que certains refassent un Backtest de meilleur qualite que le mien avec un meilleur modelage
    et propose les parametres,obtenus, à la suite.
    Pour le mettre dans une situation difficile j'ai mis un spread de 10 dans mon backtest qui ne presente malheureusement qu'une qualite de modelage de 25 %.

    La strategie consiste en la mise en place simultanée d'un Buystop et d'un Sellstop en utilisant des moyennes sur la hauteur des bougies ,sur la moyenne de Moyenne mobille en position Mode Low et Mode High avec l'utilisation de differents filtres de protection ,associes (ADX RSI volume).
    Si des corrections ou ameliorations sont proposées ,elles seront bienvenues.


    Code
    //+------------------------------------------------------------------+ //| Scalper-GG-7.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 string mn="Scalper-GG-8"; double lot; extern bool trail=true; extern int TrailingStop=1; extern int barnumber =3; extern int MagicNumber=14072020; extern double TakeProfit=31; extern double StopLoss=34; extern int volume1=1; extern int volume0=0; extern int adxperiod= 31; extern int adxthreshold=23; extern int rsiperiod=21; extern int rsilower =48; extern int rsiupper =80; extern int Slippage=3; extern int Indicatorperiod = 85; input int MaxSpreadAllow = 10; // Enter Maximum allowed spread extern double LotFactor =134; //lotsize factor extern int ecartask=7; extern int ecartbid=12; extern int Start_Time = 0; // Time to allow trading to start ( hours of 24 hr clock ) 0 for both disables extern int Finish_Time = 0; // Time to stop trading ( hours of 24 hr clock ) 0 for both disables //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ // expert start function //+------------------------------------------------------------------+ int start() { if(TimeHour(TimeCurrent())>=Start_Time && TimeHour(TimeCurrent())<=Finish_Time )return(0); double MyPoint=Point; if(Digits==3 || Digits==5) MyPoint=Point*10; double TheStopLoss=0; double TheTakeProfit=0; double booster = Volume[volume1]> Volume[volume0] &&iADX(Symbol(),0,adxperiod,PRICE_CLOSE,MODE_MAIN,0)> adxthreshold &&iRSI(Symbol(),0,rsiperiod,PRICE_CLOSE,0)>rsilower && iRSI(Symbol(),0,rsiperiod,PRICE_CLOSE,0)<rsiupper ; // if( TotalOrdersCount()==0 ) { int result=0; 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; } // Get Ask and Bid for the currency double ask = MarketInfo ( Symbol(), MODE_ASK ); double bid = MarketInfo ( Symbol(), MODE_BID ); 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))) if(booster) { //+------------------------------------------------------------------+ // Here is your open buy rule // Calculate a channel on candels, and check the price 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 )); double AverageBars=(HighOfLastBars +LowOfLastBars)/2 ; double PartialLow=((LowOfLastBars+AverageBars)/2); double PartialHigh = ((HighOfLastBars+AverageBars)/2); // Calculate a channel on Moving Averages, and check the price double iMaLow = iMA ( Symbol(), PERIOD_M1, Indicatorperiod, 0, MODE_LWMA, PRICE_LOW, 0 ); double iMaHigh = iMA ( Symbol(), PERIOD_M1, Indicatorperiod, 0, MODE_LWMA, PRICE_HIGH, 0 ); double iMaAverage = (iMaHigh + iMaLow)/2; double PartialiMalow = (iMaLow + iMaAverage) / 2.0; double PartialiMahigh =(iMaHigh + iMaAverage) / 2.0; double UpperPart=(PartialiMahigh+PartialHigh)/2; double LowerPart= ( PartialiMalow+ PartialLow)/2; if (bid>= PartialiMahigh ) if (bid>= PartialHigh ) //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ result=OrderSend(Symbol(),OP_BUYSTOP, NR(Lot_Volume()),Ask +ecartask*Point,5,PartialLow -StopLoss*Point,PartialHigh +TakeProfit*Point,"Scalper-GG-8",MagicNumber,0,clrLimeGreen); if(result>0) { TheStopLoss=0; TheTakeProfit=0; if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint; if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint; if( OrderSelect(result,SELECT_BY_TICKET)) bool modif1= OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,clrLawnGreen); } return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // Here is your open Sell rule/ // Calculate a channel on candels, and check the price 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 )); double AverageBars=(HighOfLastBars +LowOfLastBars)/2 ; double PartialLow=((LowOfLastBars+AverageBars)/2); double PartialHigh = ((HighOfLastBars+AverageBars)/2); // Calculate a channel on Moving Averages, and check the price double iMaLow = iMA ( Symbol(), PERIOD_M1, Indicatorperiod, 0, MODE_LWMA, PRICE_LOW, 0 ); double iMaHigh = iMA ( Symbol(), PERIOD_M1, Indicatorperiod, 0, MODE_LWMA, PRICE_HIGH, 0 ); double iMaAverage = (iMaHigh + iMaLow)/2; double PartialiMalow = (iMaLow + iMaAverage) / 2.0; double PartialiMahigh =(iMaHigh + iMaAverage) / 2.0; double UpperPart=(PartialiMahigh+PartialHigh)/2; double LowerPart= ( PartialiMalow+ PartialLow)/2; if (PartialiMalow <= bid) if (PartialLow <= bid) //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ { result=OrderSend(Symbol(),OP_SELLSTOP, NR(Lot_Volume()),Bid-ecartbid*Point,5,PartialHigh +StopLoss*Point,PartialLow -TakeProfit*Point,"Scalper-GG-8",MagicNumber,0,clrRed); if(result>0) { TheStopLoss=0; TheTakeProfit=0; if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint; if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint; if( OrderSelect(result,SELECT_BY_TICKET)) bool modif2= OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,clrMagenta); } return(0); } } for(int cnt=0;cnt<OrdersTotal();cnt++) { if( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber ) { if(OrderType()==OP_BUY) { if(TrailingStop>0) { if(Bid-OrderOpenPrice()>MyPoint*TrailingStop) { if(OrderStopLoss()<Bid-MyPoint*TrailingStop) { bool modif3= OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green); return(0); } } } } else { if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop)) { if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0)) { bool modif4= OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); } int TotalOrdersCount() { int result=0; for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS ,MODE_TRADES)) if (OrderMagicNumber()==MagicNumber) result++; } return (result); } //+------------------------------------------------------------------+ // ( 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
    scalper-gg-7-12288
  • R231

    tu voudrais simplement refaire ce même backtest sur un historique différent ? attention, la qualité de modelage ne reflète pas vraiment la qualité de l'historique. en réalité le pourcentage est simplement écrit dans le fichier il n'est pas calculé en fait. si par exemple je prend un historique et que je le modifie de façon à ce qu'il soit mauvais, il suffit que j'écrive 99% dans le fichier pour que ça soit écrit 99% sur la backtest ;)

    ton backtest provient de quel broker ?
  • R231

    Pour coller ton code dans metaeditor directement sans erreur et simplement le compiler tu fais comment ? (perso je ne touche jamais au code sous metatrader dsl)
  • lefeuvr3

    Bonjour R231
    Mon Broker est Activetrades
    Pour mettre mon programme dans metaeditor,il suffit d'aller dans fichier en haut a gauche et de cliquer sur nouveau ...cela cree un nouveau programme auquel il suffit de mettre le nom du programme que l'on colle a ce niveau là...facile comme "bonjour".
    Je l'ai mis en live sur ma plateforme mais j'aimerais avoir confirmation des parametres.
    Bonne soirée
    Gerard
  • R231

    Mince alors, c'est pourtant exactement ce que j'avais fait :/
    mais regarde j'ai 128 erreurs :(
    R231 a joint une image
    scalper-gg-7-12289
  • lefeuvr3

    Bonjour
    Je me demande si en fait ta plateforme n'est pas en MT5 alors que mon programme est en MT4 pour expliquer des erreurs..
    Si tu veux on peut avec Team Viewer aller sur mon ordi ou le tien pour regler ce bug
    A+
    Gerard
  • R231

    ah si je suis sous mt5 ! mince je ne sais pas pourquoi je me suis mis en tête que tu étais sous mt5
  • Matthieuw31

    Bonjour Lefeuvr3,

    J'ai fait le backtest avec les mêmes paramètres d'entrée et spread que toi et sur la même période. Le broker utilisé est Vantage FX.
    Je n'ai pas eu le temps de regarder en détail le programme ou le rapport mais au final j'obtiens un rapport très semblable au tiens.
    A première vue c'est intéressant, il faudra que je fasse d'autres backtests sur de plus petites périodes.

    Par contre chez Vantage, j'ai plutôt un spread autour de 15 que de 10 sur l'EURUSD. A combien as-tu le spread généralement chez Activtrades?
    Matthieuw31 a joint une image
    scalper-gg-7-12290
  • R231

    quand vous réglez votre spread vous le réglez bien par rapport à la 4eme décimale pas la 5ème ?
  • R231

    ah non, après vérification il semblerait que mT4 prenne le spread sur la dernière décimale. ce qui fait que moi qui test mes robots sur EURUSD avec un spread de 5 et un slippage de 3 pour chaque position il faudrait que je mette 80 de spread sur MT4 pour arriver à la même chose. :/
  • Matthieuw31 — en réponse à R231 dans son message #119359

    Salut R231, oui effectivement, c'est bien par rapport à la 5ème décimale. Par contre, un spread de 5 pips et un slippage de 3 pips me paraissent énormes pour cette devise, même en voulant être majorant car au final ça fait un spread de 8 pips.
    Pourquoi prends-tu de si grosses valeurs?
  • R231 — en réponse à Matthieuw31 dans son message #119360

    je me met le plus de bâtons dans les roues possibles, un spread de 5 à 10 n'est pas déconnant en cas de fort décalage. Si mes algos passent comme ça je n'ai plus peur ni du broker, ni de la cotation, ni du slippage, ni de la latence... et dans tous les cas, les résultats ne pourront être que meilleurs si les spreads sont plus faibles ;)

    C'est une des règles essentielle quand on développe des algos. Un algo doit survivre avec des frais 3 à 5 fois supérieurs (hors frais fixes) à la norme habituelle. sinon c'est poubelle ;)
  • Matthieuw31

    OK, j'avais en vue aussi d'avoir des spreads plus élevés pour les backtests, mais avec des spreads 3 à 5 fois supérieurs je risque de galérer à pondre un truc rentable! Je prends cette remarque en compte. J'ajoute que dans mes programmes je teste le spread avant de passer un ordre pour éviter les abus.
  • R231

    test au moins avec 3 fois le spread cible. n'ajoute pas de slippage ni de latence à tes backtest. mais ajoute quand même au minimum 3 fois le spread ;)
    le problème c'est qu'il y a une différence énorme entre la manière dont fonctionne les particuliers et le milieux professionnel sur leur développement d'algos.

    Les particuliers cherchent à tout pris à faire 1 seul algo qui fonctionne très fort et surtout qui fait beaucoup de trades ! en réalité les systèmes qui durent dans le temps et surtout qui sont robustes prennent beaucoup moins de trades que ce que voudraient les traders particuliers. Il vaut mieux faire 5 algos robustes qui performent et travaillent bien entre eux, qu'un seul algo pour faire la même performance. Un algo qui sur-performe n'est jamais robuste.

    Il est forcément risqué de l'utiliser car il est soit :
    - overfit au bruit
    - overfit au marché
    - overfit à la phase de marché
    - sur-optimisé par ses paramètres
    - overfit par son "degré de liberté"

    ou pire :
    - martingale, moyennage, hedge
    - biais du survivant

    voilà voilà :)


    PS: j'ajoute que devoir faire 5 algos fonctionnel peut faire peur à certains, mais j'ai oublié de dire qu'il était aussi possible de faire un algo par exemple fonctionnel (et testé) sur 5 paires de devises et de laisser tourner l'algo sur chaque paire :) ce qui fait qu'il ne faut JAMAIS se focaliser sur 1 seul backtest mais sur les résultat de l’ensemble !
    Modifié le 2020-07-16 16:16:41 par R231
  • Matthieuw31

    OK merci pour ces précisions supplémentaires. Je vais donc faire mes tests avec des spreads multipliés par 3 par rapport à la moyenne.

    Je vais d'abord commencer par essayer de trouver des historiques fiables. Je pense que celui de l'EURUSD en 1 minute doit pas être trop mauvais puisque j'obtiens sensiblement le même résultat que Lefeuvr3 qui utilise les données d'un autre broker.
  • R231

    si tu as retelechargé les données eurusd sur les 20 dernières années elles ont probablement été prisent sur les serveurs metaquotes et non ceux du broker. ce qui, en théorie, ferait que vous aviez les mêmes historiques (en tout cas sur les données manquantes donc éloignées)
  • Matthieuw31 — en réponse à R231 dans son message #119366

    Ah OK, effectivement oui, ce que tu dis est fort probable. Donc dur de dire si c'est fiable...
  • lefeuvr3

    https://www.mataf.net/fr/forex/edu/guide-metatrader/metatrader-telecharger-un-historique-de-cours

    Téléchargement de données de MetaQuotes
    MetaQuotes vous permet de télécharger des données depuis leur «History Centrer».

    Pour cela ouvrez la plateforme MT4 et appuyer sur la touche F2 (ou bien menu Outils -> Archives) et vous aurez une pop-up pour les données historiques comme ci-dessous.

    Le téléchargement se fait paire par paire et non globalement pour toutes les paires. Vous devez donc choisir une paire et cliquer sur télécharger en bas à gauche.

    Si vous voulez l'historique de plusieurs paires il faut effectuer cette opération pour chaque paire.

    Vous aurez à ce moment une autre pop-up d'information vous disant que les données historiques de MetaQuotes peuvent être différentes des données historiques de votre broker et donc que ces données ne peuvent être utilisées pour régler des différents avec votre broker.

    Cliquez sur Ok. Le téléchargement commence et peut prendre un peu de temps. Une fois le téléchargement terminé vous pouvez ouvrir la paire, choisir une unité de temps et voir les données.

    On peut voir en haut de la fenêtre Base: 65000 / 3003184. Ceci veut dire que toutes les données disponibles ne sont pas utilisées mais seulement 65000. Pour remédier à ce problème il faut augmenter le nombre de données que MetaTrader peut accepter.

    Pour cela allez dans Outil -> Options, onglet Graphiques.

    Changez les valeurs de «Maxi bars dans» (il manque la traduction pour historique et graphique) à une valeur max du type 999999999999 et cliquez sur Ok.

    Redémarrez la plateforme et maintenant toutes les données sont prises en compte.
    Modifié le 2020-07-18 11:35:38 par lefeuvr3
  • R231 — en réponse à lefeuvr3 dans son message #119374

    voilà c'est exactement ça !
    bon le problème c'est que peut importe le broker, le backtest sera très sensiblement le mêem puisque l'historique sera le mêem chez tout le monde... :/