Блог им. Andrejnamillion
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