Что делать если не хватает 8-ми индикаторн. буфферов????!!!!

 
1. Что делать, если не хватает 8-ми индикаторных буферов???

2. Можно ли использовать простые массивы для промежуточных расчетов индикаторных буфферов.

3. Как это будет выглядеть в коде и что нужно учесть

С уважением
Максим

kotmot@bk.ru
 
1. Использовать еще один индикатор
2. Да, можно использовать.
3. Пример здесь - http://forexsystems.ru/phpBB/viewtopic.php?t=622&postdays=0&postorder=asc&highlight=tsi&start=30
 

Rosh, поправь меня, если ошибаюсь по поводу вопроса 1.

Можно и не использовать дополнительный индикатор, а просто использовать эти массивы в качестве возвращаемых аргументов своих функций, к которым обращение идет по ссылке, а ля Си. Вообще говоря, в MQL4 эта возможность вроде как не документирована, хотя в одном из примеров в Help, ArrayCopySeries(), видно, что пользовательскую функцию можно объявить с аргументом с обращением по ссылке (через одиночный амперсанд). Есть еще как пример библиотека функций быстрого преобразования Фурье https://www.mql5.com/en/code/7722, автор которой работает с массивами таким методом.

Разумеется, эти массивы не будут отображаться на чарте.

 
Ну.... там вылезает еще один .... проблем, с оптимизацией вычислений. (Не вникал , сказал что думаю).
 
Rosh:
Ну.... там вылезает еще один .... проблем, с оптимизацией вычислений. (Не вникал , сказал что думаю).

А вот теперь и мне стало интересно. И что же там за проблема такая?
 
Оптимизация алгоритма, ресурсы начнет жрать по экспоненте от количества баров нв графике. Для советников в тестере это будет просто убийца. Встатьте в любой пустой советник вызов индикатора AMA из CodeBase и запустите тестирование (а лучше оптимизацию).
 
Rosh:
Оптимизация алгоритма, ресурсы начнет жрать по экспоненте от количества баров нв графике. Для советников в тестере это будет просто убийца. Встатьте в любой пустой советник вызов индикатора AMA из CodeBase и запустите тестирование (а лучше оптимизацию).

На счет АМА не знаю, но библиотеки быстрого преобразования Фурье просто "летают" в тестере. :) Конечно многое зависит еще от самого кода эксперта...
 
Вот код советника
//+------------------------------------------------------------------+
//|                                                      TestAMA.mq4 |
//|                                                             Rosh |
//|                    http://www.alpari-idc.ru/ru/experts/articles/ |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link      "http://www.alpari-idc.ru/ru/experts/articles/"
 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Print("Начало");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Print("Финиш");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   double val;
   val=iCustom(Symbol(),0,"AMA",0,1);
//----
   return(0);
  }
//+------------------------------------------------------------------+

и код индикатора

//+------------------------------------------------------------------+
//|                                                          AMA.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, by konKop,wellx"
#property link      "https://www.metaquotes.net/"
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Sienna
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Gold
 
//---- input parameters
extern int       periodAMA=9;
extern int       nfast=2;
extern int       nslow=30;
extern double    G=2.0;
extern double    dK=2.0; 
 
//---- buffers
double kAMAbuffer[];
double kAMAupsig[];
double kAMAdownsig[];
 
//+------------------------------------------------------------------+
 
int    cbars=0, prevbars=0, prevtime=0;
 
double slowSC,fastSC;
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,0,2);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,159);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,159);
   //SetIndexDrawBegin(0,nslow+nfast);
   SetIndexBuffer(0,kAMAbuffer);
   SetIndexBuffer(1,kAMAupsig);
   SetIndexBuffer(2,kAMAdownsig);
     
   IndicatorDigits(4);
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    i,pos=0;
   double noise=0.000000001,AMA,AMA0,signal,ER;
   double dSC,ERSC,SSC,ddK;
   
   if (prevbars==Bars) return(0);
    
//---- TODO: add your code here
   slowSC=(2.0 /(nslow+1));
   fastSC=(2.0 /(nfast+1));
   cbars=IndicatorCounted();
   if (Bars<=(periodAMA+2)) return(0);
//---- check for possible errors
   if (cbars<0) return(-1);
//---- last counted bar will be recounted
   if (cbars>0) cbars--;
   pos=Bars-periodAMA-2;
   AMA0=Close[pos+1];
   while (pos>=0)
     {
      if(pos==Bars-periodAMA-2) AMA0=Close[pos+1];
      signal=MathAbs(Close[pos]-Close[pos+periodAMA]);
      noise=0.000000001;
      for(i=0;i<periodAMA;i++)
       {
        noise=noise+MathAbs(Close[pos+i]-Close[pos+i+1]);
       };
      ER =signal/noise;
      dSC=(fastSC-slowSC);
      ERSC=ER*dSC;
      SSC=ERSC+slowSC;
      AMA=AMA0+(MathPow(SSC,G)*(Close[pos]-AMA0));
      kAMAbuffer[pos]=AMA;
 
      ddK=(AMA-AMA0);
      if ((MathAbs(ddK)) > (dK*Point) && (ddK > 0)) kAMAupsig[pos] =AMA; else kAMAupsig[pos]=0;
      if ((MathAbs(ddK)) > (dK*Point) && (ddK < 0)) kAMAdownsig[pos]=AMA; else kAMAdownsig[pos]=0; 
 
     
      AMA0=AMA;
      pos--;
     };
//----
   prevbars=Bars;
   return(0);
  }
 
Да я не сомневаюсь, что АМА , будет тормозить.
Я просто хочу сказать, что можно использовать простые массивы для промежуточных расчетов.
Только злоупотреблять не нужно и, по возможности писать оптимальный код. И все будет нормально работать...
 
По поводу тормозов приведенного AMA.
Насколько я понял он не оптимизирован для быстрого вычисления и просчитывается полностью на каждом тике. Это вероятно вариант когда-то кем-то переделанный из индикатора еще под MT3.
У меня AMA оптимизированный, пересчитывает только последние измененные бары, он считается очень быстро (т.е. полный просчет только на первом запуске).
Кстати если для работы не нужны данные последнего формирующегося бара (работаем только по сформированной истории), то его можно еще ускорить исключив из вычислений последний бар и он будет фактически пересчитывать только сменяющийся бар один раз при формировании нового, остальное время расчет будет вообще пропускаться.
В общем как всегда - эффективный код писать надо. :)
 
Это все правильно. Но Mathemat предлагал использование дополнительных массивов в качестве парметров функций. И тут может оказаться такая же ситуация.
Причина обращения: