Иван Леонтьев (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Все индикаторы на Lua
 
Цитата
Oleg Kuzembaev написал:
Индикаторы представленные в терминале QUIK и их расчеты - это лишь примеры того, как они могут выглядеть.
Круто, то есть пользоваться встроенными индикаторами вы не рекомендуете, поскольку не отвечаете за достоверность их показаний? Это ничего что ваш продукт распространяется не бесплатно и я вправе рассчитывать на достоверность его данных, поскольку речь идет о потерянных мною деньгах в результате неправильных расчетов?
Цитата
Oleg Kuzembaev написал:
Если у пользователей есть желание изменить логику построения таких индикаторов, то они могут воспользоваться архивом с примерами таких индикаторов по ссылке
Да, спасибо, именно этими индикаторами я и воспользовался для проверки достоверности расчета. И спешу сообщить о предположительной неточности вашего расчета индикатора. Конечно у меня есть желание изменить логику и я буду вынужден пользоваться собственным индикатором с верным расчетом данных.
Все индикаторы на Lua
 
Привет, пожалуйста проверьте расчет индикатора 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


Ваша формула дает относительное изменение, а не абсолютную разницу!

Вопрос по индикатору
 
VPM, думаете я что-то понял из ваших слов? :lol:  Покумекал и вопрос решил методом от противного, Если на основе проблемного кода индикатора для Quik нейросеть написала беспроблемный код для ТрейдингВью, то почему бы не поступить наоборот? Я так и сделал, на основании беспроблемного кода для TradingView нейросеть написала мне  беспроблемный код для Quik, теперь все работает без ошибок. :cool:  
Вопрос по индикатору
 
Привет всем! Реализовал код индикатора. Это осциллятор двигающийся в диапазоне от 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

Я не программист и для написания кода пользовался одной из нейросетей. Буду благодарен за помощь в решении проблемы в виде исправленного кода.
Страницы: 1
Наверх