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

 
Zaldy:


Этот код может давать значения, но он не дает правильных значений.

Пожалуйста, посмотрите мои предыдущие сообщения

 
GumRai:


Этот код может давать значения, но он не дает правильных значений.

Пожалуйста, посмотрите мои предыдущие сообщения

Привет Гумрай, я скомпилировал ваш код плюс магический код Qjol, который я прикрепил здесь. Без кода qjol форма графика похожа на цифру 7, но при добавлении кода qjol она ведет себя лучше. Значение, как вы можете видеть на изображении, упало до -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
//#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(Symbol(), PERIOD_D1, Time[iCht]); 
    Buf_0[iCht] = EMPTY;  //  <<<<<<<<<<<< This is the magic code that gjol inserted and it worked.      
      //----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]++;
         } 
         }
         }
//--------------------------------------------------------------------
   return(0);// 
  }
//--------------------------------------------------------------------
 
GumRai:


Этот код может дать значения, но он не дает правильных значений.

Пожалуйста, см. мои предыдущие сообщения


Привет, GumRai,

Пожалуйста, посоветуйте, как мы можем это улучшить. Спасибо.

 
Zaldy:


Привет GumRai,

Пожалуйста, посоветуйте, как мы можем это улучшить. Спасибо.


Похоже, что вы уже реализовали мои предложения.

Линия indi падает на ноль, потому что buffer[0] не вычисляется в коде. Вы должны решить, хотите ли вы, чтобы это значение начиналось с 0 и увеличивалось с течением дня, или, может быть, просто сделать buffer[0] == buffer[1], что будет выглядеть более аккуратно.

 
Спасибо WHRoeder, qjol и GumRai за большую помощь в кодировании моего индикатора.
 
GumRai:


Похоже, что вы уже реализовали мои предложения.

Линия indi падает на ноль, потому что буфер[0] не вычисляется в коде. Вы должны решить, хотите ли вы, чтобы это значение начиналось с 0 и увеличивалось с течением дня, или просто сделать так, чтобы buffer[0] == buffer[1], что будет выглядеть более аккуратно.


Привет GumRai, Как я могу написать код, чтобы значение начиналось с 0 и увеличивалось по мере продвижения дня? Пожалуйста, помогите. Спасибо.
 
Zaldy:

Привет, GumRai, Как я могу написать код, чтобы значение начиналось с 0 и увеличивалось по мере продвижения дня? Пожалуйста, помогите. Спасибо.


Я внес некоторые изменения в ваш код



int start()                         // Special function start()
  {
  
  
  int  i, iCht, Counted_bars, limit, iD1, iM1Beg, iM1End, counter ; 
  datetime daystarttime, nextday ;   
  double hM1, lM1, openD1 ; 
//--------------------------------------------------------------------
  Counted_bars=IndicatorCounted(); // Number of counted bars
  limit = Bars - 1 - Counted_bars;
  if(limit > Bars-100)   
      limit = Bars-100;
  for(iCht = limit; iCht >= 0; iCht--){ // Chart bars
      iD1 = iBarShift(Symbol(), PERIOD_D1, Time[iCht]); //---Barshift on daily chart
      daystarttime = iTime(Symbol(),PERIOD_D1,iD1); //--Find datetime value for start of the day      
      openD1 = iOpen(Symbol(), PERIOD_D1, iD1);
      
      //----find BarShift of daystarttime on current chart and take the nearest following bar if it doesn't exist
      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)  //-- Change to iD1>=0 to show running total for the current day
         {
         nextday = iTime(Symbol(),PERIOD_D1,iD1-1);
         iM1End = iBarShift(Symbol(),PERIOD_M1,nextday-1,true);
         if(iM1End<0)         
            iM1End = iBarShift(Symbol(),PERIOD_M1,nextday,false);
       
         counter = 0;
         for(i= iM1Beg; i >= iM1End; i--){
            hM1 = iHigh(Symbol(), PERIOD_M1, i);
            lM1 =  iLow(Symbol(), PERIOD_M1, i);
            // count Bars of M1 Period that crisscross Open price of D1 Period 
            if( hM1 >= openD1 && openD1 >= lM1)
               counter++ ;
         }
         Buf_0[iCht] = counter; 
         }
         }
//--------------------------------------------------------------------
   return(0);// 
  }
//--------------------------------------------------------------------
//+------------------------------------------------------------------+

Это должно сделать то, что вы хотите.

В текущем виде он не дает значения для сегодняшнего дня.

Если вы внесете изменения, как в выделенном тексте, это должно включить значение для сегодняшнего дня, которое будет начинаться с 0 и увеличиваться по мере продвижения дня.

 

Почему участок здесь не заполнен. Он не заполнен до января 2014 года. Пожалуйста, объясните, в чем проблема. Этот график был построен с использованием кода WHRoeder, но даже тот, который предложил GumRai, также дает такой же неполный график.

 
потому что у вас нет данных по М1 до этой даты