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

Plusieurs EA mais un seul trade à la fois

  • lefeuvr3

    Bonsoir
    Je compte faire tourner plusieurs EA en même temps.
    Mon probleme est que je suis en flux tendu,car la taille des lots est en permanence evaluée en fonction du capital

    Code
    //+------------------------------------------------------------------+ double Lot_Volume() { lot=AccountBalance() * 0.01 /LotFactor ; return(lot); } //+------------------------------------------------------------------+

    Avec plusieurs EA sur la plateforme ,je ne peux donc supporter qu'un trade à la fois et je dois demander aux EA d'attendre qu'il n'y est plus de trades en cours pour se positionner...sinon je risque d'atteindre le margin call.

    J'ai donc integré un ligne avant les envois if (!IsTradeContextBusy() && IsTradeAllowed()) dans les programmes comme suit

    Code
    if (!IsTradeContextBusy() && IsTradeAllowed()) { ticketb=OrderSend(Symbol(),OP_BUY,NR(Lot_Volume()),Ask,3,slb,tpb,Name_EA,Magic,0,Blue); } //--------------------------// if (!IsTradeContextBusy() && IsTradeAllowed()) { tickets=OrderSend(Symbol(),OP_SELL,NR(Lot_Volume()),Bid,3,sls,tps,Name_EA,Magic,0,Red); }

    Qu'est ce que vous en pensez….peut on mieux faire ?
    Merci d'avance
    Gerard
  • Rengou

    Bonjour. S'il vous plait j'ai besoin du code pour

    1- Achat si prix monte de 20 pips.

    2- Vente si prix baisse de 20 pips. Je ne connais pas coder. Je veux voir à quoi ressemble la syntaxe. Merci
  • lefeuvr3

    Je ne sais pas coder non plus mais je veux bien essayer en faisant au plus simple dans 1° temps
    Code
    //+------------------------------------------------------------------+ //| RENGOU | //| QPG | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "QPG" #property link "https://www.mql5.com" #property version "1.00" //#property strict //+------------------------------------------------------------------+ extern int MagicNumber=31082018; extern double Lots =0.06; extern double StopLoss=90; extern double TakeProfit=50; extern int TrailingStop=50; extern int Slippage=3; double point = MarketInfo(Symbol(), MODE_POINT); int spread = MarketInfo(Symbol(), MODE_SPREAD); extern int size = 3; extern int shiftOpenBuy =0; extern int shiftCloseBuy =1; extern int shiftOpenSell =0; extern int shiftCloseSell =1; //+------------------------------------------------------------------+ // expert start function //+------------------------------------------------------------------+ int start() { double MyPoint=Point; if(Digits==3 || Digits==5) MyPoint=Point*10; double TheStopLoss=0; double TheTakeProfit=0; if( TotalOrdersCount()==0 ) { int result=0; //+------------------------------------------------------------------+ // Here is your open buy rule //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // Here is the beginning of your open buy rule strategy //+------------------------------------------------------------------+ if (iOpen(Symbol(),0, shiftOpenBuy)> iClose(Symbol(),0, shiftCloseBuy)+ (size + spread)*point) //+------------------------------------------------------------------+ // Here is the end of your buy rule strategy //+------------------------------------------------------------------+ { result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"EA MODEL",MagicNumber,0,Blue); 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,Green); } return(0); } //+------------------------------------------------------------------+ // Here is your open sell rule //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // Here is the beginning of your open sell rule strategy //+------------------------------------------------------------------+ if ( iOpen(Symbol(),0, shiftOpenSell)< iClose(Symbol(),0, shiftCloseSell)- (size + spread)*point) //+------------------------------------------------------------------+ // Here is the end of your sell rule strategy //+------------------------------------------------------------------+ { result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"EA MODEL",MagicNumber,0,Red); 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,Green); } 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) { if(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)) { if(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); }
    lefeuvr3 a joint une image
    plusieurs-ea-mais-un-seul-trade-a-la-fois-11051
  • lefeuvr3

    Je vais essayer dans la mesure de mes capacités de faire un programme un peu plu elaboré,afin de multiplier les trades et les gains !
    Je mettrai cette nouvelle version en ligne après l'avoir verifié et backtesté.
  • Rengou

    merci. en fait mon EA doit etre simple jai une strategie qui fonctione à 80 % en manuel.si je reussi son code, ca serai tres bien. actuellement je cherch à coder un EA qui trades lors des changement des couleurs du graphique renko.
    BUY if color blue appear
    SELL if color red appear
  • Rengou

    ou encore simple acheter ou vendre si le prix varie de 20 pips
  • riden — en réponse à lefeuvr3 dans son message #112426

    Salut,

    Tu peux utiliser OrdersTotal() pour dire à l'EA de ne pas ouvrir de position si le nombre de positions ouvertes est supérieur à n.
    Tu peux diviser le volume de la position sur 3 et allouer 3 jusqu'à positions ouvertes en simultané (if OrdersTotal()>=3 alors ne pas ouvrir une position).

    Tu peux , pour quelques positions gagnantes, modifier le SL à +1pip, laisser courir les gains et dire aux EA de ne pas compter ces positions (for(k=OrdersTotal()-1;k>=0;k--){
    if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)){if(OrderStopLoss()>OrderOpenPrice() etc... et vise versa pour les positions de vente.

    Puisque tu tarde avec plusieurs EA tu peux donner un magic number à chaque EA ensuite avec OrdersHistoryTotal() tu peux suivre en temps réel le taux de réussite de chaque EA et interdire un EA de prendre des positions si son taux baisse au-dessous d'un certain seuil.
    Tu peux même à travers les commentaires dans OrderSend() (puis OrdersHistoryTotal() et StringFind) avoir le taux de réussite de chaque EA selon chaque Paire de devise et chaque TF et l'interdire de trader sur une paire et un TF précis.

    Personnellement je préfère ne pas utiliser "extern" pour la déclaration des variables (sauf si tu comptes vendre ou partager ton EA). lors de l'enregistrement d'un modèle, les valeurs des variables "extern" sont aussi enregistrées, avec le temps tu vas probablement changer les valeurs de ces variables. mais lorsque tu charges un ancien modèle sur un graph. il va mettre les anciennes valeurs enregistrées en ignorant les nouvelles valeurs par défaut.
  • lefeuvr3

    celui que je viens de faire devrait te convenir ….tu n'as qu' a ajuster size comme tu le souhaites
  • lefeuvr3

    Merci
    riden
    Je vais étudier tes propositions de programme
  • lefeuvr3

    RENGOU ,
    Je ne peux pas faire plus simple ….au point de vu simplicité on ne peut faire même moins !
    Pour agir sur les pips on agit sur size
  • lefeuvr3

    Autre proposition de programme avec la même strategie

    Code
    //+------------------------------------------------------------------+ //| RENGOU 20_20 v3 | //| QPG | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "QPG" #property link "https://www.mql5.com" #property version "1.00" //#property strict //+------------------------------------------------------------------+ extern string Name_EA = " QPG KEEP COOL VERSION 3"; extern int MagicNumber=08112018; double lot ; extern double SL=90; extern double TP=90; extern bool TrailingStop_ = true; extern int TrailingStop=20; extern int Slippage=3; extern double LotFactor = 500; //lotsize factor extern int Max_order = 20; extern int size = 3; extern int Amount = 250; extern int LockDown = 310; double point = MarketInfo(Symbol(), MODE_POINT); int spread = MarketInfo(Symbol(), MODE_SPREAD); extern int shiftOpenBuy =0; extern int shiftCloseBuy =1; extern int shiftOpenSell =0; extern int shiftCloseSell =1; extern string tp="TP IN MONEY"; extern bool Tp_in_Money = true; extern double TP_in_money = 8;//agir sur ce levier extern bool Trade_buy = true; extern bool Trade_sell = true; extern int A=1; extern int B=0; extern string re="REGULATOR"; extern int adxperiod =7; extern int adxthreshold =33; extern int rsiperiod = 3; //rsi period extern int rsiupper = 80; //rsi upper bound, wont buy above this value extern int rsilower = 20; //rsi lower bound, wont sell below this value extern int Start_Hour = 22; extern int End_Hour = 23; extern int hour_trade = 0; double slb,tpb,sls,tps,pt; int ras,wt,wk,ticketb,tickets; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- if(Digits==3 || Digits==5) pt=10*Point; else pt=Point; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(TrailingStop_)dtrailing(); if(Tp_in_Money && TP_in_money<=money()) closeall(); //+------------------------------------------------------------------+ double booster = Volume[1]> Volume[0] &&(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; int signal; //+------------------------------------------------------------------------+ // open buy if ((iOpen(Symbol(),0, shiftOpenBuy)> iClose(Symbol(),0, shiftCloseBuy)+ (size + spread)*point) &&(booster) ) signal=1;// open buy //+------------------------------------------------------------------------+ //+------------------------------------------------------------------------+ if// open sell (( iOpen(Symbol(),0, shiftOpenSell)< iClose(Symbol(),0, shiftCloseSell)- (size + spread)*point) &&(booster) ) signal=2;// open sell //+------------------------------------------------------------------+ if(Hour_trade()==hour_trade) { if(SL==0)slb=0;else slb=Ask-SL*pt; if(SL==0)sls=0;else sls=Bid+SL*pt; if(TP==0)tpb=0;else tpb=Ask+TP*pt; if(TP==0)tps=0;else tps=Bid-TP*pt; //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ if(totalorder(0)<Max_order && CheckMoneyForTrade(Symbol(), NR(Lot_Volume()), OP_BUY)==True && Trade_buy && signal==1 && wt!=Time[B]) //+------------------------------------------------------------------+ if (!IsTradeContextBusy() && IsTradeAllowed()) { ticketb=OrderSend(Symbol(),OP_BUY,NR(Lot_Volume()),Ask,3,slb,tpb,Name_EA,MagicNumber,0,Blue); if(ticketb>0)wt=Time[A]; } if(totalorder(1)<Max_order && CheckMoneyForTrade(Symbol(), NR(Lot_Volume()), OP_SELL)==True && Trade_sell && signal==2 && wk!=Time[B]) if (!IsTradeContextBusy() && IsTradeAllowed()) { tickets=OrderSend(Symbol(),OP_SELL,NR(Lot_Volume()),Bid,3,sls,tps,Name_EA,MagicNumber,0,Red); if(tickets>0) wk=Time[A]; } } //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int Hour_trade() { bool trade=false; if(Start_Hour>End_Hour) { if(Hour()>=Start_Hour || Hour()<End_Hour) trade=true; } else if(Hour()>=Start_Hour && Hour()<End_Hour) trade=true; return (trade); } //+------------------------------------------------------------------+ // //+------------------------------------------------------------------+ int totalorder(int tipe) { int total=0; for(int i=0; i<OrdersTotal(); i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber || OrderType()!=tipe) continue; total++; } return(total); } //+------------------------------------------------------------------+ //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=AccountBalance() * 0.01 /LotFactor ; return(lot); } //+------------------------------------------------------------------+ //| //+------------------------------------------------------------------+ void dtrailing() { int i,r;double tpn; for(i=0; i<OrdersTotal(); i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; tpn=OrderTakeProfit(); if(OrderType()==OP_BUY) { if(Bid-OrderOpenPrice()>pt*TrailingStop) { if((OrderStopLoss()<Bid-pt*TrailingStop) || (OrderStopLoss()==0)) { if(tpn) r=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-pt*TrailingStop,OrderTakeProfit(),0,Green); } } } if(OrderType()==OP_SELL) { if((OrderOpenPrice()-Ask)>(pt*TrailingStop)) { if(OrderStopLoss()>(Ask+pt*TrailingStop) || (OrderStopLoss()==0)) { if(tpn) r=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+pt*TrailingStop,OrderTakeProfit(),0,Red); } } } } } //+------------------------------------------------------------------+ //| //+------------------------------------------------------------------+ void closeall() { for(int i=OrdersTotal()-1; i>=0; i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; if(OrderType()>1) ras=OrderDelete(OrderTicket()); else { if(OrderType()==0) ras=OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); else ras=OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE); } } } //+------------------------------------------------------------------+ //| //+------------------------------------------------------------------+ double money() { double dp=0; int i; for(i=0; i<OrdersTotal(); i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue; dp+=OrderProfit(); } return(dp); } //+------------------------------------------------------------------+ bool CheckMoneyForTrade(string symb,double lots,int type) { double free_margin=AccountFreeMarginCheck(symb,type, lots); //-- if there is not enough money if(free_margin<0) { string oper=(type==OP_BUY)? "Buy":"Sell"; //fPrint("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError()); return(false); } //--- checking successful return(true); } //--------------------------------------------------------------------------- int CheckForClose() { if(getProfit()>=Amount){CloseAll();} if(LockDown>0) { for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--) { if (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)&&(LockDown>0)) { int Pos=OrderType(); if((Pos==OP_BUY)&&(Bid-OrderOpenPrice()>Point*LockDown)&&(OrderStopLoss() == 0)) {bool modif1=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+Point,OrderTakeProfit(),0,CLR_NONE);} if((Pos==OP_SELL)&&(OrderOpenPrice()-Ask>Point*LockDown)&&(OrderStopLoss() == 0)) {bool modif2=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-Point,OrderTakeProfit(),0,CLR_NONE);} } } } return(0); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- double getProfit() { double Profit = 0; for (int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--) { if (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)) Profit = Profit + OrderProfit() + OrderSwap(); } return (Profit); } //--------------------------------------------------------------------------- void CloseAll() { bool Result; int i,Pos,Error; int Total=OrdersTotal(); if(Total>0) { for(i=Total-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { Pos=OrderType(); if(Pos==OP_BUY) {Result=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE);} if(Pos==OP_SELL) {Result=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, CLR_NONE);} if((Pos==OP_BUYSTOP)||(Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)||(Pos==OP_SELLLIMIT)) {Result=OrderDelete(OrderTicket(), CLR_NONE);} //----------------------- if(Result!=true) { Error=GetLastError(); Print("LastError = ",Error); } else Error=0; //----------------------- } } } }
    lefeuvr3 a joint une image
    plusieurs-ea-mais-un-seul-trade-a-la-fois-11052
  • Rengou — en réponse à riden dans son message #112447

    merci je vais continuer à etudier
  • lefeuvr3

    Rengou je pense que ton option d'EA sur RENKO est intéressante ,je vais essayer de faire un EA en l'utilisant
    Amicalement
    Gerard
    PS pour le moment la première version du Rengou se comporte plutôt bien ...n'est il pas ?