Нужно использовать 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
);
}
исправил дописал, но все равно не те цифры.
ArraySetAsSeries нужно применять до расчета значений по данным буфера, а не после.
И еще: значения элементов массива buf_slow от 39-го по 21 включительно не будут правильными, т. к. для их верного расчета не хватает элементов в массиве buf_fast. Нужно либо уменьшить период, либо увеличить размер массива buf_fast с учетом величины периода.
Если правильно понимаю, Вам необходимо каждые данные вновь сгладить? Или что-то другое?
#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); } //+------------------------------------------------------------------+
Если правильно понимаю, Вам необходимо каждые данные вновь сгладить? Или что-то другое?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте! Никак не получается рассчитать в коде индикатор построенный таким образом:
Строю обычную МА 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);
полученные данные вывожу в комментарий и сравниваю с нарисованными линиями. первая и вторая правильно, третья, самая медленная - не правильно.
Подскажите, пожалуйста, кто знает.