А Чудеса продолжаются! Оказывается, мало того что ADX(Lua) написан с ошибками, так еще и расчеты отличаются от ADX встроенного в терминал? Накидал свой вариант, но и он выводит другие значения:
Код
function algorithms.getADX()
--[[
Индикатор ADX с +DI и -DI
Среда: QUIK, Lua 5.4
По методике Уэллса Уайлдера (period = 14)
--]]
-- Вспомогательные функции
local function sum(t, start_idx, end_idx)
local total = 0
for i = start_idx, end_idx do total = total + (t[i] or 0) end
return total
end
local function average(t, start_idx, end_idx)
return sum(t, start_idx, end_idx)/(end_idx - start_idx + 1)
end
-- Локальные буферы для хранения данных
local TR, plusDM, minusDM = {}, {}, {}
local smoothedTR, smoothedPlusDM, smoothedMinusDM = {}, {}, {}
local plusDI, minusDI, DX, ADX = {}, {}, {}, {}
local initialized = false -- Флаг инициализации
return function (I, Fsettings, ds)
local Fsettings = Fsettings or {}
local P = Fsettings.Period or 14 -- Период расчета
-- Инициализация буферов при первом запуске
if I == 1 or not initialized then
TR, plusDM, minusDM = {}, {}, {}
smoothedTR, smoothedPlusDM, smoothedMinusDM = {}, {}, {}
plusDI, minusDI, DX, ADX = {}, {}, {}, {}
initialized = true
return nil, nil, nil
end
-- Получение цен текущего и предыдущего бара
local high = H(I) or 0
local low = L(I) or 0
local closePrev = C(I-1) or 0
local highPrev = H(I-1) or 0
local lowPrev = L(I-1) or 0
-- 1. Расчет True Range (TR)
TR[I] = math.max(
high - low,
math.abs(high - closePrev),
math.abs(low - closePrev)
)
-- 2. Расчет Directional Movement (+DM и -DM)
local upMove = high - highPrev
local downMove = lowPrev - low
plusDM[I] = (upMove > downMove and upMove > 0) and upMove or 0
minusDM[I] = (downMove > upMove and downMove > 0) and downMove or 0
-- 3. Сглаживание по методу Уайлдера
if I == P then
-- Первичное сглаживание (сумма первых P значений)
smoothedTR[I] = sum(TR, 2, P) -- TR начинается с 2-го бара
smoothedPlusDM[I] = sum(plusDM, 2, P)
smoothedMinusDM[I] = sum(minusDM, 2, P)
elseif I > P then
-- Рекуррентное сглаживание
smoothedTR[I] = smoothedTR[I-1] - (smoothedTR[I-1]/P) + TR[I]
smoothedPlusDM[I] = smoothedPlusDM[I-1] - (smoothedPlusDM[I-1]/P) + plusDM[I]
smoothedMinusDM[I] = smoothedMinusDM[I-1] - (smoothedMinusDM[I-1]/P) + minusDM[I]
end
-- 4. Расчет Directional Indicators (+DI и -DI)
if I >= P and smoothedTR[I] and smoothedTR[I] > 0 then
plusDI[I] = 100 * (smoothedPlusDM[I]/smoothedTR[I])
minusDI[I] = 100 * (smoothedMinusDM[I]/smoothedTR[I])
-- 5. Расчет Directional Movement Index (DX)
local di_sum = plusDI[I] + minusDI[I]
DX[I] = (di_sum ~= 0) and (100 * math.abs(plusDI[I] - minusDI[I])/di_sum) or 0
end
-- 6. Расчет ADX (сглаженный DX)
if I >= 2*P then
if I == 2*P then
-- Начальное значение ADX
ADX[I] = average(DX, P+1, 2*P) -- Среднее за P периодов
else
-- Сглаживание методом Уайлдера
ADX[I] = (ADX[I-1]*(P-1) + DX[I])/P
end
end
-- Возврат значений (ADX, +DI, -DI)
return ADX[I] or nil, plusDI[I] or nil, minusDI[I] or nil
end
end
Люди кто знаком с темой подскажите, что не так? То что должно занимать пять минут, колупаю который день, чай уже давно закончился, да и видимо чаем тут одним не обойтись.
Nikolay, Так и мой вариант не соответствует встроенному в терминал. Вроде все корректно делаю как в букваре? Накладываю один на другой не соответствуют?
Сравнил более внимательно, есть отличие в сглаживании и соответственно в масштабах отражения этих данных. В общем мой вариант рабочий, не читать же с графиков. А с фильтрами по экспериментирую еще, собственно это и была задача.
Идея заключается в том, чтобы заменить стандартные методы сглаживания на более эффективные, обеспечивающие меньшее запаздывание. Сглаживание по методу Уайлдера - Рекуррентное сглаживание, проблема, этого классического сглаживания (фактически EMA с α = 1/N) дает значительный лаг! Возможно это различие и является причиной различий в расчётах индикатора?
Для снижения лага в расчете ADX можно применить следующие типы фильтров, фокусируясь на ключевых этапах его вычислений: * фильтры из Swiss Army Knife (SAK), ранее на сайте мною были опубликованы в процедурной версии (как индикатор); * фильтры вроде Zero-Lag EMA (ZLEMA); * или адаптивные методы сглаживания, которые динамически подстраиваются под рыночные условия (Kalman Filter).
Оптимизация ADX с использованием фильтров Swiss Army Knife (SAK), наиболее любопытный вариант, интеграция фильтров Джона Элерса позволяет значительно снизить задержки ADX, сохранив его основную логику.
Сравнивать буду точки пересечения +DI/-DI в классической и SAK-версиях. Предварительные тесты показывают, что оптимизированная версия должна давать сигналы на 2-3 бара раньше при сопоставимой точности. Много это или мало судите сами, для HFT-стратегий (в рамках HFT-стратеги QUIK) это одна тема, для цикличных рынков совсем другая, ну и конечно для трендоследящих, ради чего все это затевалось (вспомнил хоть и отстал от графика, примерно так стоишь на остановке в ожидании поезда, а его все нет, вот уже вторые сутки нет). А получить торговый сигнал на 2-3 дня или часа РАНЬШЕ! Каково?
Пару слов о фильтрах, здесь имеет значение практически все, торговый тайм фрейм, период окна данных и так далее, все зависит от задачи что хотим выделить или подчеркнуть. Например, как вариант применения: Для высокочастотной торговли используйте - EMA или Butterworth_LP Для подавления шума в трендах - Kalman + Wavelet Для цикличных рынков - комбинация BP + HP Каждый из них вносит свою лепту в вычисления.
Начать можно с адаптивного периода + ZLEMA для сглаживания, для HFT-стратегий можно добавить Kalman Filter. Примеры стратегий которые хочу проверить: а) Тренд + Осциллятор: ФНЧ (Butterworth) для тренда + ФВЧ (HP) для сигналов входа. б) Цикловая торговля: BP-фильтр для выделения 14-дневного цикла + SMA для подтверждения. с) ? Арбитраж: BS-фильтр для подавления рыночного шума + EMA для анализа тренда.
Для тестирования в стратегии планирую сравнивать: 1) Задержку сигналов; 2) Количество ложных срабатываний; 3) Ну и можно рассчитывать соотношение Sharpe до/после оптимизации. Но для этого нужна торговая стратегия, но это уже совсем другая тема.
Тема фильтрации обширна, пишите свои идеи будем разбираться вместе.
Идея сглаживания - это борьба с выбросами. Как только Вы начинаете бороться с запаздыванием, то сразу возникает вопрос: а зачем тогда сглаживать? Тогда лучший - это просто сам график. Запаздывания нет. Ну и прежде чем браться за идею, стоит понять к чему приводит сглаживание. Это хорошо видно при преобразовании Фурье. Вот здесь очень наглядно про это https://rutube.ru/video/beeb00abb33061f14a37f54d3536a10b/
Т.е. если браться за фильтрацию сигнала, то сначала необходимо определиться для чего.
Nikolay, Отличное видео, прекрасная демонстрация, автору и Nikolay, - огромное спасибо за популяризирование и просвещение. К видео только одно замечание, преобразование Фурье вносит тоже запаздывание и его тоже нужно учитывать. У себя я просто держу напоминалочку, типа
Описание методов фильтрации в индикаторе Swiss Army Knife (John Ehlers): 1. EMA (Exponential Moving Average) - Тип: Однополюсный фильтр низких частот (ФНЧ). - Формула: Output = a * Price + (1 - a) * Previous_Output - Применение: Сглаживание ценовых данных, подавление высокочастотного шума. - Подходит для трендовых рынков. - Используется для определения направления тренда. - Пример: Выявление долгосрочных тенденций на дневных графиках.
2. SMA (Simple Moving Average)** - Тип: Равновесный ФНЧ. - Формула: Output = (Price + Price[1] + ... + Price[n]) / (n + 1) - Применение: Устранение рыночного шума с линейным сглаживанием. - Идеален для фильтрации "белого шума". - Используется в стратегиях пересечения средних. - Пример: Сигналы при пересечении 50- и 200-периодной SMA. ....
Условно тех. анализ делят на две основные группы. ▪ Графический анализ: Поддержка и сопротивление, Модели разворота и продолжения, Свечной анализ; ▪ Индикаторный анализ: Индикаторы тренда (сигналы продолжения), Осцилляторы (сигналы разворота), Анализ объема (дополнительные фильтры).
Я только сейчас рассуждаю про Индикаторный анализ, так как это просто математика, в рамках одной широко распространённой стратегии ADX RSI (в рамках 60% инвестиционного дохода). Для реальной торговли конечно нужен Графический анализ, у себя еще прикручиваю Анализ реального времени, но сейчас я не про это. Задачу ставлю разобраться и показать, что давно забытые стратегии прекрасно работают, в современных условиях.
Сглаживание, слишком упрощенно так рассматривать, прежде всего это преобразование для приемлемого вида, для применения в расчета, это всегда компромисс между сглаженностью и чувствительностью (отзывчивостью фильтра). Эти уникальные фильтры является результатом общих концепций цифровой обработки сигналов (DSP) для дискретных сетей сигналов, которые появляются в различных формах в техническом анализе. Передаточная функция такой дискретной линейной системы - это отношение выхода системы, деленное на вход. Если рассматривать весовые коэффициенты, для SMA это 1 равны на всем периоде данных, то для EMA они убывают, перенося важность значений на новые.
И последнее, просто напомню, что обратная величина частоте, это тот самый период, который мы просто можем адаптировать, с помощь математики. А значит и фильтры применять с этими периодами каждый по назначению.
VPM написал: И последнее, просто напомню, что обратная величина частоте, это тот самый период, который мы просто можем адаптировать, с помощь математики. А значит и фильтры применять с этими периодами каждый по назначению.
Это Вы может делать только если данные независимы. А если окно скользящее, с зависимостью, что изменяя "на лету" окно ничего хорошего ожидать не стоит.
Например ema - фильтр, где используется прошлое значение, полученное на текущем окне. Хотя да, это уже строго говоря не скользящее окно. На скользящем окне Вы каждый раз рассчитываете результат по данным этого окна, не смотря дальше. Но с другой стороны, если окно изменить, то можно получить резкий скачок в данных. Было окно 100, стало 10. Результат уже явно другой. Т.е. цель изменения окна - это изменить работу фильтра для всего сигнала. А если изменять его туда-обратно, то как такой сигнал потом интерпретировать.
В этом плане самый простой и понятный фильтр для финансовых данных - это WVAP. Есть веса от объема. Его можно даже доработать, добавив веса от позиции данных в окне выборки, снижая вес дальних индексов в окне. А просто фильтры основанные на математике из стационарных рядов - ещё надо объяснить почему это должно работать на финансовых данных.
Согласен, проблема тут есть, но ведь и задача при определении тренда стоит выделить несущею частоту, а значит незначительные изменения в значениях периода. А что смущает в использовании фильтра или индикатора, на мой взгляд так наиболее информативный подход, при графическом анализе все равно сохраняется не кая интуитивность. А в индикаторном поймал тренд так и сиди в нем, мне думается что много ошибок именно в применении. Еще один момент в рассуждениях о ценовых рядах, часто умалчивают, что сама экономика построена так что капитал дисконтируется, а активы дорожают. А что объем, посмотри те какие дисбалансы и гэпы (про срочный рынок). WaPrice подкачиваю посматриваю, очень часто дневная свеча меняет на переходах свой цвет. Насчет использования индикаторов, так а что тут объяснять, на мой взгляд все предельно просто, волновая структура применима ко всему, отображение цены на графике колебательный процесс, значить имеем полное право использовать амплитудно-частотные преобразования. Доказательством правомерности может служить мат. ожидание системы.
Странное определение тренда через частоту. Раз частота, значит колебательные движения. А если тренд, то какие тогда колебания. Тренд - это линейная зависимость.
Нет здесь странностей. просто ставим все на свои места. 1) Колебательные движения значит частота или волновой процесс. Поведение цены можно представить как сумму волн разной частоты и амплитуды (гармоники). 2) С точки зрения технического анализа, Тренд — это направленное движение цены (вверх или вниз). Он часто выглядит как линейная зависимость. Внутри тренда происходят колебательные (волатильные) движения: импульсы, откаты, коррекции.
Кстати у Вас есть прекрасный индикатор регрессионного анализа, выделяющий тренд 3 видов с использованием волатильности. Я его активно использую, пользуясь случаем хочу Вас попросить посмотреть его затирает текущие значения.
Наглядный пример моего подхода, как модели тренда, это синусоида, если взять от от мах до минимума и наоборот, чем не трендовое движении. функция распределения плотности в экстремальных диапазонах имеет максимальные значения, вот уже и Вайкофф появился с зонами распределения и накопления. Кстати функция распределения плотности цены на длительном интервале больше похожа как у синусоиды.