Indicateur pour compter les barres de la période M1 qui croisent le prix d'ouverture de la période D1.

 

Salutations ! J'ai besoin d'aide sur cet indicateur. J'ai essayé différentes méthodes pour compter le nombre de barres dans la période M1 qui ont rencontré le niveau du prix d'ouverture dans la période D1. J'ai joint ma tentative de codage mais je n'ai pas réussi à l'exécuter. J'ai fait beaucoup d'efforts mais je me suis heurté à un mur et je demande maintenant l'aide de gentils messieurs ici présents !

Voici ce dont j'ai besoin pour cet indicateur :

1. Quand une barre de la période M1 croise le prix de l'ouverture de la période D1, elle est comptée. Il y a 1440 barres en période M1 pour chaque période D1, donc toutes les 1440 barres seront testées.

2. Pour chaque barre D1, le nombre total de barres D1 sera additionné et la moyenne sera calculée par une certaine valeur. Disons que la moyenne est de 30, ce 30 est le nombre de barres D1.

//+------------------------------------------------------------------+
//|                                                          XXX.mq4 |
//|                                              Copyright 2014, XXX |
//|                                                              XXX |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, XXX"
#property link      "XXX"
#property version   "1.00"
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Blue     // Color of the 1st line
//#property indicator_color2 Red      // Color of the 2nd line
 int count;  // Bar index
extern int Aver_Bars=30;             // number of bars for calculation
//extern double lots= 0.1; 
//extern int Pnt= 10; // Point multiplier for the pips.
double Buf_0[], Buf_1[];             // Declaring indicator arrays
//THIS INDICATOR IS TO COUNT NUMBER OF M1 BARS WHICH HIGH[I] IS HIGHER AND LOW[I] IS LOWER THAN OPEN[1440].
//--------------------------------------------------------------------
int init()                          // Special function init()
  {
//--------------------------------------------------------------------
   SetIndexBuffer(0,Buf_0);         // Assigning an array to a buffer
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Line style
//--------------------------------------------------------------------
   SetIndexBuffer(1,Buf_1);         // Assigning an array to a buffer
   //SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Line style
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }

3. Ensuite, la valeur moyenne sera tracée comme indicateur.

 
AIDEZ-NOUS, S'IL VOUS PLAÎT ! EST-CE POSSIBLE ?
 

Je n'arrive pas à comprendre ce que vous essayez de faire à partir de votre code, mais à deux endroits, vous ne donnez pas de valeur à la variable i. Vous devez corriger cela.

int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }
 

Désolé d'être brutal, mais votre code montre que vous essayez d'atteindre quelque chose qui dépasse de loin vos capacités.

Exemple

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);

Disons que i = 1 par exemple

double O=iOpen(NULL,PERIOD_D1,1);

Ceci retournera le prix d'ouverture d'hier

   double H=iHigh(NULL,PERIOD_M1,1);
   double L=iLow(NULL,PERIOD_M1,1);

Ces deux valeurs renverront les valeurs de la dernière barre fermée d'une minute.


Vous comparez donc les valeurs d'il y a 1 minute à l'ouverture d'hier.

Si i = 2, vous comparerez les valeurs d'il y a 2 minutes à l'ouverture d'il y a 2 jours.

Vous devez voir que cela ne peut pas être ce que vous voulez.

 
GumRai:

Désolé d'être brutal, mais votre code montre que vous essayez d'atteindre quelque chose qui dépasse de loin vos capacités.

Exemple

Disons que i = 1 par exemple

Ceci retournera le prix d'ouverture d'hier

Ces deux valeurs renverront les valeurs de la dernière barre fermée d'une minute.


Vous comparez donc les valeurs d'il y a 1 minute à l'ouverture d'hier.

Si i = 2, vous comparerez les valeurs d'il y a 2 minutes à l'ouverture d'il y a 2 jours.

Vous devez voir que cela ne peut pas être ce que vous voulez.


Salut GumRai,

Merci de prendre le temps de m'aider. Vous avez raison, je ne suis qu'un débutant et je m'efforce d'apprendre à coder EA. Voici ce que j'essaie de faire :

1. Comparer PERIOD_D1 Open à chaque barre PERIOD_M1 minute sur sa propre barre D1, il y a donc 1440 barres M1 à comparer avec la barre D1. Puis compter les barres M1 qui satisfont la condition if (O > L && O < H) .

2. Stockez les barres comptées dans un tableau puis passez à nouveau à la barre D1 suivante et répétez à nouveau le cycle.

3. Les barres comptées seront tracées par l'indicateur sur un graphique journalier. Ainsi, si les barres M1 qui répondent aux critères sont au nombre de 5, ce chiffre sera affiché comme la valeur de la barre quotidienne Bar1. Ensuite, disons que pour la barre quotidienne suivante, la barre M1 comptée est 10, alors elle sera à nouveau tracée sur la Bar1 comme la barre précédente s'est déplacée vers la Bar2.

Merci de me montrer comment coder au mieux cette déclaration apparemment simple avec laquelle j'ai du mal. Faites-moi savoir si vous avez besoin de plus d'explications et merci beaucoup.

 
Zaldy:


Bonjour GumRai,

Merci de prendre le temps de m'aider. Vous avez raison, je ne suis qu'un débutant et je m'efforce d'apprendre à coder EA. Voici ce que j'essaie de faire :

1. Comparer PERIOD_D1 Open à chaque minute PERIOD_M1 bar sur sa propre D1 bar, il y a donc 1440 M1 bars à comparer avec la D1 bar. Puis compter les barres M1 qui satisfont la condition if (O > L && O < H) .

2. Stockez les barres comptées dans un tableau puis passez à nouveau à la barre D1 suivante et répétez à nouveau le cycle.

3. Les barres comptées seront tracées par l'indicateur sur un graphique journalier. Ainsi, si les barres M1 qui répondent aux critères sont au nombre de 5, ce chiffre sera affiché comme la valeur de la barre quotidienne Bar1. Ensuite, disons que pour la barre quotidienne suivante, la barre M1 comptée est 10, alors elle sera à nouveau tracée sur la Bar1 comme la barre précédente s'est déplacée vers la Bar2.

Merci de me montrer la meilleure façon de coder cette déclaration apparemment simple avec laquelle j'ai du mal. Faites-moi savoir si vous avez besoin de plus d'explications et merci beaucoup.


Je serai heureux de vous aider, mais je n'écrirai pas le code car cela ne vous aiderait pas à learm.

Tout d'abord, vous devez réaliser que 1440 barres M1 ne correspondent pas toujours à une période d'un jour. S'il n'y a pas de ticks pendant une barre, cette barre sera absente de l'historique et il peut y en avoir moins que prévu.

Vous avez donc besoin de la valeur de la date et de l'heure pour l'ouverture de la bougie D1. Pouvez-vous le faire ? Essayez-le et postez votre code

 

pas si vite

je sais ce que vous essayez de faire et votre code(if (O > L && O < H)) ne vous donnera pas ce que vous voulez.

Regardez le graphique ci-joint



la flèche vers le haut est l'ouverture d'aujourd'hui

et la flèche vers la droite est la première barre correspondant à votre code (if (O > L && O < H)) donc compte = 1

mais si vous faites attention, la barre a clôturé au-dessus de l'ouverture d'aujourd'hui donc, en fait, le compte devrait être = 2 (au moins (il pourrait y avoir quelques croisements supplémentaires que vous ne pouvez pas voir seulement dans le graphique en tick))

mais dans votre code le compte = seulement 1

 
qjol:

pas si vite

je sais ce que vous essayez de faire et votre code(if (O > L && O < H)) ne vous donnera pas ce que vous voulez.

Regardez le graphique ci-joint



la flèche vers le haut est l'ouverture d'aujourd'hui

et la flèche vers la droite est la première barre correspondant à votre code (if (O > L && O < H)) donc compte = 1

mais si vous faites attention, la barre a clôturé au-dessus de l'ouverture d'aujourd'hui donc, en fait, le compte devrait être = 2 (au moins (il pourrait y avoir quelques croisements supplémentaires que vous ne pouvez pas voir seulement dans le graphique en tick))

mais dans votre code le compte = seulement 1


D'après ce que je comprends, il veut compter les barres qui chevauchent le prix d'ouverture - je peux me tromper :)
 
  1. Zaldy: AIDEZ-NOUS, S'IL VOUS PLAÎT ! EST-CE POSSIBLE ?
    Ne nous criez pas dessus. Bien sûr que c'est possible.
  2. Les entiers et les booléens sont convertibles. Faux == 0, vrai = non-zéro.
    return(true); else return(EMPTY_VALUE);
    return(true); else return(2147483647);
    return(true); else return(true);
  3. Vous avez également affaire à trois horizons temporels, D1, graphique, M1. Vous devez convertir.
    Non compilé ou testé.
       Counted_bars=IndicatorCounted(); // Number of counted bars
       for(iCht = Bars - 1 - Counted_bars; iCht >= 0; iCht--){ // Chart bars
          int      iD1    = iBarShift(NULL, PERIOD_D1, Time[iCht];
          double   openD1 = iOpen(NULL, PERIOD_D1, iD1);
          int      iM1Beg = iBarShift(NULL, PERIOD_M1, Time[iCht],
                   iM1End = -1;
          if(iCht > 0) iM1End = iBarShift(NULL, PERIOD_M1, Time[iCht-1];
          for(Buf_0[i] = 0; iM1Beg > iM1End; iM1Beg--){
             double hM1 = iHigh(NULL, PERIOD_M1, iM1Beg),
                    lM1 =  iLow(NULL, PERIOD_M1, iM1Beg);
    // count Bars of M1 Period that crisscross Open price of D1 Period 
            if( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++; 
          }
       }
    
    Non compilé ou testé.
 
qjol:

pas si vite

je sais ce que vous essayez de faire et votre code(if (O > L && O < H)) ne vous donnera pas ce que vous voulez.

Regardez le graphique ci-joint



la flèche vers le haut est l'ouverture d'aujourd'hui

et la flèche vers la droite est la première barre correspondant à votre code (if (O > L && O < H)) donc compte = 1

mais si vous faites attention, la barre a clôturé au-dessus de l'ouverture d'aujourd'hui donc, en fait, le compte devrait être = 2 (au moins (il pourrait y avoir quelques croisements supplémentaires que vous ne pouvez pas voir seulement dans le graphique en tick))

mais dans votre code le compte = seulement 1


Bonjour Qjol, Oui, la flèche tournée vers la droite est le premier comptage que je veux. Celles qui s'entrecroisent avec la D1 Open seule est comptée. Merci encore pour vos efforts.
 
WHRoeder:
  1. Zaldy: S'IL VOUS PLAÎT AIDER QUELQU'UN ! EST-CE QUE C'EST POSSIBLE ?
    Ne nous criez pas dessus. Bien sûr, c'est possible.
  2. Les entiers et les booléens sont convertibles. Faux == 0, vrai = non-zéro.
  3. Vous avez également affaire à trois horizons temporels, D1, graphique, M1. Vous devez convertir.
    Non compilé ou testé.
    Non compilé ou testé.

Merci WHRoeder et désolé d'avoir utilisé des majuscules ici ! Je vais essayer vos suggestions et revenir ici pour le résultat.