Индикатор для подсчета баров периода M1, которые пересекаются с ценой открытия периода D1 - страница 2

 
 
Привет WHRoeder, мне удалось скомпилировать индикатор и я прикрепил сюда изображение графика. Линия индикатора, выделенная красным цветом, образует прямую линию сверху и опускается на Bar0. Я приложил здесь последние коды, пожалуйста, подскажите, где можно улучшить код, чтобы индикатор строил значения пересекающихся M1. Заранее большое спасибо.
#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: прямую линию сверху и опускается в Бар0.
У вас есть история М1?
 
WHRoeder:
Есть ли у вас история М1?


Да, есть.
 
#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()
  }
//--------------------------------------------------------------------
 

Выделенная строка кода даст правильный сдвиг только в том случае, если инди прикреплен к дневному графику.

Как я уже сказал в своем предыдущем сообщении

"Итак, вам нужно значение времени открытия свечи D1. Можете ли вы это сделать? "

 
GumRai:

Выделенная строка кода даст правильный сдвиг только в том случае, если инди прикреплен к дневному графику.

Как я уже сказал в своем предыдущем сообщении

"Итак, вам нужно значение времени открытия свечи D1. Можете ли вы это сделать? "


Привет, GumRai, я пытался много раз, но я даже не смог скомпилировать это, это за пределами моего понимания. Лучше всего, если кто-то может показать мне, как это делается, тогда я буду учиться на этом, я заметил, что быстро учусь, если есть примеры. Сейчас индикатор считает бары M1 внутри Bar1, которые пересекают цену Open[1]. Однако на этом подсчет останавливается и не доводит график до конца. Я пытался связать индикатор с советником, но даже советник не может послать сигнал при обратном тестировании. Пожалуйста, покажите какой-нибудь код, который бы окончательно завершил работу индикатора. Спасибо.
 
Buf_0[iCht] = EMPTY;
 
Zaldy:

Привет GumRai, я пытался много раз, но даже не смог скомпилировать его, это за пределами моего понимания. Лучше всего, если кто-то может показать мне, как это делается, тогда я буду учиться на этом, я заметил, что быстро учусь, если есть примеры. Сейчас индикатор считает бары M1 внутри Bar1, которые пересекают цену Open[1]. Однако на этом подсчет останавливается и не доводит график до конца. Я пытался связать индикатор с советником, но даже советник не может послать сигнал при обратном тестировании. Пожалуйста, покажите какой-нибудь код, который бы окончательно завершил работу индикатора. Спасибо.


Не компилировалось и не тестировалось, но может помочь вам

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:


Мне удалось вставить Buf_0[iCht] = EMPTY; в код WHRoeder и индикатор заработал. Пожалуйста, проверьте изображение и последние скомпилированные коды. Однако когда я связал его с моим советником, он продолжал загружать и выгружать его, словно пьяница, извергающий молоко. Другие индикаторы, подключенные к тому же советнику, работали нормально. Вот сообщение, которое я получил:

2014.02.25 17:17:08.806 2014.01.02 07:48 Пользовательский индикатор MamaMaryII EURPLN,Daily: удален

2014.02.25 17:17:08.799 2014.01.02 07:48 Пользовательский индикатор MamaMaryII EURPLN,Daily: успешно загружен

2014.02.25 17:17:08.794 2014.01.02 07:48 Пользовательский индикатор MamaMaryII EURPLN,Daily: удален

2014.02.25 17:17:08.787 2014.01.02 07:48 Пользовательский индикатор MamaMaryII EURPLN,Daily: успешно загружен

2014.02.25 17:17:08.783 2014.01.02 07:48 Пользовательский индикатор MamaMaryII EURPLN,Daily: удален

2014.02.25 17:17:08.774 2014.01.02 07:48 Пользовательский индикатор MamaMaryII EURPLN,Daily: успешно загружен

2014.02.25 17:17:08.768 2014.01.02 07:48 Пользовательский индикатор MamaMaryII EURPLN,Daily: удален

Пожалуйста, дайте мне знать, что пошло не так. Спасибо. Прикрепление пользовательского индикатора на графике
 
#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);// 
  }
//--------------------------------------------------------------------