Статистика пробоев High/Low текущего бара на основе тиковых значений - страница 2

 
vit_fx:

Объявил

 в ините - обнулил. А как обнулить при появлении нового бара? Где "оно" (появление нового бара) происходит исходя из кода? Я не могу этого понять:

Ну, можно было и поискать, обсосано-переобсосано:

   datetime   last_bar_time;
   int        check_high, check_low;
   int        change_high, change_low;
   double     prev_high, prev_low;

int init()
  {
   IndicatorBuffers(1);
   SetIndexBuffer(0,operation);
   
   last_bar_time = 0;

   return(0);
  }
   
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime& time[], 
                const double& open[], 
                const double& high[], 
                const double& low[], 
                const double& close[], 
                const long& tick_volume[], 
                const long& volume[], 
                const int& spread[]) 
  {
      // Новый бар или первый запуск
      if ( time[0] > last_bar_time )
      {
          last_bar_time = time[0];

          check_high  = 0; change_high = 0;
          check_low   = 0; change_low = 0;
          prev_high   = 0; prev_low = 0;
     }

     if ( MathAbs( close[0] - high[0] ) < DBL_EPSILON )   check_high++;
     if ( MathAbs( close[0] - low [0] ) < DBL_EPSILON )   check_low ++;
     if ( prev_high < DBL_EPSILON || high[0] > prev_high)   {prev_high = high[0];   change_high++;}
     if ( prev_low  < DBL_EPSILON || low [0] < prev_low )   {prev_low  = low [0];   change_low ++;}

     Print("High checked: ", check_high, " *** changed: ", change_high);
     Print("Low checked: ", check_low, " *** changed: ", change_low);
          
   //---- конец
   return(rates_total);
  }
 
Andrey Khatimlianskii:

Ну, можно было и поискать, обсосано-переобсосано:

Большое спасибо!

Написал в личку. 

 

Индикатор работает, но вот вопрос встал - почему он сильно нагружает систему? У ноута кулер постоянно пашет в режиме повышенного охлаждения, терминал грузит ЦП на 22%. Это из-за работы с тиками, я так, понимаю? Можно каким-либо не отказываясь от индикатора, решить проблему? Оптимизация кода?

 

//+------------------------------------------------------------------+
//|                                                      _model_.mq4 |
//|                           Copyright © 2003-2016, Худяков Виталий |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2003-2016, Худяков Виталий"
//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 4

   datetime   last_bar_time;
   int        check_high, check_low;
   int        change_high, change_low;
   double     prev_high, prev_low;
   
   double     high_checked[];
   double     high_changed[];
   double     low_checked[];
   double     low_changed[];
   
int init()
  {
   IndicatorBuffers(4);
   IndicatorDigits(0);
   
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_NONE);
   SetIndexStyle(2,DRAW_NONE);
   SetIndexStyle(3,DRAW_NONE);
   
   SetIndexBuffer(0,high_checked);
   SetIndexBuffer(1,high_changed);
   SetIndexBuffer(2,low_checked);
   SetIndexBuffer(3,low_changed);
   
   IndicatorShortName("bar_changing_model");
   SetIndexLabel(0,".... High - check");
   SetIndexLabel(1,".... High - move");
   SetIndexLabel(2,".... Low - check");
   SetIndexLabel(3,".... Low - move");
   
   last_bar_time = 0;

   return(0);
  }

   int OnCalculate(const int rates_total,       // кол-во баров на графике
                const int prev_calculated, 
                const datetime& time[], 
                const double& open[], 
                const double& high[], 
                const double& low[], 
                const double& close[], 
                const long& tick_volume[], 
                const long& volume[], 
                const int& spread[]) 
  {
      int    limit;
      int    counted_bars=IndicatorCounted();

      if(counted_bars>0) counted_bars--;
      limit=Bars-counted_bars;
   
      // Новый бар или первый запуск
      if ( time[0] > last_bar_time )
      {
          last_bar_time = time[0];

          check_high  = 0; change_high = 0;
          check_low   = 0; change_low = 0;
          prev_high   = 0; prev_low = 0;
      }
      
     if ( MathAbs( close[0] - high[0] ) < DBL_EPSILON )   check_high++;
     if ( MathAbs( close[0] - low [0] ) < DBL_EPSILON )   check_low ++;
     if ( prev_high < DBL_EPSILON || high[0] > prev_high)   {prev_high = high[0];   change_high++;}
     if ( prev_low  < DBL_EPSILON || low [0] < prev_low )   {prev_low  = low [0];   change_low++;}
     
               int i = iBarShift(NULL, 0, time[0], true);
               high_checked[i]   = check_high;
               high_changed[i]   = change_high;
               low_checked[i]    = check_low;
               low_changed[i]    = change_low; 

   //---- конец
   return(0);
  }
//+------------------------------------------------------------------+
 
Vitaliy Hudyakov:

Индикатор работает, но вот вопрос встал - почему он сильно нагружает систему? У ноута кулер постоянно пашет в режиме повышенного охлаждения, терминал грузит ЦП на 22%. Это из-за работы с тиками, я так, понимаю? Можно каким-либо не отказываясь от индикатора, решить проблему? Оптимизация кода?

 

Включите профилировщик и посмотрите.

Скорее всего, тормозит вот эта бесполезная строка:

int i = iBarShift(NULL, 0, time[0], true);
 
Оказалось не она, а как раз работа с тиками: https://yadi.sk/i/b4iF84T9quKR3
 
Vitaliy Hudyakov:
Оказалось не она, а как раз работа с тиками: https://yadi.sk/i/b4iF84T9quKR3
Естественно, 99% занимает ОнКалкулейт. А из них - 33% iBarShift. Который не нужен.
 
Andrey Khatimlianskii:
Естественно, 99% занимает ОнКалкулейт. А из них - 33% iBarShift. Который не нужен.
Андрей, так ведь iBarShift возвращает нам индекс бара, по которому потом формируются 4 массива для 4 буферов вывода. Как с ними тогда быть? Мне ведь нужно чтобы данные выводились в окно данных.
 
Vitaliy Hudyakov:
Андрей, так ведь iBarShift возвращает нам индекс бара, по которому потом формируются 4 массива для 4 буферов вывода. Как с ними тогда быть? Мне ведь нужно чтобы данные выводились в окно данных.
iBarShift(NULL, 0, time[0], true) всегда вернет 0.