Форум трейдеров » Торговые роботы, советники, индикаторы » Вычисление скользящей средней от некоторого массива
+ Подписаться
Страница 2 из 2 ПерваяПервая 12
  1. 22
    Комментарии
    1
    Темы
    22
    Репутация Pro
    Аватар для reem  
    Новичок

    2 Медалей
    Цитата Сообщение от west100 Посмотреть сообщение
    Дело в следующем. Когда объявляется массив (Arr[] в данном случае), он не содержит элементов (пустой). А когда его в цикле начинаешь заполнять, то новые элементы не добавляются, и потом, когда его используешь - вместо заполненных значений подсовывается 0. Для добавления элементов такого массива надо использовать функцию ArrayResize(...). Но, если ты в функции Init() скажешь, что твой массив не просто массив - а индикаторный буфер, то элементы будут добавляться автоматически.
    Спасибо, попробую поразбираться с ArrayResize(). Хотя насколько я помню я для обоих массивов резервирую буфера.
  2. 22
    Комментарии
    1
    Темы
    22
    Репутация Pro
    Аватар для reem  
    Новичок

    2 Медалей
    Вот мой код, нужен ли здесь Arrayresize()?

    Код:
    #property copyright ""
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 Red  
    #property indicator_color2 Yellow
     
    double Arr[];
    double MABuffer[];
    extern string    Symbol_1="";
    extern string    Symbol_2="";
    extern int       mul1 = 1;
    extern int       mul2 = 1;
    
    extern int MA_Period=14;
    
    int counted_bars=0;
    
    int init(){
       //---- отрисовка линий индикатора
       SetIndexStyle(0,DRAW_LINE);
       SetIndexBuffer(0,Arr);
       SetIndexStyle(1,DRAW_LINE);
       SetIndexBuffer(1,MABuffer);
    
    return(0);
    }
    
    int deinit(){
    
    return(0);
    }
    
    int start()
    {
      int    counted_bars=IndicatorCounted();
      int i;
    
          for (i=0;i<Bars-counted_bars;i++) 
          {
             datetime t=Time[i]; // Время, соответствующее i-му бару 
               // на временной оси текущего инструмента
             Arr[i] = mul1*iClose(Symbol_1,0,iBarShift(Symbol_1,0,t)) -
             mul2*iClose(Symbol_2,0,iBarShift(Symbol_2,0,t));   
          }
          
          //---- расчёт скользящей средней от Arr    
                double pr1=2.0/(MA_Period+1);
                int    pos1=Bars-2;
                if(counted_bars>2) pos1=Bars-counted_bars-1;
                while(pos1>=0)
                   {
                      if(pos1==Bars-2) 
                         {
                            MABuffer[pos1+1]=Arr[pos1+1];
                         }
                      MABuffer[pos1]=Arr[pos1]*pr1+MABuffer[pos1+1]*(1-pr1);
     	               pos1--;
                   }
                   
                   Comment (Arr[0] ," ", MABuffer[0]);
                
    
        
    }
  3. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Попробуй так:

    int init(){

    IndicatorBuffers(2);
    //---- отрисовка линий индикатора
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0,MABuffer);
    SetIndexStyle(1,DRAW_LINE);
    SetIndexBuffer(1,Arr);

    return(0);
    }



    Тут есть одна фишка: буфер с индексом 0 надо задействовать для отрисовки, а с индексом 1 - можно сделать вспомогательным. И при этом явно указать количество буферов посредством вызова функции IndicatorBuffers(...);
  4. 22
    Комментарии
    1
    Темы
    22
    Репутация Pro
    Аватар для reem  
    Новичок

    2 Медалей
    Спасибо, теперь все считает, и, в принципе, для советника мне этого достаточно, но все равно интересно, почему отрисовывается только одна линия - либо из массива Arr[], либо MABuffer[]. По отдельности рисует, вместе - нет.
  5. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Видимо, потому, что в свойствах указано рисовать одну линию:
    #property indicator_buffers 1
  6. 22
    Комментарии
    1
    Темы
    22
    Репутация Pro
    Аватар для reem  
    Новичок

    2 Медалей
    Цитата Сообщение от west100 Посмотреть сообщение
    Видимо, потому, что в свойствах указано рисовать одну линию:
    #property indicator_buffers 1
    Большое спасибо, west100. Все заработало. Тему можно закрыть.

    Если кому нужно, вот этот индюк:

    Код:
    #property copyright ""
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Red  
    #property indicator_color2 Blue
     
    double Arr[];
    double MABuffer[];
    extern string    Symbol_1="";
    extern string    Symbol_2="";
    extern int       mul1 = 1;
    extern int       mul2 = 1;
    
    extern int MA_Period=14;
    
    int counted_bars=0;
    
    int init(){
    
    IndicatorBuffers(2);
    //---- отрисовка линий индикатора
       SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
       SetIndexBuffer(0,MABuffer);
       SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
       SetIndexBuffer(1,Arr);
    //---- начало отрисовки
       SetIndexDrawBegin(0,MA_Period);
       SetIndexDrawBegin(1,0);
    
    return(0);
    }
    
    int deinit(){
    
    return(0);
    }
    
    int start()
    {
      int    counted_bars=IndicatorCounted();
      int i;
    
          for (i=0;i<Bars-counted_bars;i++) 
          {
             datetime t=Time[i]; // Время, соответствующее i-му бару 
               // на временной оси текущего инструмента
             Arr[i] = mul1*iClose(Symbol_1,0,iBarShift(Symbol_1,0,t)) -
             mul2*iClose(Symbol_2,0,iBarShift(Symbol_2,0,t));   
          }
          
          //---- расчёт скользящей средней от Arr    
                double pr1=2.0/(MA_Period+1);
                int    pos1=Bars-2;
                if(counted_bars>2) pos1=Bars-counted_bars-1;
                while(pos1>=0)
                   {
                      if(pos1==Bars-2) 
                         {
                            MABuffer[pos1+1]=Arr[pos1+1];
                         }
                      MABuffer[pos1]=Arr[pos1]*pr1+MABuffer[pos1+1]*(1-pr1);
     	               pos1--;
                   }
                   
                   Comment (Arr[0] ," ", MABuffer[0]);
                
    
        
    }
    Сорри, что без комментариев, но думаю, что там все и так понятно.
  7. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Если тебе нужны были обе линии на индикаторе - то достаточно было написать #property indicator_buffers 2, и всё бы работало. Сейчас в Init() вызов процедуры IndicatorBuffers(2) в общем-то, бесполезен (хотя и не мешает).
    А как работать с этим индикатором?
  8. 22
    Комментарии
    1
    Темы
    22
    Репутация Pro
    Аватар для reem  
    Новичок

    2 Медалей
    Он мне нужен для написания советника по стратегии парного трейдинга. О нем можно почитать в этой ветке http://www.procapital.ru/showthread.php?t=22696.

Вверх
РегистрацияX

чтобы писать, читать, комментировать