Скользящая средняя(SMA) в количестве 2000 шт. расчитать при минимальных затрат ресурсов. - страница 2

 
Top2n:

Здравствуйте, начал с начала, только теперь не могу опять же создать массив значений.

Идея такая:

Создаем массив из 2000 значений простой скользящей средней, применить к Median Price (HL/2)(не знаю как реализовать)

Через реализацию по подобию стандартного индикатора, путем вычисления предыдущих скользящих имея значение конечной 2000-ой MA.

Различные способы решения, но нечего не выходит, я не понимаю в какой момент вставлять, перепробовал всячески 

А чем стандартный пример не устраивает?

2000 значений - имеется в виду значения на 2000 баров? 

 
Andrey Khatimlianskii:

А чем стандартный пример не устраивает?

2000 значений - имеется в виду значения на 2000 баров? 

2000 значений - это 2000 значений разных машек на нулевом баре (или первом)
 
Victor Nikolaev:
2000 значений - это 2000 значений разных машек на нулевом баре (или первом)

Тогда я вернусь к своему предыдущему совету:

Скользящая средняя(SMA) в количестве 2000 шт. расчитать при минимальных затрат ресурсов.

Andrey Khatimlianskii, 2015.03.04 14:29

Вы себе представляете 256 точек на одном баре (кажется, именно столько буферов доступно)?
Какой в этом смысл?

Постарайтесь для начала представить результат. Нарисуйте.
Скорее всего, придет понимание, что нужно что-то другое. Тогда и возвращайтесь )

 

На данном этапе, не стоит вопрос выставления точек, я пытаюсь образовать массив значений, для дальнейшего манипулирования данными, но описанный ранее код слишком затратный по времени, нужно упростить, знатоки посоветовали использовать метод - аналог расчета стандартного индикатора МА. Теперь необходимо(Индикатор МА) как-то стандартную простую скользящую МА к Median Price (HL/2) преобразовать, для вычисления и организации массива значений фида в количестве Х-шт каждого бара.

 Путем вычисления -зная конечную МА на баре, вычисляя  в предыдущую МА, например зная МА 2000 узнать МА 1999 и т.д.

 

//+------------------------------------------------------------------+
//|  Moving Average                                                  |
//+------------------------------------------------------------------+
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[])
  {
//--- check for bars count
   if(rates_total<InpMAPeriod-1 || InpMAPeriod<2)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtLineBuffer,false);
   ArraySetAsSeries(ExtLineBufferFid,false);
   ArraySetAsSeries(close,false);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
      ArrayInitialize(ExtLineBuffer,0);
      ArrayInitialize(ExtLineBufferFid,0);
//--- calculation

      CalculateSimpleMA(rates_total,prev_calculated,close);
   ExtLineBufferFid[1]=(ExtLineBuffer[rates_total-InpMAPeriod]*InpMAPeriod-close[rates_total-InpMAPeriod])/(InpMAPeriod-1);    //по формуле  sma99[i]=(sma100[i]*100-d[i-100])/99;
//Подставлял всякое и в разные места- кавардак здесь пытаюсь получить просто значение предпоследней МА на 1 баре
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|   simple moving average                                          |
//+------------------------------------------------------------------+
void CalculateSimpleMA(int rates_total,int prev_calculated,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
   
     {
      limit=InpMAPeriod;
      //--- calculate first visible value
      double firstValue=0;
      for(i=0; i<limit; i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else
      limit=prev_calculated-1;
//--- main loop
   for(i=limit; i<rates_total && !IsStopped(); i++)
    {                                    
      ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
    }   
//---
  }
 
Top2n:

На данном этапе, не стоит вопрос выставления точек, я пытаюсь образовать массив значений, для дальнейшего манипулирования данными, но описанный ранее код слишком затратный по времени, нужно упростить, знатоки посоветовали использовать метод - аналог расчета стандартного индикатора МА. Теперь необходимо(Индикатор МА) как-то стандартную простую скользящую МА к Median Price (HL/2) преобразовать, для вычисления и организации массива значений фида в количестве Х-шт каждого бара.

Тогда вам надо 2000 буферов, и по каждому из них экономно считать SMA ;)

Это будет экономнее по процессору, но затратнее по памяти. 

 
2000 буферов даже если я не собираюсь данные выводить на график?
 
Top2n:
2000 буферов даже если я не собираюсь данные выводить на график?

Да. Экономный расчет предполагает использование предыдущих рассчитанных значений.

Поэтому отказывайтесь от него и считайте "в лоб". 

 
Гуси Гуси?)
 
2000 с разными периодами или 2000 каждая от предыдущей?
 
Dmitry Fedoseev:
2000 с разными периодами или 2000 каждая от предыдущей?
2000 с разными периодами
Причина обращения: