Скачать MetaTrader 5

Как в коде рассчитать МА по уже рассчитанной МА

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Maksim Garkin
8011
Maksim Garkin 2015.12.15 12:53 

Здравствуйте! Никак не получается рассчитать в коде индикатор построенный таким образом:

Строю обычную МА 20 на любом графике, потом строю еще одну МА 20, но указываю что использовать данные предыдущего индикатора, и строю третью МА 20, которая использует данные предыдущего индикатора.

Получается вот такая картинка

 

но запрограммировать это не получается

int period = 20;

double ma_fast = iMA(Symbol(),Period(),period,0,0,0,0);


double buf_fast[40];

for(int i = 39; i >=0; i--)

   buf_fast[i] = iMA(Symbol(),Period(),period,0,0,0,i);


double ma_slow = iMAOnArray(buf_fast,20,period,0,0,0);

double buf_slow[40];

for(int i = 0; i <=39; i++)

   buf_slow[i] = iMAOnArray(buf_fast,20,period,0,0,i);


double ma_very_slow = iMAOnArray(buf_slow,20,period,0,0,0);


 полученные данные вывожу в комментарий и сравниваю с нарисованными линиями. первая и вторая правильно, третья, самая медленная - не правильно.

Подскажите, пожалуйста, кто знает.  

Dmitry Fedoseev
43472
Dmitry Fedoseev 2015.12.15 13:24  

Нужно использовать ArraySetAsSeries()

Maksim Garkin
8011
Maksim Garkin 2015.12.15 13:43  
Dmitry Fedoseev:

Нужно использовать ArraySetAsSeries()

int period = 20;


double buf_fast[40];

for(int i = 39; i >=0; i--)

   buf_fast[i] = iMA(Symbol(),Period(),period,0,0,0,i);


double buf_slow[40];

for(int i = 39; i >=0; i--)

   buf_slow[i] = iMAOnArray(buf_fast,0,period,0,0,i);


ArraySetAsSeries(buf_fast,true);

ArraySetAsSeries(buf_fast,true);


double ma_fast = iMA(Symbol(),Period(),period,0,0,0,0);

double ma_slow = iMAOnArray(buf_fast,20,period,0,0,0);

double ma_very_slow = iMAOnArray(buf_slow,20,period,0,0,0);


Comment

   (

   "Ma_fast "+ ma_fast+"\n"+

   "Ma_slow "+ma_slow+"\n"+

   "Ma_very_slow "+ma_very_slow

   );

  

  }


 исправил дописал, но все равно не те цифры. 

 

Ihor Herasko
9261
Ihor Herasko 2015.12.15 14:28  

ArraySetAsSeries нужно применять до расчета значений по данным буфера, а не после.

И еще: значения элементов массива buf_slow  от 39-го по 21 включительно не будут правильными, т. к. для их верного расчета не хватает элементов в массиве buf_fast. Нужно либо уменьшить период, либо увеличить размер массива buf_fast с учетом величины периода.

forexman77
2141
forexman77 2015.12.15 14:49  

Если правильно понимаю, Вам необходимо каждые данные вновь сгладить? Или что-то другое?

 

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Magenta
#property indicator_color3 Orange
//--- input parameters
extern int            Period_1  =20;
extern int            Period_2  =20;
extern int            Period_3  =20;
//--- buffers
double m1[];
double m2[];
double m3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexBuffer(0,m1);
   SetIndexBuffer(1,m2);
   SetIndexBuffer(2,m3);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
 
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars-1;
      
   for(int i=limit;i>=0;i--)m1[i]=iMA(NULL,0,Period_1,0,MODE_EMA,PRICE_CLOSE,i);  
   for(i=limit;i>=0;i--)m2[i]=iMAOnArray(m1,0,Period_2,0, MODE_EMA,i);
   for(i=limit;i>=0;i--)m3[i]=iMAOnArray(m2,0,Period_3,0, MODE_EMA,i);

   return(0);
  }
//+------------------------------------------------------------------+
Maksim Garkin
8011
Maksim Garkin 2015.12.16 06:31  
forexman77:

Если правильно понимаю, Вам необходимо каждые данные вновь сгладить? Или что-то другое?

 

Спасибо. Именно то что нужно. 
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий