MA Color — это модифицированная скользящая средняя, которая меняет цвет в зависимости от направления тренда.
Индикатор помогает визуально определять направление тренда, особенно на мелких таймфреймах.
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