Очень медленная скорость индикатора

 
//+------------------------------------------------------------------+
//|                                                   VWRSI.mq4      |
//|                        Пользовательский индикатор для MT4        |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_color1 Blue

// Временные буферы для индикатора
double VWRSIBuffer[];

// Входные параметры индикатора
input int period = 14; // Период RSI

//+------------------------------------------------------------------+
//| Инициализация индикатора                                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0, VWRSIBuffer); // Устанавливаем буфер для вывода индикатора
   SetIndexStyle(0, DRAW_LINE);    // Рисуем линию
   IndicatorShortName("VWRSI("+IntegerToString(period)+")");

   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Главная функция расчета индикатора                               |
//+------------------------------------------------------------------+
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 start = (prev_calculated > period) ? prev_calculated - 1 : period;
   double gain, loss, weighted_gain, weighted_loss, vol_sum;
   
   // Цикл расчета индикатора
   for(int i = 0; i < rates_total - 1; i++) // -1 чтобы избежать выхода за пределы массива
   {
      gain = 0.0;
      loss = 0.0;
      weighted_gain = 0.0;
      weighted_loss = 0.0;
      vol_sum = 0.0;

      // Расчет прироста и убытков
      for(int j = 0; j < period; j++)
      {
         double price_change = close[i + j] - close[i + j + 1]; // Изменение цены между текущим и предыдущими барами
         double volume_tick = tick_volume[i + j]; // Объем

         if(price_change > 0)
         {
            gain += price_change;
            weighted_gain += price_change * volume_tick; // Взвешенный объем
         }
         else
         {
            loss -= price_change;
            weighted_loss -= price_change * volume_tick; // Взвешенный объем
         }

         vol_sum += volume_tick;
      }

      // Расчет взвешенного RSI на основе объема
      double avg_gain = weighted_gain / vol_sum;
      double avg_loss = weighted_loss / vol_sum;

      if(avg_loss == 0)
         VWRSIBuffer[i] = 100;
      else
         VWRSIBuffer[i] = 100 - (100 / (1 + avg_gain / avg_loss));
   }

   return(rates_total);
  }
//+------------------------------------------------------------------+
 

О какой скорости может идти речь, если вы на каждом тике пересчитываете ВСЮ историю

for(int i = 0; i < rates_total - 1; i++) // -1 чтобы избежать выхода за пределы массива
Да ещё и цикл в цикле… Жесть…
 
Аркаша:

Я так и думал. Можете ли вы подсказать, пожалуйста, как это исправить?

 
Alexey Viktorov #:

О какой скорости может идти речь, если вы на каждом тике пересчитываете ВСЮ историю

Да ещё и цикл в цикле… Жесть…

Я прекрасно понимаю ваше возмущение на данный счет. С разработкой индикаторов встречаюсь гораздо реже чем с разработкой торговых роботов, потому и прошу помощи.

 

Я не читал, мне не интересно, но может в этой статье сможете что-то полезное почерпнуть. Не важно что на mql5 написана статья, важно понять принцип построения индикаторов.

Вы пишете на mql4, а направление индексации баров используете как в mql5. Был-бы один косяк, можно было-бы подсказать. А так получается объяснение на целую лекцию. Без обид…

Обсуждение статьи "Пользовательские индикаторы (Часть 1): Пошаговое руководство по разработке простых индикаторов на MQL5"
Обсуждение статьи "Пользовательские индикаторы (Часть 1): Пошаговое руководство по разработке простых индикаторов на MQL5"
  • 2024.09.17
  • MetaQuotes
  • www.mql5.com
Опубликована статья Пользовательские индикаторы (Часть 1): Пошаговое руководство по разработке простых индикаторов на MQL5 : Автор: Kelvin Muturi M...
 
Alexey Viktorov #:

Я не читал, мне не интересно, но может в этой статье сможете что-то полезное почерпнуть. Не важно что на mql5 написана статья, важно понять принцип построения индикаторов.

Вы пишете на mql4, а направление индексации баров используете как в mql5. Был-бы один косяк, можно было-бы подсказать. А так получается объяснение на целую лекцию. Без обид…

Спасибо за ответ! Спасибо, сяду изучу. Хорошего вам вечера!