J'ai créé un EA croisé à 2 EMA, j'ai besoin de conseils.

 

Bonjour à tous !

Je suis nouveau sur mql 4 et j'ai créé un simple cross advisor à 2 EMA, que j'ai testé sur un compte de démonstration, mais j'ai un peu peur de le mettre sur un compte réel.

Le tester avec de petits lots à l'échelle d'une heure prendrait trop de temps, et le tester à l'échelle des minutes est coûteux, car le lot minimal chez mon courtier est d'environ 7 usd.

Je vous serais donc reconnaissant si vous pouviez y jeter un coup d'œil et peut-être me signaler quelques erreurs évidentes que j'aurais pu faire.

Ce conseiller est censé trader sur le marché Bitcoin/USD qui est extrêmement volatile (le prix peut aller de + à - 30% par jour), donc le stop loss et le take profit ne sont pas en pips mais en pourcentages d'un bid ou ask.

Les variables et autres :

#property copyright "me"
#property link      "killnosock.net"
extern int SlowEma = 21;
extern int FastEma = 10;
extern int MaxRisk = 100;// % of Depo to be traded per order
extern int  TakeProfit=100;
extern int  StopLoss=100;
extern int Slippage = 10;

int LastBars = 0;

int init(){return(0);}
int deinit() {return(0);}

Cette fonction permet de déterminer la taille du lot, en fonction du % de dépôt qu'il est permis d'utiliser par ordre (int Risk).

double GetLot(int Risk)
{double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) {
 Alert(" free= ", AccountFreeMargin()," for one lot= ", MarketInfo(Symbol(),MODE_MARGINREQUIRED)," lot= ", Lot);
 return(0.0);}
return(Lot);}

C'est la fonction qui ouvre un nouvel ordre, Cmd est acheter ou vendre.

int NewOrder(int Cmd,double Lot)
{double TP=0; //takeprofit
 double SL=0; //stoploss
 double PR=0; //price
 color clr = CLR_NONE;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=Ask + Ask*TakeProfit/100;
    if(StopLoss>0) SL=Ask - Ask*StopLoss/100;
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr = Green;}
 if(Cmd==OP_SELL)
   {PR=Bid;
    if(TakeProfit>0) TP=Bid - Bid*TakeProfit/100;
    if(StopLoss>0) SL=Bid + Bid*StopLoss/100;
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr = Red;}
 int tic=OrderSend(Symbol(),Cmd,Lot,PR,Slippage,SL,TP,"",0,0,clr);
 if(tic<0) Print("Open order error: ",GetLastError());
return(tic);}

Ici je ferme 1 ordre ou je ferme tous les ordres :

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
   Print("Order close error: ",GetLastError());
return;}
//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      CloseOrder();
     }
return;}

Cette fonction est utilisée pour calculer la différence entre les EMA rapides et lentes (EMA rapide - EMA lente) :

double EmaDiff(int shift)
   {
      double difference;
      difference = iMA(Symbol(),0,FastEma,0,MODE_EMA,PRICE_CLOSE,shift)
                 - iMA(Symbol(),0,SlowEma,0,MODE_EMA,PRICE_CLOSE,shift);
      return(difference);
   }

Et voici le corps principal :

int start()
  {
double Lot;
    // check if new bar opened
    if (LastBars == Bars) return(0);
    else LastBars = Bars;
      {         
         if ((EmaDiff(1) > 0) && (EmaDiff(2) < 0))
            {
               CloseAllOrders();
               Lot = GetLot(MaxRisk);
               NewOrder(OP_BUY,Lot);
            }
            
         if ((EmaDiff(2) > 0) && (EmaDiff(1) < 0))
            {
               CloseAllOrders();
               Lot = GetLot(MaxRisk);
               NewOrder(OP_SELL,Lot);
            }                    
      }
   return(0);
  }

Je vais ajouter un stop suiveur, et envisager de comparer EmaDiff non pas à zéro mais à une petite valeur pour ne pas se faire hacher lorsque les EMA lentes et rapides sont très proches les unes des autres et se croisent à chaque barre.

 
 //CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
   Print("Order close error: ",GetLastError());
return;}



//Close all Orders
void CloseAllOrders()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      CloseOrder();
     }
return;}

ne vérifie pas le symbole ne vérifie pas un numéro magique....

alors que se passera-t-il si vous l'utilisez en direct avec différents EA ?

 
deVries:

ne vérifie pas le symbole ne vérifie pas un numéro magique....

alors que se passera-t-il si vous l'utilisez en direct avec différents EA ?


Vous voulez dire exécuter deux EA à partir d'un seul compte ?
 
prupru:

Voulez-vous dire que vous exécutez deux EA à partir d'un seul compte ?
Deux EA ou un EA et des transactions placées manuellement... ou seulement des transactions placées manuellement.
 
prupru:

Bonjour à tous !

Je suis nouveau sur mql 4 et j'ai créé un simple cross advisor à 2 EMA, que j'ai testé sur un compte de démonstration, mais j'ai un peu peur de le mettre sur un compte réel.

Le tester avec de petits lots à l'échelle d'une heure prendrait trop de temps, et le tester à l'échelle des minutes est coûteux, car le lot minimal chez mon courtier est d'environ 7 usd.

Donc, je vous serais reconnaissant si vous y jetiez un coup d'oeil et si vous me signaliez des erreurs évidentes que j'aurais pu faire.

C'est bien de voir quelqu'un qui vérifie les valeurs de retour des fonctions de trading sans y être invité... mais vous avez besoin de plus d'informations si vous obtenez une erreur afin de pouvoir diagnostiquer ce qui a causé le problème, vous ne pouvez pas revenir en arrière dans une situation vivante pour vérifier ce qu'était le Spread ou ce qu'était le niveau de Freeze à ce moment-là...

if(tic < 0) Print("Open order error: ", GetLastError());

... c'est bien mais vous avez besoin de plus, quelles sont les variables que vous devez imprimer pour pouvoir déterminer la cause de toute erreur que vous obtenez ? lorsque vous avez déterminé ce dont vous avez besoin, ajoutez-les toutes dans votre appel Print() en vous assurant que vous utilisez le nombre correct de décimales (DoubeToStr(value, digits)) pour toutes les variables doubles telles que Ask, Bid, etc...

 
RaptorUK:

C'est bien de voir quelqu'un qui vérifie les valeurs de retour des fonctions de trading sans y être invité....

Désolé, mais je n'ai pas compris cette partie. La seule chose que j'ai comprise est que je dois ajouter autant de variables que possible à l'appel Print(). J'ai compris, merci.

deVries, merci aussi pour votre conseil, maintenant je comprends ce que vous voulez dire.

Y a-t-il autre chose à corriger ?

 

bien sûr, il y a

    // check if new bar opened
    if (LastBars == Bars) return(0);
    else LastBars = Bars;

supposons que vous ayez déjà des barres maximales (il y a une limite).....

 
deVries:

bien sûr, il y a

supposons que vous ayez déjà des barres maximales (il y a une limite).....


Ok, alors comment faire pour mieux saisir le moment où une nouvelle bougie s'ouvre ?
 
prupru:

ok, alors comment faire pour mieux saisir le moment où une nouvelle bougie s'ouvre ?


vérifier l'heure de la dernière barre Time[0]

cherchez NewBar et vous trouverez quelques exemples

 
deVries:


vérifier l'heure de la dernière barre Time[0]

cherchez NewBar et vous trouverez quelques exemples


Merci, j'ai trouvé ceci https://www.mql5.com/en/code/10370

 
 if(Cmd==OP_BUY)
   {PR=Ask;
    if(TakeProfit>0) TP=Ask + Ask*TakeProfit/100;
    if(StopLoss>0) SL=Ask - Ask*StopLoss/100;
    if(SL<0) SL = 0;
    if(TP<0) TP = 0;
    clr = Green;}

Je ne pense pas que ce soit correct.

comment obtenir 100 pips takeprofit et 150 pips Stoploss ? ???

mise à jour voir " donc le stop loss et le take profit ne sont pas en pips mais en pourcentages d'une offre ou d'une demande. "

mais comment obtenir un prix valide de cette façon ? si votre symbole a 5 chiffres, le résultat sera souvent de 2 chiffres en plus.

Raison: