Oleg Kuzembaev написал: Индикаторы представленные в терминале QUIK и их расчеты - это лишь примеры того, как они могут выглядеть.
Круто, то есть пользоваться встроенными индикаторами вы не рекомендуете, поскольку не отвечаете за достоверность их показаний? Это ничего что ваш продукт распространяется не бесплатно и я вправе рассчитывать на достоверность его данных, поскольку речь идет о потерянных мною деньгах в результате неправильных расчетов?
Цитата
Oleg Kuzembaev написал: Если у пользователей есть желание изменить логику построения таких индикаторов, то они могут воспользоваться архивом с примерами таких индикаторов по ссылке
Да, спасибо, именно этими индикаторами я и воспользовался для проверки достоверности расчета. И спешу сообщить о предположительной неточности вашего расчета индикатора. Конечно у меня есть желание изменить логику и я буду вынужден пользоваться собственным индикатором с верным расчетом данных.
Все индикаторы на Lua
Пользователь
Сообщений: Регистрация: 07.04.2025
02.02.2026 19:39:28
Привет, пожалуйста проверьте расчет индикатора Elder Force Index. Его показания не совпадают ни с одним из вариантов индикаторов Elder Force Index на Трейдинг Вью. Я сделал собственный расчет индикатора и его отображение тоже не совпадает с вашим индикатором, но зато совпадает с показаниями индикаторов на Трейдинг Вью. Тогда я предоставил ваш вариант расчета нейросети и попросил сравнить его с моим расчетом, в результате нейросеть сообщила следующее
В вашем коде ошибка в расчете Force Index:
local FI = (1 - GetValueEX(it.pp,VT,ds) / GetValueEX(it.p,VT,ds)) * GetValueEX(it.p,VOLUME,ds)
Это соответствует:
FI = (1 - Previous_Close/Current_Close) * Volume
Но по стандарту Elder's Force Index должно быть:
FI = (Current_Close - Previous_Close) * Volume
Ваша формула дает относительное изменение, а не абсолютную разницу!
Вопрос по индикатору
Пользователь
Сообщений: Регистрация: 07.04.2025
09.04.2025 11:34:42
VPM, думаете я что-то понял из ваших слов? Покумекал и вопрос решил методом от противного, Если на основе проблемного кода индикатора для Quik нейросеть написала беспроблемный код для ТрейдингВью, то почему бы не поступить наоборот? Я так и сделал, на основании беспроблемного кода для TradingView нейросеть написала мне беспроблемный код для Quik, теперь все работает без ошибок.
Вопрос по индикатору
Пользователь
Сообщений: Регистрация: 07.04.2025
07.04.2025 22:56:40
Привет всем! Реализовал код индикатора. Это осциллятор двигающийся в диапазоне от 100 до -100. Возникла проблема с неадекватным поведением индикатора на последней свече, при получении новой информации по ценной бумаге он зашкаливает, то есть упирается в предельный уровень своего движения. При переключении на другую ценную бумагу и возврат обратно индикатор показывает правильное значение до получения новой информации и снова начинает зашкаливать.
Код
-- Глобальная таблица настроек индикатора
Settings = {
Name = "Levels Force Index", -- Название индикатора
Period = 13, -- Период для расчета EMA
Overbought = 60, -- Уровень перекупленности (по умолчанию 60)
Oversold = -60, -- Уровень перепроданности (по умолчанию -60)
line = { -- Настройки линий индикатора
{
Name = "LFI", -- Имя основной линии индикатора
Color = RGB(255, 0, 0), -- Цвет основной линии (красный)
Type = TYPE_LINE, -- Тип линии
Width = 1 -- Толщина линии
},
{
Name = "Level 0", -- Нейтральный уровень
Color = nil, -- Цвет будет задан динамически
Type = TYPE_LINE, -- Тип линии
Width = 1 -- Толщина линии
},
{
Name = "Overbought Level", -- Уровень перекупленности
Color = nil, -- Цвет будет задан динамически
Type = TYPE_LINE, -- Тип линии
Width = 1 -- Толщина линии
},
{
Name = "Oversold Level", -- Уровень перепроданности
Color = nil, -- Цвет будет задан динамически
Type = TYPE_LINE, -- Тип линии
Width = 1 -- Толщина линии
}
},
Overlay = false -- Отображение поверх графика (false - отдельное окно)
}
-- Функция инициализации индикатора
function Init()
-- Динамически назначаем цвет всех уровней
local mainLineColor = Settings.line[1].Color -- Цвет основной линии
Settings.line[2].Color = mainLineColor -- Цвет нейтрального уровня
Settings.line[3].Color = mainLineColor -- Цвет уровня перекупленности
Settings.line[4].Color = mainLineColor -- Цвет уровня перепроданности
return #Settings.line -- Возвращаем количество линий индикатора
end
-- Переменные для хранения состояния индикатора
local EMA_Up = nil -- EMA положительных изменений
local EMA_Down = nil -- EMA отрицательных изменений
local alpha = nil -- Коэффициент сглаживания для EMA
-- Основная функция расчета индикатора
function OnCalculate(index)
-- Получаем текущую цену закрытия и объем
local Close = C(index)
local Volume = V(index)
-- Если это первый период, инициализируем переменные
if index == 1 then
EMA_Up = 0
EMA_Down = 0
alpha = 2 / (Settings.Period + 1) -- Вычисляем коэффициент сглаживания
return 0, 0, Settings.Overbought, Settings.Oversold -- Возвращаем значения для уровней
end
-- Рассчитываем изменение цены
local DeltaP = Close - C(index - 1)
-- Определяем Up и Down с учетом объема
local Up = DeltaP > 0 and DeltaP * Volume or 0
local Down = DeltaP < 0 and math.abs(DeltaP) * Volume or 0
-- Рассчитываем EMA_Up и EMA_Down
if index > 1 then
EMA_Up = alpha * Up + (1 - alpha) * EMA_Up
EMA_Down = alpha * Down + (1 - alpha) * EMA_Down
end
-- Рассчитываем значение Levels Force Index (LFI)
local LFI
if (EMA_Up + EMA_Down) ~= 0 then
LFI = ((EMA_Up - EMA_Down) / (EMA_Up + EMA_Down)) * 100
else
LFI = 0
end
-- Возвращаем значения для всех линий: LFI, уровень 0, уровень перекупленности, уровень перепроданности
return LFI, 0, Settings.Overbought, Settings.Oversold
end
Вопрос в том адекватно ли ведет себя индикатор иcходя из формулы и особенностей Quik? Я так же реализовал данный индикатор для платформы TradingView и там такой проблемы нет.
Я решил проблему в Quik путем добавления буферизации, и теперь индикатор отрисовывается на свече только после ее полного закрытия. но это не то чтобы мне хотелось. Возможно ли решить проблему без буферизации?
Код
-- Глобальная таблица настроек индикатора
Settings = {
Name = "Levels Force Index", -- Название индикатора
Period = 13, -- Период для расчета EMA
Overbought = 60, -- Уровень перекупленности (по умолчанию 60)
Oversold = -60, -- Уровень перепроданности (по умолчанию -60)
line = { -- Настройки линий индикатора
{
Name = "LFI", -- Имя основной линии индикатора
Color = RGB(255, 0, 0), -- Цвет основной линии (красный)
Type = TYPE_LINE, -- Тип линии
Width = 1 -- Толщина линии
},
{
Name = "Level 0", -- Нейтральный уровень
Color = nil, -- Цвет будет задан динамически
Type = TYPE_LINE, -- Тип линии
Width = 1 -- Толщина линии
},
{
Name = "Overbought Level", -- Уровень перекупленности
Color = nil, -- Цвет будет задан динамически
Type = TYPE_LINE, -- Тип линии
Width = 1 -- Толщина линии
},
{
Name = "Oversold Level", -- Уровень перепроданности
Color = nil, -- Цвет будет задан динамически
Type = TYPE_LINE, -- Тип линии
Width = 1 -- Толщина линии
}
},
Overlay = false -- Отображение поверх графика (false - отдельное окно)
}
-- Функция инициализации индикатора
function Init()
-- Динамически назначаем цвет всех уровней
local mainLineColor = Settings.line[1].Color -- Цвет основной линии
Settings.line[2].Color = mainLineColor -- Цвет нейтрального уровня
Settings.line[3].Color = mainLineColor -- Цвет уровня перекупленности
Settings.line[4].Color = mainLineColor -- Цвет уровня перепроданности
return #Settings.line -- Возвращаем количество линий индикатора
end
-- Переменные для хранения состояния индикатора
local EMA_Up = nil -- EMA положительных изменений
local EMA_Down = nil -- EMA отрицательных изменений
local alpha = nil -- Коэффициент сглаживания для EMA
local LastBarIndex = nil -- Индекс последнего завершенного бара
-- Основная функция расчета индикатора
function OnCalculate(index)
-- Получаем текущую цену закрытия и объем
local Close = C(index)
local Volume = V(index)
-- Проверяем, является ли текущий бар завершенным
if index == Size() then
-- Если это последний бар, используем данные только если бар завершился
if LastBarIndex == index then
-- Бар уже обработан, возвращаем предыдущее значение
return LFI, 0, Settings.Overbought, Settings.Oversold
else
-- Запоминаем индекс нового бара
LastBarIndex = index
end
end
-- Если это первый период, инициализируем переменные
if index == 1 then
EMA_Up = 0
EMA_Down = 0
alpha = 2 / (Settings.Period + 1) -- Вычисляем коэффициент сглаживания
return 0, 0, Settings.Overbought, Settings.Oversold -- Возвращаем значения для уровней
end
-- Рассчитываем изменение цены
local DeltaP = Close - C(index - 1)
-- Определяем Up и Down с учетом объема
local Up = DeltaP > 0 and DeltaP * Volume or 0
local Down = DeltaP < 0 and math.abs(DeltaP) * Volume or 0
-- Рассчитываем EMA_Up и EMA_Down
if index > 1 then
EMA_Up = alpha * Up + (1 - alpha) * EMA_Up
EMA_Down = alpha * Down + (1 - alpha) * EMA_Down
end
-- Рассчитываем значение Levels Force Index (LFI)
local LFI
if (EMA_Up + EMA_Down) ~= 0 then
LFI = ((EMA_Up - EMA_Down) / (EMA_Up + EMA_Down)) * 100
else
LFI = 0
end
-- Возвращаем значения для всех линий: LFI, уровень 0, уровень перекупленности, уровень перепроданности
return LFI, 0, Settings.Overbought, Settings.Oversold
end
Я не программист и для написания кода пользовался одной из нейросетей. Буду благодарен за помощь в решении проблемы в виде исправленного кода.