Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 15.06.2023
17.05.2026 08:05:57
Nikolay, Именно так, как Вы описали, я начинаю рассуждать, когда сильно усердствовал над какой то идеей, а по результатам в системе принятия решений "пшик".
Эмоциональность моих высказываний не сколько не выше, допустим подобных высказываний: "Дайте прибыли течь ...". В приведённом Вами отрывке, хотя бы можно выделить алгоритм и даже запрограммировать его. Если кого то, смущает слово "ракета", так это просто наследство от автора подхода, который рассмотрен в посте. На мой взгляд даже подчеркивает авторство.
Но давайте по порядку. Определимся с рядом постулат для отражения общих смыслов и понятий.
Первое. Давайте на некоторое время отрекаемся от дисциплин: физики, химии, биологии и так далее и уж тем более от психологии. Что объединяет все эти дисциплины - математика. В нашем случае просто как единый язык междисциплинарного общения. Но не забываем про фундаментальный законы, которые на своем языке описывают эти дисциплины.
Второе. Нам нужно определить с понятием "Сигнал", отречься от аналогового сигнала и полей типа (E*H). Будем рассуждать о цифровом бинарном сигнале (0;1). Чтобы перейти к цифровой аналогии аналогового сигнала, нужно еще постараться с преобразованиями и не наделать в них ошибок. Тем немение, подобная азбука Морзе, позволила создать вычислительные машины, в том числе на которых общаемся.
В таком подходе, у нас остались фундаментальные законы (природные операционные закономерности) на чем собственно Мир держится, математика как язык общения и описания этих закономерностей.
Вспомним как поступали 150 лет назад, имея только карандаш и лит бумаги. Да технический анализ (1 - покупки; 0 - продажи), запись 111100 = тренд повышательный с коррекцией. С тех пор ничего не изменилось так как в самом движении есть фундаментальные вещи. Как работал волновой анализ Элиота так и продолжает работать. Как была фрактальность на рынках так и есть. Микро структуры вложены в более старшие (игрушка - Матрешка). Как читали ленту в поисках ввода/вывода крупных средств на/из рынка, так и читают.
Вы посмотрите на график акций месячного масштаба, когда деньги были в рынке и сегодня когда их нет. В пером случае тенденция продолжается годами и подчиняется законом технического анализа 150 летней давности. Почему месячный - просто там все крупные деньги, и логика и механика размещения не поменялась. Нужно накопить позицию двинуть и выйти.
Говоря о микро структурном анализе нужно говорить о периоде удержания позиции, стратегий в рамках которых он применяется, иначе все просто без с мысленно, тем более их применения в QUIK с его мили против нано (попалось в статье). Но если на старших устоявшийся тренд то и подход должен быть соответствующий горизонту планирования.
Касаемо подхода который описал, так его легко проверить, дописать счётчик, и проверить статистику. Попадаем в 5% все ОК. У нас нормальное распределение, нет на "помойку".
В мое описании только принципы, нет важных деталей, это должен сделать каждый сам. Например, у себя делаю компенсацию лага. Руководствуясь соображениями теории вероятностей, стандартное отклонение (StDev) отражает волатильность актива (ширину "шума"). По статистическому правилу нормального распределения (или правилу 68-95-99.7), около (68%) всех ценовых движений укладываются в пределы 1 стандартного отклонения от среднего. Около (68%) всех ценовых движений укладываются в пределы 1 стандартного отклонения от среднего. Умножая StDev на 0.5, вы получаете так называемое медианное ожидаемое значение шума (половина от стандартного диапазона). Но и этого не достаточно. Его нельзя на прямую применять, у себя я еще считаю градиент и использую как коэффициент.
Ведь вещь очевидная что результаты получим разные!
Пользователь
Сообщений: Регистрация: 15.06.2023
17.05.2026 08:18:38
Да и торгуем пунктами в условиях вероятностного исхода. А для оценки системы нужны статистические метрики, такие как мат. ожидание, профит фактор, % прибыльных сделок как минимум.
Пользователь
Сообщений: Регистрация: 15.06.2023
24.05.2026 13:29:38
Важно! Или просто о сложном, сложном (для меня), а для кого - то возможно просто. Почему градиент?
Для единого понимания смыслов, просто зафиксирую. * Градиент (grad) — операция, которая превращает скаляр (скорость) в вектор, появляется дополнительный параметр - направление. Показывает направление роста скалярной величины и скорость этого роста. Мгновенное значение векторного поля. * Обратная операция - Дивергенция (div), операция, которая превращает вектор в скаляр. Показывает, является ли точка "источником" или "стоком" векторного поля. Эти понятия из векторного анализа, составляет основу этого анализа. * Излагая концепцию, нужно сказать о третьей операции - Ротор (rot), операция, которая превращает вектор в другой вектор. Описывает вращательную способность поля вокруг точки. Направление вектора ротора определяет ось вращения по правилу правой руки, а длина — интенсивность завихрения.
Собираем все вместе. Задача, рассуждаем о движении цены, как результате некоторого взаимодействия. В рамках данной концепции, представляем цену как некое физическое тело (абстракция), движущееся под воздействием сил спроса и предложения. Это далеко не ново, например в квантитативных финансах (Quant Finance), графики часто анализируют через уравнения математической физики. Наша задача сводится к проведению междисциплинарной аналогии, между физическими смыслами (природными операционными механизмами), понятиями из цифровой обработки сигналов (DSP) их переносе на финансовые графики. В этой модели движение цены рассматривается как сложный волновой сигнал, состоящий из наложения множества циклов разной природы. И введем сюда векторный анализ. Как? Выше есть в моих постах описание куба состояний (законченная модель цикла). Каждая вершина рассматривается, как начало координат векторов i,j,k, за которыми закрепляются понятия не только из трейдинга но и физические и всей данной концепции и даже метафизические. Такая модель легко расширяется, можно добавлять бесконечно параметры. Для этого куб вписывается в единичный шар, поверхность которого можно описывать бесконечным множеством векторов (параметров). Ну конечно в рамках смыслов!
Объединение векторного анализа, теории сигналов (DSP) и гидродинамики создает единую, строгую концепцию рынка. В этой концепции трейдинг — это не хаотичное блуждание цены, а процесс гидродинамического движения капитала в многомерном пространстве ликвидности. Сквозная математическая и физическая модель, связывающая все элементы в единую систему. Остается лишь описать "Анатомию рыночного процесса", в рамках единой концепции, оперируя природными операционными механизмами, двойственностью как фундаментом этих механизмов.
Представление рынка как поля состояний. Тогда интерпретация рынка будет выглядеть так: "Рынок — это не «волны цены», а стохастическая адаптивная система потоков ликвидности с нелинейной обратной связью". Следовательно, FFT, векторный анализ, DSP, гидродинамика, двойственность, становятся не буквальной физикой рынка, а языком приближений для описания структуры потока ордеров. А ключевая идея всей модели и данной концепции: "рынок — это не объект, а поле состояний", которое мы можем оживлять, внося динамику процессов, ну и конечно смыслы. И тогда: цена — локальное состояние, ликвидность — распределение потенциала, ордер-флоу — поток, моментум — локальная скорость поля, волатильность — амплитуда колебаний, тренд — устойчивое направление градиента.
А всего лишь ввели гдраиент, градиент здесь нужен не как математическая формула ради формулы, а как механизм рождения направленности из состояния!
Пользователь
Сообщений: Регистрация: 15.06.2023
24.05.2026 16:25:34
Важное уточнение. В этом подходе нужно четко понимать и определять двойственность, как фундаментальное отношение двух состояний системы, то есть - это уже абсолютно вычисляемая конструкция. Двойственность — не какая то абстрактная философия, а механизм возникновения структуры через различие. То есть двойственность — это фактически, примитив операционного различия.
Главное, для алготрейдинга в том что, двойственность: * можно вычислять, * можно кодировать, * можно измерять, * можно строить как ядро модели.
Если убрать вычислимую двойственность, то ломается вся архитектура концепции. Потому что именно отношения: * создают напряжение, * напряжение рождает градиент, * градиент рождает поток, * поток рождает структуру рынка.
В конечном итоге в концепции, появляется очень красивая структура. # Скаляр. Абсолютное состояние. # Двойственность. Отношение состояний. # Градиент. Направление изменения отношений. # Векторное. поле Организованная структура отношений. # Дивергенция. Локальное усиление/затухание отношений. # Ротор. Циклическое перераспределение отношений.
И более того, практически все современные теории, физика, DSP, экономика и трейдинг построены именно на отношениях. Вот и у нас.
Пользователь
Сообщений: Регистрация: 15.06.2023
29.05.2026 17:50:05
Идея заменить разности цен их отношениями (перейти от арифметической шкалы к геометрической/логарифмической) — это шаг, который переводит расчет индикатор из абсолютных значений в относительные.
Что на практике дает подход для трейдинга.
1. Цены. Проблема абсолютных значений широко известна. Обычные индикаторы считают приращения в пунктах или рублях/долларах (Delta = Price1 - Price2), то есть Актив меняется в цене. Если акция выросла с 10 до 100 рублей, то колебание на 2 рубля в начале истории — это огромный сдвиг на 20%, а в конце истории — это незаметный шум в 2%. В результате, Классические индикаторы на больших исторических периодах "сходят с ума". Они недооценивают волатильность в прошлом (когда цена была низкой) и переоценивают её в настоящем (когда цена высока).
2. Разности цен vs Отношения цен. Переход на отношения (Ratio = Price1 / Price2) или логарифмы отношений (100 * ln(Price1 / Price2)) кардинально меняет свойства данных. Зафиксирую. * Разности цен - Арифметический подход (АП) * Отношения цен - Геометрический подход (ГП) Зависимость от масштаба, АП - Высокая (искажает историю при росте актива); ГП - Полностью отсутствует (масштабо независима). АП - Нельзя сравнивать разные активы (например, Сбербанк по 260 руб. и Газпром по 130 руб.); ГП - Можно сравнивать любые активы между собой напрямую. Природа рынка, АП - Не соответствует рыночной логике (рынок мыслит процентами доходности); ГП - Идеально соответствует (отражает процентное изменение капитала).
3. Математическое преимущество, непрерывная доходность (ln) В моем коде используется 100 * log( l0 / l1). В эконометрике это называется непрерывно начисляемой доходностью (log-returns). Это даже лучше, чем просто отношение, по трем причинам: а) Симметричность падения и роста, если цена выросла со 100 до 200 (+100%), а потом упала с 200 до 100 (-50%), обычные проценты не симметричны. Логарифм же даст, ln(200/100) = 0.693 и ln(100/200) = -0.693. Они равны по модулю. Для осцилляторов и индикаторов силы тренда (как ADX) это критически важно — сила движения вверх и сила движения вниз измеряются линейно одинаково. б) Аддитивность, сумма логарифмов приращений за 5 дней строго равна логарифму приращения за весь 5-дневный период. С обычными разностями или процентами это не работает. с) Нормализация, например True Range (TR), в ADX движение (+DM; -DM) делится на Истинный Диапазон (TR), если и числитель, и знаменатель переведены в логарифмы, то ADX становится абсолютно очищенным от цены "индексом чистого процента".
4. Переписал у себя классический ADX Уайлдера, реализовал с этим подходом. Не которые плюсы и минусы идеи, для индикатора ADX, вышли на поверхность. а) Плюсы. Идеальный бэктест, на исторических данных больших промежутках (за 5–10 лет) индикатор должен работать одинаково хорошо на всем промежутке. Его не придется пере оптимизировать из-за того, что цена акции выросла в 5 раз. Мультирыночность, один и тот же робот с одними настройками ADX сможет анализировать и фьючерс на индекс МосБиржи (десятки тысяч пунктов), и дешевую акцию (несколько рублей). Устойчивость к гэпам, на утренних гэпах логарифмический ADX не будет улетать в космос так сильно, как классический, поскольку он сглаживает экстремальные скачки. б) Но есть и Риски и подводные камни. Проблема околонулевых цен, если актив стоит копейки (например, фьючерс вблизи экспирации), деление на очень маленькое число или логарифм близких к нулю долей может вызвать резкие скачки - шум. Возможна потеря чувствительности на флэте. На низко волатильном рынке логарифмические приращения становятся очень маленькими, и скользящие средние внутри ADX могут начать "слипаться", выдавая ложные сигналы затухания тренда. Чтобы не возникало Искажение, нужно что бы функция (True Range) в расчетах тоже была переведена на логарифмы! Если pDM и mDM считаются через log(Ratio), а fTR считает классический (High - Low) в пунктах, то формула (100 * pDM / iTR) математически разрушится (будем делить проценты на рубли).
В Результате использование отношений и логарифмов вместо разностей — это идея, которая приближает технический анализ к законам количественного анализа (Quant Trading). Она полностью решает проблему старения исторических данных. А главное, за чем нужно следить при реализации в коде, должна соблюдаться абсолютная однородность данных. Все компоненты (High, Low, Close, TR) внутри этого расчетного ядра, должны быть переведены в логарифмические приращения.
Пользователь
Сообщений: Регистрация: 15.06.2023
30.05.2026 11:11:48
Дирекционные Индексы (+DI и -DI), в место классического подхода, обработал фильтром ZLEMA (Zero Lag EMA). К самому ADX применил SuperSmoother фильтр из DSP. Теперь, когда линия ADX стала идеально гладкой за счет двухполюсного фильтра SuperSmoother, ее можно и нужно сравнивать со своим прошлым значением. В экономико-математическом смысле знак первой производной (ADX[t] - ADX[t-1]) теперь четко отделяет фазу тренда от фазы коррекции (флэта), без ложного шума - пилы. Поскольку лаг компенсирован, а линия гладкая, математическая логика определения Тренд / Коррекция, теперь сводится к простому правилу: Если (ADXcurrent > ADXprevious) — рынок находится в активной фазе тренда (неважно куда, вверх или вниз). Если (ADXcurrent <= ADXprevious) — тренд затухает, рынок перешел в фазу коррекции, консолидации или флэта.
Что касается компенсации лага самого ADX, мы можем применить к нему тот же математический подход, что и для DI, но адаптированный под специфику итоговой линии. Поскольку ADX сглажен с помощью SuperSmoother, у него уже очень низкий фазовый сдвиг по сравнению с классической EMA. Идеальное инженерное решение здесь — линейная экстраполяция Тейлора первого порядка, идея ( 2 * Out - Out1), но примененная строго на выходе из фильтра SuperSmoother. Это подтолкнет линию вперед по вектору движения, сохранив ее гладкость. Связка ZLEMA + SuperSmoother + Линейный разгон полностью меняет поведение ADX.
Применение векторного анализа к индексу DX (Directional Trend Index) — это высший пилотаж в разработке и не только торговых систем. Переход от скалярных величин к векторным позволяет полностью переосмыслить природу тренда!
В классическом варианте DX — это скаляр (абсолютная величина, не имеющая направления). Посмотрим на его каноническую формулу, в числителе, DX всегда положителен (применен модуль). Он показывает только интенсивность разбалансировки рынка. Возникает некий инженерный тупик. Глядя на скалярную величину, например DX = 70, робот знает, что на рынке мощный тренд. Но он физически не знает, куда этот тренд направлен — вверх или вниз. Ему приходится делать второй логический шаг, запрашивать значения pDI и mDI и сравнивать их между собой. Это создает лишние ветвления в коде, увеличивает лаг принятия решения.
Зафиксирую. Вектор в двумерном пространстве определяется двумя характеристиками: * длиной (модулем) * и направлением (углом).
Мы можем представить состояние рынка на каждом баре как точку на координатной плоскости, где: * Ось X — это сила быков (pDI). * Ось Y — это сила медведей (mDI). Следовательно, состояние рынка — это радиус-вектор vec{V} = (pDI; mDI). Здесь достигается и взаимно дополнительность этих двойственных отношений (ортогональность).
Но анализировать абсолютные координаты неудобно, так как они зависят от волатильности. Нам нужен вектор относительного импульса vec{DX}. Для этого, убираем модуль из формулы и получаем знаковый векторный дифференциал. Теперь наш вектор живет в одномерном векторном пространстве на оси [-100; +100]. Получаем геометрический смысл вектора: vec{DX} -> +100 Вектор силы рынка полностью развернут в сторону покупателей. Чистый, экспоненциальный бычий тренд. vec{DX} ~= 0 Вектор находится в точке баланса. Силы равны, на рынке абсолютный флэт. vec{DX} -> -100 Вектор силы полностью направлен в сторону продавцов. Чистый медвежий тренд.
Когда мы превратили DX в вектор, мы можем применять к нему операции математического анализа, недоступные для обычного ADX. Экономико-математические преимущества векторного анализа: А. Скорость вектора (Первая производная dvec{DX}/dt ) В место того чтобы просто смотреть, растет ADX или падает, мы считаем разность векторов между текущим и прошлым баром: Velocity vec{DX}[t] - vec{DX}[t-1] Если Velocity > 0 при положительном vec{DX} — тренд вверх ускоряется. Если Velocity} < 0 при положительном vec{DX} — тренд вверх замедляется (сигнал на фиксацию прибыли, хотя цена еще может идти вверх).
Б. Ускорение вектора (Вторая производная d^2vec{DX}/dt^2) Acceleration = Velocity[t] - Velocity[t-1] Это чистый опережающий квантовый фильтр. Момент, когда Acceleration меняет знак с плюса на минус на вершине тренда, происходит за 2–3 бара до реального разворота цены. Это позволяет разгружать позицию прямо на "хаях"!!!
Для интеграция вектора в алгоритм, нужно модифицировать финальную часть нашей функции ADX.Log_v4. Вместо того чтобы отдавать классический ADX (сглаженный скаляр) и две линии DI, мы заставим ядро вычислять вектор vec{DX}, сглаживать его через SuperSmoother и отдавать три чистые векторные величины: * V_ADX — Векторный ADX (направление и сила тренда в одной линии от -100 до +100. * V_Velocity — Скорость изменения вектора (импульс). * V_Acceleration — Ускорение (опережающий триггер).
Теперь трейдер или робот читает векторный анализ примерно так: Вход в Лонг (Идеальная точка). V_ADX выше нуля, V_Velocity > 0 и V_Acceleration только что пересекло ноль снизу вверх. Выход из Лонга (Опережающий). V_ADX все еще высоко в положительной зоне (например, +65), но V_Acceleration уже упало ниже нуля, а V_Velocity развернулось вниз. Цена еще растет на инерции, но векторное поле рынка сигнализирует -> топливо у покупателей закончилось.
Переход на векторный анализ DX убирает из кода робота, громоздкие конструкции сравнения линий и сводит весь анализ тренда к знакам трех чисел. У себя я ни чего не убираю, просто собираю все в таблицу и распаковываю уже в OnCalculate или роботе тот формат который требуется. По аналогии переписал и RSI.
И все это красиво, математически строго, вписывается в единую концепцию приведенную выше! Этот подробный разбор того, как с помощью универсального языка математики, возвращаем междисциплинарные смыслы, собирая разные конструкции. А добавьте еще смыслы разговорного языка, например русского (строится от корня элегантно создавая и меняя Смыслы), но это уже совсем другая тема.
На самом деле кому покажется сложно или не очень понятно изложение, на ютуб можно поискать видео, векторного анализа, мат. анализа, DSP и прочие темы с визуализацией. "Вот и сказочки конец, а кто слушал молодец". Удачи.
Пользователь
Сообщений: Регистрация: 15.06.2023
31.05.2026 10:47:28
Если с вычислительной математикой индикатора разобрались, то возникает следящая проблема - интеграции индикаторов в терминал QUIK. Проблема А - нулевого (текущего) бара ("Дерганья"); Проблема Б - утечки памяти при некорректном кэшировании.
Вот и у меня. Поскольку индикатор ADX_v4 использует рекурсивные фильтры (ZLEMA, SuperSmoother) и исторические лаг-компенсаторы, каждый тик на текущей (незакрытой) свече будет необратимо перезаписывать историю, если не изолировать расчеты.
Памятка. "Строгая техническая спецификация оптимизации под архитектуру QUIK".
1. Проблема А. Дерганье и Накопления Ошибок на Последнем Баре. Терминал QUIK вызывает функцию индикатора на каждом входящем тике (сделке) для текущего индекса свечи I == Size(). * Опасность для рекурсии: В строке zlema[I] = current_zlema на незакрытом баре записываем промежуточное тиковое значение в массив по индексу I. На следующем тике (внутри той же секунды/минуты) функция вызывается снова. Но в ячейке zlema[I-1] всё еще лежит значение прошлого закрытого бара, а вот в zlema[I] уже сидит искаженное значение от предыдущего тика. Происходит "эффект бабочки", рекуррентные коэффициенты накапливают ошибку внутри одной свечи. Когда свеча закроется, её историческое значение окажется полностью искаженным. * Техническое решение проблемы заключается, запретить на незакрытом баре изменять постоянные исторические массивы. Расчет текущего тика должен производиться во временных (фиктивных) переменных, а запись в историю — происходить строго в момент фиксации (закрытия) бара.
2. Проблема Б. Оптимизация Хранения и Очистка Буферов (Память). * Если робот работает на мелком таймфрейме (M1) или собирает историю за несколько месяцев, стандартные таблицы Lua (DX = {}) раздуваются до десятков тысяч элементов. Это приводит к деградации кэша процессора и тормозам QUIK при вызове table[I-1]. * Техническое решение (Кольцевой буфер). Нашему безлаговому ADX для расчета не нужна вся история от сотворения мира. Ему нужен хвост глубиной в P * 3 баров. Будем использовать метод ограничения глубины буфера. При превышении максимального индекса принудительно удаляем самый старый элемент из таблиц с помощью table.remove(t, 1) или прямой очистки индексов t[I - max_depth] = nil. Здесь очень важный момент не наделать в таблице "дыр".
Финальный боевой код с аппаратной защитой под QUIK, в сборку нужно интегрировать: а) защитный механизм проверка фиксации бара; б) кольцевая очистка кэша, предотвращающая утечки памяти.