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

Partage d'EA à modifier ou améliorer

  • Pickup

    Je vous joint un EA fini ou je dirait presque fini , car pour moi un EA fini cela n'existent pas car il doit être modifier pendant son cours de fonctionnement , celui-ci a de tout , MM ,martingale ect......enfin juste ce qu'il faut pour son fonctionnement qui est basé sur la taille de la bougie et pour un long terme . corriger si le code passe bien ou message privé et je vous le joint par mail.
    il peut -être profitable si il est bien exploiter , j'y travail justement . POUR MT4

    Code
    //+------------------------------------------------------------------+ //| TAILLE-BOUGIE-EA.mq4 | //| Copyright 2017, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #define SIGNAL_NONE 0 #define SIGNAL_BUY 1 #define SIGNAL_SELL 2 #define SIGNAL_CLOSEBUY 3 #define SIGNAL_CLOSESELL 4 extern int MagicNumber = 2009; extern bool SignalMail = False; extern bool EachTickMode = False; extern double Lots = 0.01; extern double IncLot=0.01; extern int Step=200; extern double MinProfit=1; extern bool ProfitManuel = true; extern double ProfitFactor=150; extern string comment="heure de trading"; extern double TailleBougie = 15; extern int Slippage = 3; extern bool UseStopLoss = false; extern int StopLoss = 20; extern bool UseTakeProfit = false; extern int TakeProfit = 20; extern bool UseTrailingStop = false; extern int TrailingStop = 30; extern bool UseMoneyManagement = true; //Use Money Management or not extern bool AccountIsMicro = true; //Use Micro-Account or not extern double Risk = 10; //10% extern double VMartingale = 1; extern int StartTime = 14; extern int EndTime = 16; double gLotSell=0; double gLotBuy=0; double LSP,LBP; int BarCount; int Current; double CurrentProfit; bool TickCheck = False; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { if(Digits == 3 || Digits == 5) { StopLoss *=10; TakeProfit *=10; TrailingStop *=10; Slippage *= 10; Step *= 10; } BarCount = Bars; if (EachTickMode) Current = 0; else Current = 1; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ double LotSize() { double lotMM = MathCeil(AccountFreeMargin() * Risk / 10000) / 100; if(AccountIsMicro==false) //normal account { if (lotMM < 0.1) lotMM = Lots; if (lotMM > 1000) lotMM = 1000; } else //micro account { if (lotMM < 0.01) lotMM = Lots; if (lotMM > 1000) lotMM = 1000; } return (lotMM); } int start() { int Order = SIGNAL_NONE; int Total, Ticket; double StopLossLevel, TakeProfitLevel; if (EachTickMode && Bars != BarCount) TickCheck = False; Total = OrdersTotal(); Order = SIGNAL_NONE; if( ProfitManuel==false ) ProfitFactor = 500; if(UseMoneyManagement==true && IncLot != 0) IncLot = LotSize(); if(UseMoneyManagement==true) MinProfit = Lots * ProfitFactor; CurrentProfit=GetOrdersProfit(MagicNumber); if (CurrentProfit>=MinProfit) { DeletePendingOrders(MagicNumber); CloseOrders(MagicNumber); } //+------------------------------------------------------------------+ //| Variable Begin | //+------------------------------------------------------------------+ double Buy1_1 = iMA(NULL, 0, 500, 0, MODE_SMA, PRICE_CLOSE, Current + 0); double Buy1_2 = iMA(NULL, 0, 500, 0, MODE_SMA, PRICE_CLOSE, Current + 1); //+------------------------------------------------------------------+ //| Variable End | //+------------------------------------------------------------------+ //Check position bool IsTrade = False; for (int i = 0; i < Total; i ++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) { IsTrade = True; if(OrderType() == OP_BUY) { //Close //+------------------------------------------------------------------+ //| Signal Begin(Exit Buy) | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Signal End(Exit Buy) | //+------------------------------------------------------------------+ if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy"); if (!EachTickMode) BarCount = Bars; IsTrade = False; continue; } //Trailing stop if(UseTrailingStop && TrailingStop > 0) { if(Bid - OrderOpenPrice() > Point * TrailingStop) { if(OrderStopLoss() < Bid - Point * TrailingStop) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen); if (!EachTickMode) BarCount = Bars; continue; } } } } else { //Close //+------------------------------------------------------------------+ //| Signal Begin(Exit Sell) | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Signal End(Exit Sell) | //+------------------------------------------------------------------+ if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell"); if (!EachTickMode) BarCount = Bars; IsTrade = False; continue; } //Trailing stop if(UseTrailingStop && TrailingStop > 0) { if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) { if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange); if (!EachTickMode) BarCount = Bars; continue; } } } } } } //+------------------------------------------------------------------+ //| Signal Begin(Entry) | //+------------------------------------------------------------------+ double OpenC = iOpen(NULL, 0, Current + 0); double CloseC = iClose(NULL, 0, Current + 0); double bull = - (TailleBougie / 10000); double bear = TailleBougie / 10000; double Dernier_Trade; double Dernier_Lot; double Dernier_Trade2; double Dernier_Lot2; double iLots; double CurrentProfit; bool martingale; CurrentProfit=GetOrdersProfit(MagicNumber); if (CurrentProfit>=MinProfit) { DeletePendingOrders(MagicNumber); CloseOrders(MagicNumber); } for(int j = 1; j < OrdersHistoryTotal(); j++) { if (OrderSelect(OrdersHistoryTotal() - j, SELECT_BY_POS, MODE_HISTORY) == true ) { Dernier_Trade = OrderProfit(); Dernier_Lot = OrderLots(); break; } } for(int k = 2; k < OrdersHistoryTotal(); k++) { if (OrderSelect(OrdersHistoryTotal() - k, SELECT_BY_POS, MODE_HISTORY) == true ) { Dernier_Trade2 = OrderProfit(); Dernier_Lot2 = OrderLots(); break; } } if ( Dernier_Trade < 0 ) martingale = true; if ( Dernier_Trade > 0 ) martingale = false; if (martingale == true) { iLots = Dernier_Lot * VMartingale ; } if (martingale == false) { iLots = Lots ; } double lotMM = MathCeil (AccountFreeMargin() * Risk / 10000) / 100; if(UseMoneyManagement==true) Lots = LotSize(); if (Buy1_1 > Buy1_2 && bull > (OpenC - CloseC) && TradeSession() == 1) Order = SIGNAL_BUY; if (Buy1_1 < Buy1_2 && bear < (OpenC - CloseC) && TradeSession() == 1) Order = SIGNAL_SELL; LSP=GetLastSellPrice(MagicNumber); LBP=GetLastBuyPrice(MagicNumber); //+------------------------------------------------------------------+ //| Signal End | //+------------------------------------------------------------------+ //Buy if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { if(!IsTrade) { //Check free margin if (AccountFreeMargin() < (1000 * Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0; if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0; Ticket = OrderSend(Symbol(), OP_BUY, iLots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue); if(Ticket > 0) { if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) { Print("BUY order opened : ", OrderOpenPrice()); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy"); } else { Print("Error opening BUY order : ", GetLastError()); } } if (EachTickMode) TickCheck = True; if (!EachTickMode) BarCount = Bars; return(0); } } //Sell if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) { if(!IsTrade) { //Check free margin if (AccountFreeMargin() < (1000 * Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0; if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0; Ticket = OrderSend(Symbol(), OP_SELL, iLots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink); if(Ticket > 0) { if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) { Print("SELL order opened : ", OrderOpenPrice()); if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell"); } else { Print("Error opening SELL order : ", GetLastError()); } } if (EachTickMode) TickCheck = True; if (!EachTickMode) BarCount = Bars; return(0); } } if (!EachTickMode) BarCount = Bars; if((LSP-Bid)<=5*Point) { OrderSend(Symbol(),OP_SELLLIMIT,gLotSell+IncLot,LSP+Step*Point,3,0,0,comment,MagicNumber,0,Red); } if((Ask-LBP)<=5*Point) { OrderSend(Symbol(),OP_BUYLIMIT,gLotBuy+IncLot,LBP-Step*Point,3,0,0,comment,MagicNumber,0,Red); } return(0); } int TradeSession() { if (StartTime < EndTime && TimeHour(TimeCurrent()) < StartTime || TimeHour(TimeCurrent()) >= EndTime) return (0); if (StartTime > EndTime && (TimeHour(TimeCurrent()) < StartTime && TimeHour(TimeCurrent()) >= EndTime)) return (0); if (EndTime == 0) EndTime = 24; if (Hour() == EndTime - 1 && Minute() >= 55) return (0); return (1); } double GetLastBuyPrice(int MagicNumber) { int total=OrdersTotal()-1; for (int cnt = total ; cnt >=0 ; cnt--) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUY)) { gLotBuy=OrderLots(); return(OrderOpenPrice()); break; } } return(0); } double GetLastSellPrice(int MagicNumber) { int total=OrdersTotal()-1; for (int cnt = total ; cnt >=0 ; cnt--) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber() == MagicNumber && OrderSymbol()==Symbol() && (OrderType()==OP_SELLLIMIT ||OrderType()==OP_SELL)) { gLotSell=OrderLots(); return(OrderOpenPrice()); break; } } return(100000); } double GetOrdersProfit(int Magic) { double gProfit=0; int total=OrdersTotal()-1; for (int cnt = total ; cnt >=0 ; cnt--) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL)) { gProfit=gProfit+OrderProfit(); } } return(gProfit); } int DeletePendingOrders(int Magic) { int total = OrdersTotal(); for (int cnt = total-1 ; cnt >= 0 ; cnt--) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && OrderType()!=OP_BUY && OrderType()!=OP_SELL) { OrderDelete(OrderTicket()); } } return(0); } int CloseOrders(int Magic) { int total = OrdersTotal(); for (int cnt = total-1 ; cnt >= 0 ; cnt--) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,3); } if (OrderType()==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,3); } } } return(0); } //+------------------------------------------------------------------+
    Modifié le 2017-05-06 11:48:37 par AliX : [code] [/code]
  • Pickup — en réponse à Pickup dans son message #108369

    teste simple en H1 .
    Pickup a joint une image
    ea-a-finir-de-pofine-a-votre-convenance-10610
  • Dabeuldi

    Bonjour Pickup,

    Un grand merci pour ce partage; très intéressant.
    Je travaille également de mon côté sur ce type de trading avec un mode "recovery" par martingale (en essayant de privilégier le low risk).

    Le principe est le suivant (cf. fic. joint) :

    - "Avoir une (bonne)raison pour ouvrir un trade"; mais pas nécessairement le mode "recovery" étant censé faire le job en reprenant la main sur une MV, (exemple : une IB (Inside Bar, ou un indicateur xx ou yy signalant une zone OB/OS)
    - Ouvrir ses ordres au risque le plus bas possible (ex. 0.01 p/compte à 1K€),
    - Appliquer un RATIO SL:TP élevé; à minima 1:5, ce qui autorise un coeff. de martingale très bas : 1.20,
    (ainsi on peut avoir jusqu'à 33 chgt. de sens, avant de se retrouver à 10% de risque (ce n'est qu'une stat, pas un exemple à suivre pour le MM !)
    - Et peut-être en supplt., ne trader que xx min. (120 ?) AVANT une sortie de stat. rouge, qui aura toutes les chances de déboucler une série de BUY/SELLS avec martingale.

    Je joins une copie d'écran avec un indic de stat maison. (je n'ai pas vu comment joindre plusieurs fichiers ? Sinon, je pourrais joindre également l'indic .mq4, et le fic. XLS de calcul de coeff. optimal)
    Sachant qu'en EU M1 par exemple, il y a en moyenne une centaine d'IB p/jours....Il y a peut-être une piste à creuser ?
    ________________

    Dans un autre ordre d'idée....

    J'ai regardé un peu ton code, et il y a une boucle qui semble faire doublon(?), et dont je ne saisi pas l'utilité.
    Pourrais-tu m'éclairer STP ?
    ...

    Code
    for(int k = 2; k < OrdersHistoryTotal(); k++) { if (OrderSelect(OrdersHistoryTotal() - k, SELECT_BY_POS, MODE_HISTORY) == true ) { Dernier_Trade2 = OrderProfit(); Dernier_Lot2 = OrderLots(); break; } }

    ...
    D'autant que les valeurs "Dernier_Trade2" et "Dernier_Lot2" ne sont utilisé nulle part après ? (juste un petit bug ?), et que celles qui déclenchent réellement la martingale, sont celles de la boucle jumelle juste au-dessus de celle-ci.
    Modifié le 2017-05-10 11:04:45 par AliX
    Dabeuldi a joint une image
    partage-d-ea-a-modifier-ou-ameliorer-10611
  • Pickup — en réponse à Dabeuldi dans son message #108442

    bonjour,
    oui cela concernent entry , si un ordre est déjà ouvert par le EA et que celui-ci est en positif l'ordre de la seconde ouverture ne se fera pas sur base de certaine conditions du EA ( martingale normal ou martingale inverse) - si il y a TP ou SL activé ou pas pour évité des ouvertures multiples qui parfois ne servent a rien , tout dépend comment tu présente ton EA et la formule que tu as choisis ! trade2 ou lot2 ne concernent que l'ouverture multiple si certaine chose sont prise en compte sur la formule que tu as choisis , c'est comme qui dirait une genre de sécurité qui ne tiendras pas en compte plusieurs ouvertures multiples , car des formules tu as le choix multiples , la martingale peux être inversée sur base du montant que tu as sur ton compte , si tu ouvrent a 1 dollars une positions et il se peux que elle ouvre une autres positions mais avec un prix plus bas car il se base sur la valeur de ton compte au moment de la prise de positions , le EA prendra positions par apport a la somme de ton compte , il peut être fixe ou multiple, tu peux calculer pour avoir un mini drawdow , tu peux choisir également les heures de trades ect...il ne donnera pas de même résultats sur chaque time choisis .
    Le mieux que j'ai constaté c'est en H4 ou H1 mais pas encore fait tout le tour complet , il est fini a 95 % , le reste concernent surement a y apporter des changements pendant sont évolutions , je crois que mon EA a un bon potentiel en lui même , mais rien n'est parfait .

    Bon potentiel pour tes indicateurs , cela serait moi j'y ajouterait deux moyenne mobiles ( 200 smoothed close et l'autre a 200 simple close ) , tu pourrais alors voir la tendance des croisements sur 200 ma , bon cela reste une idée qui ne tiendrais que de moi .
    Il est probable de en tirer certains avantage , peut-être sur un time M5 ou M15 .
    Il faudrait regler le IB pour qu'il s'enclenche beaucoup moins , voir même y placer sur le code des heures de trades( la nuit cela ne sert a rien ) voir même a certaine tendance de la journée par apport a des infos économique par exemple ^^
    Je pense que il aurait un bon potentiel .
  • Dabeuldi

    OK, Pickup.

    Merci pour toutes ces précisions.
    Je n'avais pas compris toutes les possibilités de cet EA.