Aide au codage - page 726

 

Bonjour Mladen,

J'essaie de coder ceci dans MT5, mais je pense que je n'utilise pas la bonne implémentation,

mon idée est d'utiliser plus d'indicateurs, s'il vous plaît donnez-moi une lumière ... ;-)

I need help to make this modular, because I will work with more indicators (6 to 8), 
this is a sample to understand I'm trying to do..

in this sample:
I put only 3 indicadors.

//global variables
bool m_buy = true;
bool m_sell = true;
enum Signal{
   IN_OUT=0,  //in & out
   IN=1,      //in
   OUT=2,     //out
};

I have a EA with indicators that I want to mix and optimize it in BackTest.

//some sample data for signal for In/Out states only for exemplification
iT_InOut = IN_OUT;  //Itrend usage => In & Out
RSI_InOut = IN_;     //RSI usage =>only IN 
MFI_InOut = OUT_;     //MFI usage =>only OUT
//

//this is the complete sequence IF I USE all signals in+out
//only to show the completly sequence (I will not use it)
m_buy=(m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0] && m_rsi0[0]>m_rsi1[0] && m_mfi0[0]>m_mfi1[0]);
// The green is growing and more than red, RSI is growing, MFI is growing
m_sell=(m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0] && m_rsi0[0]<m_rsi1[0] && m_mfi0[0]<m_mfi1[0]);
// The green falls and less than red, RSI falls, MFI falls


//now the skeleton that I'm trying to make work (in future I will use much more indicators)
               
              if(!PositionSelect(Symbol()))   ///No opened it's first entrance
                 {              
                 
                 if (!iT_InOut==OUT_) //Itrend (only options with IN)
                     {
                     m_buy= (m_buy  && m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0]);
                     m_sell=(m_sell && m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0]);
                     }
                  
                 if (!RSI_InOut==OUT_) //RSI (only options with IN)
                     {
                     m_buy =(m_buy  && m_rsi0[0]>m_rsi1[0]);
                     m_sell=(m_sell && m_rsi0[0]<m_rsi1[0]);
                     }                
                
                 if (!MFI_InOut==OUT_) //MFI (only options with IN)
                     {
                     m_buy =(m_buy  && m_mfi0[0]>m_mfi1[0]);
                     m_sell=(m_sell && m_mfi0[0]<m_mfi1[0]);
                     }                 
                  }
                 
                 ///We have opened order it's EXIT
                 else
                 {
                 //Itrend (only options with EXIT)
                 if (!iT_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0]);
                     m_sell=(m_sell && m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0]);
                     }
                 //RSI (only options with EXIT)
                 if (!RSI_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_rsi0[0]>m_rsi1[0]);
                     m_sell=(m_sell && m_rsi0[0]<m_rsi1[0]);
                     }                     
                 //MFI (only options with EXIT)
                 if (!MFI_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_mfi0[0]>m_mfi1[0]);
                     m_sell=(m_sell && m_mfi0[0]<m_mfi1[0]);
                     }
                 }
 
baraozemo:

Bonjour Mladen,

J'essaie de coder ceci dans MT5, mais je pense que je n'utilise pas la bonne implémentation,

mon idée est d'utiliser plus d'indicateurs, s'il vous plaît donnez-moi une lumière ... ;-)

I need help to make this modular, because I will work with more indicators (6 to 8), 
this is a sample to understand I'm trying to do..

in this sample:
I put only 3 indicadors.

//global variables
bool m_buy = true;
bool m_sell = true;
enum Signal{
   IN_OUT=0,  //in & out
   IN=1,      //in
   OUT=2,     //out
};

I have a EA with indicators that I want to mix and optimize it in BackTest.

//some sample data for signal for In/Out states only for exemplification
iT_InOut = IN_OUT;  //Itrend usage => In & Out
RSI_InOut = IN_;     //RSI usage =>only IN 
MFI_InOut = OUT_;     //MFI usage =>only OUT
//

//this is the complete sequence IF I USE all signals in+out
//only to show the completly sequence (I will not use it)
m_buy=(m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0] && m_rsi0[0]>m_rsi1[0] && m_mfi0[0]>m_mfi1[0]);
// The green is growing and more than red, RSI is growing, MFI is growing
m_sell=(m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0] && m_rsi0[0]<m_rsi1[0] && m_mfi0[0]<m_mfi1[0]);
// The green falls and less than red, RSI falls, MFI falls


