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

 
 
Salut WHRoeder, j'ai réussi à compiler l'indicateur et j'ai joint ici l'image du graphique. La ligne de l'indicateur en rouge forme une ligne droite en haut et est tombée à la Bar0. J'ai joint ici les derniers codes, veuillez me conseiller sur les améliorations à apporter au code pour que l'indicateur affiche les valeurs des M1 croisées. Merci beaucoup par avance.
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Red     // Color of the 1st line

 
double Buf_0[];             // 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()
  {
  
  
     int  i=0, iCht, Counted_bars; 
      
   
//--------------------------------------------------------------------
  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]++; 
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------
 
 
Zaldy: une ligne droite sur le dessus et déposé à Bar0.
Tu as des antécédents de M1 ?
 
WHRoeder:
Avez-vous des antécédents de M1 ?


Oui, j'en ai.
 
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Red     // Color of the 1st line

 
double Buf_0[];             // 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()
  {
  
  
     int  i=0, iCht, Counted_bars; 
      
   
//--------------------------------------------------------------------
  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]++; 
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------
 

La ligne de code mise en évidence ne donnera le décalage correct que si l'indicateur est attaché au graphique quotidien.

Comme je l'ai déjà dit dans mon message précédent

"Vous avezdonc besoin de la valeur de la date pour l'ouverture de la bougie D1. Pouvez-vous le faire ? "

 
GumRai:

La ligne de code mise en évidence ne donnera le décalage correct que si l'indicateur est attaché au graphique quotidien.

Comme je l'ai déjà dit dans mon message précédent

"Vous avezdonc besoin de la valeur de la date pour l'ouverture de la bougie D1. Pouvez-vous le faire ? "


Bonjour GumRai, j'ai essayé plusieurs fois mais je n'ai même pas pu le compiler, c'est au-delà de ma compréhension. Le mieux est que quelqu'un puisse me montrer comment faire alors j'apprendrai de lui, j'ai remarqué que j'apprends rapidement s'il y a des exemples. Actuellement, l'indicateur compte les barres M1 dans la Bar1 qui croisent le prix Open[1]. Cependant, le comptage s'arrête à partir de là et ne progresse pas pour compléter le graphique. J'ai essayé de lier l'indicateur à un EA mais même l'EA ne peut pas envoyer le signal lors du back test. S'il vous plaît montrez quelques codes qui complèteront cet indicateur pour de bon. Merci.
 
Buf_0[iCht] = EMPTY;
 
Zaldy:

Bonjour GumRai, j'ai essayé plusieurs fois mais je n'ai même pas pu le compiler, c'est au-delà de ma compréhension. Le mieux est que quelqu'un puisse me montrer comment faire alors j'apprendrai de lui, j'ai remarqué que j'apprends rapidement s'il y a des exemples. Actuellement, l'indicateur compte les barres M1 dans la Bar1 qui croisent le prix Open[1]. Cependant, le comptage s'arrête à partir de là et ne progresse pas pour compléter le graphique. J'ai essayé de lier l'indicateur à un EA mais même l'EA ne peut pas envoyer le signal lors du back test. S'il vous plaît montrez quelques codes qui complèteront cet indicateur pour de bon. Merci.


Non compilé ou testé, mais peut vous aider.

Counted_bars=IndicatorCounted(); // Number of counted bars
   for(iCht = Bars - 1 - Counted_bars; iCht >= 0; iCht--){ // Chart bars
      int      iD1    = iBarShift(Symbol(), PERIOD_D1, Time[iCht]); 
      
      //----find the datetime of iD1. ie the Time[]
      datetime daystarttime = iTime(Symbol(),PERIOD_D1,iD1);
      
      double   openD1 = iOpen(Symbol(), PERIOD_D1, iD1);
      
      //----find BarShift of daystarttime on current chart and take the nearest following bar if it doesn't exist
      int iM1Beg = iBarShift(Symbol(),PERIOD_M1,daystarttime,true);
      if(iM1Beg<0)
         iM1Beg = iBarShift(Symbol(),PERIOD_M1,daystarttime,false)+1;
      
      //----find BarShift for end of day on current chart and take the nearest following bar if it doesn't exist
      if(iD1>0)
         {
         datetime nextday = iTime(Symbol(),PERIOD_D1,iD1-1);
         int iM1End = iBarShift(Symbol(),PERIOD_M1,nextday-1,true);
         if(iM1End<0)
            iM1End = iBarShift(Symbol(),PERIOD_M1,nextday,false);
      
               
      
         for(Buf_0[i] = 0; iM1Beg > iM1End; iM1Beg--){
                double hM1 = iHigh(Symbol(), PERIOD_M1, iM1Beg),
                lM1 =  iLow(Symbol(), PERIOD_M1, iM1Beg);
// count Bars of M1 Period that crisscross Open price of D1 Period 
         if( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++;
         } 
         }
 
qjol:


J'ai réussi à insérer Buf_0[iCht] = EMPTY ; dans le code WHRoeder et en quelque sorte l'indicateur a fonctionné. Cependant, lorsque je l'ai lié à mon EA, il n'a cessé de se charger et de se décharger comme si un ivrogne crachait du lait. Les autres indicateurs liés à la même EA fonctionnent bien. Voici le message que j'ai reçu :

2014.02.25 17:17:08.806 2014.01.02 07:48 Indicateur personnalisé MamaMaryII EURPLN,Daily : supprimé

2014.02.25 17:17:08.799 2014.01.02 07:48 Indicateur personnalisé MamaMaryII EURPLN,Daily : chargé avec succès

2014.02.25 17:17:08.794 2014.01.02 07:48 Indicateur personnalisé MamaMaryII EURPLN,Daily : supprimé

2014.02.25 17:17:08.787 2014.01.02 07:48 Indicateur personnalisé MamaMaryII EURPLN,Daily : chargé avec succès

2014.02.25 17:17:08.783 2014.01.02 07:48 Indicateur personnalisé MamaMaryII EURPLN,Daily : supprimé

2014.02.25 17:17:08.774 2014.01.02 07:48 Indicateur personnalisé MamaMaryII EURPLN,Daily : chargé avec succès

2014.02.25 17:17:08.768 2014.01.02 07:48 Indicateur personnalisé MamaMaryII EURPLN,Daily : supprimé

Veuillez me dire ce qui n'a pas fonctionné. Merci. Indicateur personnalisé attaché sur un graphique
 
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Red     // Color of the 1st line
//#property indicator_color2 Yellow      // Color of the 2nd line
 
extern int Multiplier=2; 
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_SOLID,2);// Line style
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
  
  
     int  i=0, iCht, Counted_bars; 
      
   
//--------------------------------------------------------------------
  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]);
   Buf_0[iCht] = EMPTY;  //  <<<<<<<<<<<< This is the magic code that gjol inserted and it worked.    
      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]++; 
       // Buf_1[iCht]= Multiplier*Buf_0[iCht];
     }
  }   
//--------------------------------------------------------------------
   return(0);// 
  }
//--------------------------------------------------------------------