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

    2 Медалей

    Вычисление скользящей средней от некоторого массива

    Есть массив:

    Код:
    datetime t=Time[i];
    Arr[i] = iClose(Symbol_1,0,iBarShift(Symbol_1,0,t)) -
    iClose(Symbol_2,0,iBarShift(Symbol_2,0,t));
    Необходимо вычислить от него скользящее среднее, делаю так:

    Код:
                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--;
                   }
    но массив не заполняется, или заполняется, но нулями. Где ошибка, подскажите.
    Недоступно! Pro 0
    Поделиться
    Просмотров: 9,360
  2. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    MABuffer[] как объявлен? Не int, случаем? Тогда нули и получите.
    А вообще, в MQL4 есть функция вычисления средней от массива:

    double iMAOnArray( double array[], int total, int period, int ma_shift, int ma_method, int shift)
    Расчет скользящего среднего на данных, хранящихся в массиве. В отличие от iMA(...) функция iMAOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries.
    Параметры:
    array[] - Массив с данными.
    total - Количество элементов для вычисления. 0 означает все элементы массива.
    period - Период усреднения для вычисления скользящего среднего.
    ma_shift - Сдвиг индикатора относительно ценового графика.
    ma_method - Метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average).
    shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

    Пример:
    double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0);
    double macurrentslow=iMAOnArray(ExtBuffer,0,10,0,MODE_LWM A,0);
    double maprev=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,1);
    double maprevslow=iMAOnArray(ExtBuffer,0,10,0,MODE_LWMA,1 );
    //----
    if(maprev<maprevslow && macurrent>=macurrentslow)
    Alert("crossing up");
  3. 22
    Комментарии
    1
    Темы
    22
    Репутация Pro
    Аватар для reem  
    Новичок

    2 Медалей
    MABuffer[] объявлен как double.
    Через iMAOnArray пробовал, не получается.
  4. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Изменение размеров Arr[] и MABuffer[] производится? (ArrayResize)
  5. 22
    Комментарии
    1
    Темы
    22
    Репутация Pro
    Аватар для reem  
    Новичок

    2 Медалей
    Изменение не производится.
    Вот смотрите, есть индюк RSI+MA.
    Мне нужно сделать по сути то же самое, но не для значений RSI, а именно для массива. По сути же не важно, как он посчитан, и что там у него внутри.
    Взял алгоритм расчета средней, а с моими данными он не работает.
    Ошибка наверняка дилетантская, но так как я ни разу не программист, вот и парюсь.
    Вложения Вложения
  6. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Запустил, чего-то рисует. Две линии, как заказано. А что должно быть-то?
  7. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Обрати внимание: в функции Init() есть строчки
    //---- 2 дополнительных буффера используются для расчётов
    IndicatorBuffers(4);
    SetIndexBuffer(2,PosBuffer);
    SetIndexBuffer(3,NegBuffer);

    Попробуй сделать то же самое для своего промежуточного массива.
  8. 22
    Комментарии
    1
    Темы
    22
    Репутация Pro
    Аватар для reem  
    Новичок

    2 Медалей
    В этом индикаторе расчет средней идет от массива RSIBuffer[]. Все правильно, но мне нужно посчитать разницу (спред) в пунктах между двумя инструментами, а потом взять среднее с периодом например 14 от этого спреда.
    Вот я и считаю спред:

    Код:
    datetime t=Time[i];
    Arr[i] = iClose(Symbol_1,0,iBarShift(Symbol_1,0,t)) -
    iClose(Symbol_2,0,iBarShift(Symbol_2,0,t));
    А средняя считаться не хочет, вывожу с помощью Comment (), а там 0. К сожалению, сейчас не могу приложить весь код расчета, на этом компе нету, только если вечером.

    Спасибо, что помогаете.
  9. 22
    Комментарии
    1
    Темы
    22
    Репутация Pro
    Аватар для reem  
    Новичок

    2 Медалей
    Цитата Сообщение от west100 Посмотреть сообщение
    Обрати внимание: в функции Init() есть строчки
    //---- 2 дополнительных буффера используются для расчётов
    IndicatorBuffers(4);
    SetIndexBuffer(2,PosBuffer);
    SetIndexBuffer(3,NegBuffer);

    Попробуй сделать то же самое для своего промежуточного массива.
    Эти буфера используются для расчетов RSI, вроде, для средней они не используются. Или нет?
  10. 2,012
    Комментарии
    25
    Темы
    1908
    Репутация Pro
    Аватар для west100  
    Мастер форумных наук

    6 Медалей
    Дело в следующем. Когда объявляется массив (Arr[] в данном случае), он не содержит элементов (пустой). А когда его в цикле начинаешь заполнять, то новые элементы не добавляются, и потом, когда его используешь - вместо заполненных значений подсовывается 0. Для добавления элементов такого массива надо использовать функцию ArrayResize(...). Но, если ты в функции Init() скажешь, что твой массив не просто массив - а индикаторный буфер, то элементы будут добавляться автоматически.

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

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