//now the skeleton that I'm trying to make work (in future I will use much more indicators)
               
              if(!PositionSelect(Symbol()))   ///No opened it's first entrance
                 {              
                 
                 if (!iT_InOut==OUT_) //Itrend (only options with IN)
                     {
                     m_buy= (m_buy  && m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0]);
                     m_sell=(m_sell && m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0]);
                     }
                  
                 if (!RSI_InOut==OUT_) //RSI (only options with IN)
                     {
                     m_buy =(m_buy  && m_rsi0[0]>m_rsi1[0]);
                     m_sell=(m_sell && m_rsi0[0]<m_rsi1[0]);
                     }                
                
                 if (!MFI_InOut==OUT_) //MFI (only options with IN)
                     {
                     m_buy =(m_buy  && m_mfi0[0]>m_mfi1[0]);
                     m_sell=(m_sell && m_mfi0[0]<m_mfi1[0]);
                     }                 
                  }
                 
                 ///We have opened order it's EXIT
                 else
                 {
                 //Itrend (only options with EXIT)
                 if (!iT_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_it00[0]>m_it10[0] && m_it00[0]>m_it01[0]);
                     m_sell=(m_sell && m_it00[0]<m_it10[0] && m_it00[0]<m_it01[0]);
                     }
                 //RSI (only options with EXIT)
                 if (!RSI_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_rsi0[0]>m_rsi1[0]);
                     m_sell=(m_sell && m_rsi0[0]<m_rsi1[0]);
                     }                     
                 //MFI (only options with EXIT)
                 if (!MFI_InOut==IN_)
                     {
                     m_buy =(m_buy  && m_mfi0[0]>m_mfi1[0]);
                     m_sell=(m_sell && m_mfi0[0]<m_mfi1[0]);
                     }
                 }
Dans ce code, je ne vois pas du tout l'utilisation des indicateurs (et comment les valeurs sont copiées dans les tableaux correspondants).
 

Bonjour les gars,

J'ai vraiment besoin d'aide, je suis en train de construire un expert avec l'indicateur scalping waddah attar, la logique fonctionne, tout est ok.

Sauf une chose, comme vous le voyez dans la capture d'écran du backtest, à chaque barre verte l'expert ouvre un achat, même chose pour les barres rouges. Je veux seulement 1 trade par changement de couleur.

Ce que je veux c'est :

L'INDICATEUR VIRE AU VERT ---> il ouvre un achat ---> l'achat se ferme ---> L'INDICATEUR VIRE AU ROUGE ---> il ouvre une vente ---> la vente se ferme ---> répéter.

Je ne veux qu'une seule transaction par changement de couleur.

Voici mon code : (le même pour le short)

//Trading decision.
   bool SendLong = false, SendShort = false;
  
    double clnowsell = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,1,clbar);
    double clpresell = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,1,clbar+1);
  
    double clnowbuy = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,0,clbar);
    double clprebuy = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,0,clbar+1);

   //Long trade
  
   //Specific system filters
   //if (some condition) SendLong = true;
  
   if (clnowbuy > 0) SendLong = true;

Quelqu'un peut-il me proposer une solution simple ? Regardez la ligne 1265, la logique vient ici.

Merci beaucoup !

 
LittleCaro:

Bonjour les gars,

J'ai vraiment besoin d'aide, je suis en train de construire un expert avec l'indicateur scalping waddah attar, la logique fonctionne, tout est ok.

Sauf une chose, comme vous le voyez dans la capture d'écran du backtest, à chaque barre verte l'expert ouvre un achat, même chose pour les barres rouges. Je veux seulement 1 trade par changement de couleur.

Ce que je veux c'est :

L'INDICATEUR VIRE AU VERT ---> il ouvre un achat ---> l'achat se ferme ---> L'INDICATEUR VIRE AU ROUGE ---> il ouvre une vente ---> la vente se ferme ---> répéter.

Je ne veux qu'une seule transaction par changement de couleur.

Voici mon code : (le même pour le short)

//Trading decision.
   bool SendLong = false, SendShort = false;
  
    double clnowsell = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,1,clbar);
    double clpresell = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,1,clbar+1);
  
    double clnowbuy = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,0,clbar);
    double clprebuy = iCustom(Symbol(),WAScalpingTimeFrame,"Waddah_Attar_Scalping",IPeriod,P1,P2,0,clbar+1);

   //Long trade
  
   //Specific system filters
   //if (some condition) SendLong = true;
  
   if (clnowbuy > 0) SendLong = true;

Quelqu'un peut-il me proposer une solution simple ? Regardez la ligne 1265, la logique vient ici.

Merci beaucoup !

Changez la condition en

  if (clnowbuy > 0 && clprebuy == 0) SendLong = true;

Idem pour le short

 

Merci Mladen !

Parfois, nous sommes bloqués, et nous avons besoin d'un regard neuf sur notre travail.

Merci encore !

 
LittleCaro:

Merci Mladen !

Parfois, nous sommes bloqués, et nous avons besoin d'un regard neuf sur notre travail.

Merci encore !

Bonjour,

Ravi de voir une Française, tiens moi au courant des tes résultats avec waddah attar ;)

Les pépins verts

 

Bonjour, j'essaie d'éditer un indicateur ema-rsi qui peut montrer une flèche vers le haut ou vers le bas lorsque le croisement de 4 ema se produit et que le rsi est > ou < 50.

Mon problème est que ces flèches ne se rafraîchissent pas àchaque tick une fois qu'elles sont apparues, je dois changer de timeframe si je veux vérifier si les conditions sont toujours bonnes pour montrer la flèche. Pouvez-vous me dire où se situe le problème ? J'ai posté le code.

Merci pour votre aide.

#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 Green
#property  indicator_color2 Red

#property  indicator_width1 4
#property  indicator_width2 4

double CrossUp[];
double CrossDown[];
extern int FasterEMA1     = 6;
extern int SlowerEMA1     = 12;
extern int FasterEMA2     = 7;
extern int SlowerEMA2     = 14;
extern int RSInowPeriod   = 6;
extern int barsBack       = 2000;
extern bool AlertsMessage = true;
extern bool AlertsSound   = true;
extern bool debug         = false;
extern double K           = 1.0 ;

bool EMACrossedUp = false;
bool RSICrossedUp = false;
bool EMACrossedDown = false;
bool RSICrossedDown = false;
int SignalLabeled = 0// 0: initial state; 1: up; 2: down.
int upalert=false,downalert=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0DRAW_ARROWEMPTY);
   SetIndexArrow(0241);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1DRAW_ARROWEMPTY);
   SetIndexArrow(1242);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int limit, i, counter;
   double fasterEMA1now, slowerEMA1now, fasterEMA1previous, slowerEMA1previous, fasterEMA2now, slowerEMA2now, fasterEMA2previous, slowerEMA2previous;
   double RSInow;
   double Range, AvgRange;

   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;

   limit=MathMin(Bars-counted_bars,barsBack);
   
   for(i = limit; i>=0; i--) {
       
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
        AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;

      fasterEMA1now = iMA(NULL0, FasterEMA1, 0MODE_EMAPRICE_CLOSE, i);
      fasterEMA1previous = iMA(NULL0, FasterEMA1, 0MODE_EMAPRICE_CLOSE, i+1);
      
      fasterEMA2now = iMA(NULL0, FasterEMA2, 0MODE_EMAPRICE_CLOSE, i);
      fasterEMA2previous = iMA(NULL0, FasterEMA2, 0MODE_EMAPRICE_CLOSE, i+1);
      
      slowerEMA1now = iMA(NULL0, SlowerEMA1, 0MODE_EMAPRICE_CLOSE, i);
      slowerEMA1previous = iMA(NULL0, SlowerEMA1, 0MODE_EMAPRICE_CLOSE, i+1);
      
      slowerEMA2now = iMA(NULL0, SlowerEMA2, 0MODE_EMAPRICE_CLOSE, i);
      slowerEMA2previous = iMA(NULL0, SlowerEMA2, 0MODE_EMAPRICE_CLOSE, i+1);
      
      RSInow=iRSI(NULL,0,RSInowPeriod,PRICE_CLOSE,i);
      
      if (RSInow > 50) {
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" RSI UP ");
         RSICrossedUp = true;
         RSICrossedDown = false;
      }
      
      if (RSInow < 50) {
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" RSI DOWN ");
         RSICrossedUp = false;
         RSICrossedDown = true;
      }
      
      if ((fasterEMA1now >= slowerEMA1now) && (fasterEMA1previous < slowerEMA1previous) && (fasterEMA2now >= slowerEMA2now) && (fasterEMA2previous < slowerEMA2previous) ) {
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" EMA UP ");
         EMACrossedUp = true;
         EMACrossedDown = false;
      }

      if ((fasterEMA1now <= slowerEMA1now) && (fasterEMA1previous > slowerEMA1previous) && (fasterEMA2now <= slowerEMA2now) && (fasterEMA2previous > slowerEMA2previous)) {
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" EMA DOWN ");
         EMACrossedUp = false;
         EMACrossedDown = true;
      }

      if ((EMACrossedUp == true) && (RSICrossedUp == true) && (SignalLabeled != 1)) {
         CrossUp[i] = Low[i] - K*Range;
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" SIGNAL UP ");
         if(i<=2 && AlertsMessage && !upalert)
           {
            Alert (Symbol()," ",Period(),"M  BUY SIGNAL ");
            //SendMail("EMA Cross Up on "+Symbol(),"");
            upalert=true;
            downalert=false;
           }           
         if(i<=2 && AlertsSound && !upalert)
           {
            PlaySound("alert.wav");
            upalert=true;
            downalert=false;
           }
         SignalLabeled = 1;
      }

      else if ((EMACrossedDown == true) && (RSICrossedDown == true) && (SignalLabeled != 2)) {
         CrossDown[i] = High[i] + K*Range;
         if (debug)Print(TimeToStr(Time[i],TIME_DATE)+TimeToStr(Time[i],TIME_SECONDS)+" SIGNAL DOWN ");
         if(i<=2 && AlertsMessage && !downalert)
           {
            Alert (Symbol()," ",Period(),"M  SELL SIGNAL ");
            //SendMail("EMA Cross Down on "+Symbol(),"");
            downalert=true;
            upalert=false;
           }
         if(i<=2 && AlertsSound && !downalert)
           {
            PlaySound("alert.wav");
            downalert=true;
            upalert=false;
           }
         SignalLabeled = 2;
      }
   }
   return(0);
}
//end
 
mladen:
Dans ce code, je ne vois pas du tout l'utilisation des indicateurs (et comment les valeurs sont copiées dans les tableaux correspondants).

Bonjour Mladen,

Voici le "sample-ea-modular.mq5" avec un peu de code dedans... et avec l'interface qui a l'idée que je veux.

J'essaie de le rendre modulaire, l'idée est d'optimiser séparément les entrées/sorties de chaque indicateur...

Si je peux le faire avec le "sample-ea-modular.mq5" je changerai le vrai EA.

la base réelle est l'Ea-sample.mq5. (je poste seulement pour que vous voyiez tous les indicateurs)

Dossiers :
 
oguz:

Cher @mladen,

Si vous êtes en mesure de résoudre l'erreur mentionnée ci-dessous, nous vous en remercions.

Merci...

"Question : Il y a un avertissement quand j'ai attaché au graphique et utilisé le décalage automatique gmt.


L'avertissement est le suivant : Warning, use manual GMToffsets only on backtest.

Le calcul automatique du décalage GMT ne fonctionne que sur le trading en direct/démo.
et doit être réglé sur FALSE pour les backtests - tests de stratégie.

Est-ce normal ? Ou dois-je mettre le décalage automatique GMT sur FAUX ?

Réponse : J'ai désactivé AutoGMTOffset et défini manuellement le décalage GMT. Il n'y a plus de message d'avertissement et cela semble fonctionner parfaitement sur la démo. Allez savoir. C'est peut-être un bug. Oh oui, c'est définitivement un bug.

J'ai regardé le code et une opération "else" est soit omise, soit mal placée. Le message ne devrait être émis que si UseAutoGMTOffset est réglé sur FALSE.

Donc, ignorez ce message et soyez heureux. Tout fonctionne comme (ahem) prévu".

oguz

Comme d'habitude (vous le savez déjà), je ne commente pas le code décompilé, mais je vois que vous êtes sur la bonne voie : si cela fonctionne (l'option), utilisez-le. S'il ne fonctionne pas, ne le faites pas. Pour autant que je sache, ce n'est qu'un message (pas une erreur) donc ...

 

Cher @mladen,

Si vous êtes en mesure de résoudre l'erreur mentionnée ci-dessous, nous vous en remercions.

Merci...

"Question : Il y a un avertissement quand j'ai attaché au graphique et utilisé le décalage automatique gmt.


L'avertissement est le suivant : Warning, use manual GMToffsets only on backtest.

Le calcul automatique du décalage GMT ne fonctionne que sur le trading en direct/démo.
et doit être réglé sur FALSE pour les backtests - tests de stratégie.

Est-ce normal ? Ou dois-je mettre le décalage automatique GMT sur FAUX ?

Réponse : J'ai désactivé AutoGMTOffset et défini manuellement le décalage GMT. Il n'y a plus de message d'avertissement et cela semble fonctionner parfaitement sur la démo. Allez savoir. C'est peut-être un bug. Oh oui, c'est définitivement un bug.

J'ai regardé le code et une opération "else" est soit omise, soit mal placée. Le message ne devrait être émis que si UseAutoGMTOffset est réglé sur FALSE.

Donc, ignorez ce message et soyez heureux. Tout fonctionne comme (ahem) prévu".
Raison: