Ray Intraday
Ray Intraday личный блог
12 марта 2025, 13:33

Индикатор MA Color - модифицированный Moving Average

MA Color — это модифицированная скользящая средняя, которая меняет цвет в зависимости от направления тренда.

  • Зелёный цвет: восходящий тренд.
  • Красный цвет: нисходящий тренд.

Индикатор помогает визуально определять направление тренда, особенно на мелких таймфреймах.
Индикатор  MA Color  - модифицированный Moving Average


Settings = {
    Name = "MA Color",
    MAPeriod = 29, -- Период MA
    MAType = 0, -- Тип усреднения (0 = SMA, 1 = EMA, 2 = SMMA, 3 = LWMA)
    line = {
        {
            Name = "MA Up", -- Линия роста MA
            Color = RGB(0, 255, 0), -- Зелёный (рост)
            Type = TYPE_POINT,
            Width = 2
        },
        {
            Name = "MA Down", -- Линия падения MA
            Color = RGB(255, 0, 0), -- Красный (падение)
            Type = TYPE_POINT,
            Width = 2
        }
    }
}

-- Функция расчёта скользящей средней (без рекурсии)
function MovingAverage(index, period, matype)
    if index < period then return nil end  -- Проверяем, есть ли достаточно дан <a name="cut"></a> ных

    local sum = 0

    if matype == 0 then
        -- Простая скользящая средняя (SMA)
        for i = index - period + 1, index do
            sum = sum + C(i)
        end
        return sum / period

    elseif matype == 1 then
        -- Экспоненциальная скользящая средняя (EMA)
        local alpha = 2 / (period + 1)
        local ema = C(index) -- Начинаем с текущей цены

        -- Рассчитываем EMA вручную (без рекурсии)
        for i = index - period + 1, index - 1 do
            ema = (C(i) - ema) * alpha + ema
        end
        return ema

    elseif matype == 2 then
        -- Сглаженная скользящая средняя (SMMA)
        sum = 0
        for i = index - period + 1, index do
            sum = sum + C(i)
        end
        local smma = sum / period  -- Первое значение SMMA = SMA

        -- Рассчитываем SMMA без рекурсии
        for i = index - period + 1, index - 1 do
            smma = (smma * (period - 1) + C(i)) / period
        end
        return smma

    elseif matype == 3 then
        -- Линейно-взвешенная скользящая средняя (LWMA)
        local weightSum = 0
        local divisor = 0
        for i = 0, period - 1 do
            weightSum = weightSum + C(index - i) * (period - i)
            divisor = divisor + (period - i)
        end
        return weightSum / divisor
    end
end

-- Функция инициализации индикатора
function Init()
    return 2 -- Две линии: "MA Up" и "MA Down"
end

-- Основная функция расчёта индикатора
function OnCalculate(index)
    if index < Settings.MAPeriod then return nil, nil end

    local maCurrent = MovingAverage(index, Settings.MAPeriod, Settings.MAType)  -- Текущее значение MA
    local maPrev = MovingAverage(index - 1, Settings.MAPeriod, Settings.MAType)  -- Предыдущее значение MA

    -- Проверяем, что значения не nil
    if not maCurrent or not maPrev then return nil, nil end

    -- Определяем, какую линию отображать
    if maCurrent > maPrev then
        return maCurrent, nil -- Если MA растёт, рисуем только зелёную линию
    else
        return nil, maCurrent -- Если MA падает, рисуем только красную линию
    end
end
0 Комментариев

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн