Структура бэктестинга индикаторов подтверждения с несколькими источниками: количественная система тестирования торговли, объединяющая управление рисками и обнаружение сигналов

SMA EMA MACD RSI TP/SL R/R ROI VWAP ATR
Дата создания: 2025-07-08 17:21:11 Последнее изменение: 2025-07-08 17:21:11
Копировать: 0 Количество просмотров: 256
2
Подписаться
319
Подписчики

Структура бэктестинга индикаторов подтверждения с несколькими источниками: количественная система тестирования торговли, объединяющая управление рисками и обнаружение сигналов Структура бэктестинга индикаторов подтверждения с несколькими источниками: количественная система тестирования торговли, объединяющая управление рисками и обнаружение сигналов

Обзор

Multi-Source Confirmation Indicator Feedback Framework - это профессиональная система количественного тестирования сделок, предназначенная для оценки пользовательских индикаторов и торговых сигналов. Она включает в себя множество методов обнаружения сигналов, продвинутую систему фильтрации подтверждений и профессиональные функции управления рисками, позволяющие трейдерам полностью тестировать свои торговые стратегии.

Стратегический принцип

Ключевым принципом стратегии является предоставление полной тестовой среды, позволяющей трейдерам оценивать эффективность различных показателей. Код реализует следующие ключевые функции:

  1. Различные методы обнаружения сигналовФункции detectLongSignal () и detectShortSignal () реализуют пять различных методов обнаружения сигналов:

    • Изменение значения: срабатывает при изменении значения показателя, которое больше 0
    • Пересечение вверх: срабатывает, когда показатель пересекает порог вверх
    • Нижний крест: срабатывает, когда показатель пересекает порог вниз
    • Значение выше порога: срабатывает, когда показатель переходит от значения ниже порога к значению выше порога
    • Значение ниже отметки: запускается, когда значение индикатора переходит от значения выше отметки до значения ниже отметки
  2. Система подтверждения: с помощью функций longConfirmation ((() и shortConfirmation ((() реализуется система подтверждения из нескольких источников, требующая, чтобы торговый сигнал выполнял дополнительные условия в течение заданного периода отсчета. Эта функция значительно уменьшает количество ложных сигналов.

  3. Логика входа и выхода: стратегия использует функции strategy.entry и strategy.exit для управления входом и выходом из сделки. Условия входа определяются совместно с системой обнаружения и подтверждения сигналов, а выход может быть осуществлен различными способами:

    • Фиксированная остановка / остановка убытков
    • Настройка сигнала выхода
    • Функция сохранения
  4. Логика Поубена: Когда сделка достигает определенного количества преимуществ, стратегия автоматически переносит стоп-лосс на цену входа, защищая полученную прибыль. Это достигается путем обнаружения разницы между текущей ценой и ценой входа и изменения уровня стоп-лосса при достижении установленного количества пунктов, установленных BreakEvenTrigger.

  5. Визуализация и мониторинг: Стратегия использует функцию plotshape, чтобы пометить на графике все входные и выходные сигналы и создать таблицу состояния в режиме реального времени с помощью table.new, показывающую текущие настройки стратегии и состояние торгов.

Стратегические преимущества

  1. Высокая гибкость: Стратегия позволяет подключить любой индикатор в качестве источника сигнала, что делает его пригодным для различных стилей торговли и рыночных условий. Пользователь может тестировать различные комбинации индикаторов, просто меняя источник ввода.

  2. Многослойная система фильтрацииС помощью подтверждающего фильтра стратегия может требовать одновременного выполнения нескольких условий для совершения сделки, что значительно снижает количество ошибочных сигналов. Такой метод подтверждения из нескольких источников имитирует практику профессиональных трейдеров, которые ищут согласованность нескольких показателей перед принятием торгового решения.

  3. Всестороннее управление рискамиВ стратегии встроены функции профессионального управления рисками, включающие:

    • Предварительная остановка / остановка потери
    • Функция динамического сопровождения
    • Настройка сигнала выхода Эти функции гарантируют, что трейдеры могут имитировать меры контроля риска в реальной торговой среде в процессе тестирования.
  4. Реальная обратная связьС помощью сигнальных маркеров и таблиц состояния трейдер может получить интуитивное представление о состоянии и производительности стратегии, что облегчает настройку и оптимизацию.

  5. Совместимость: Стратегия совместима с Pine Script v6, может работать на любой торговой платформе, поддерживающей эту версию, и поддерживает функцию отслеживания, позволяющую трейдерам оценивать историческую производительность.

Стратегический риск

  1. Зависимость от обнаружения сигналовЭффективность стратегии в значительной степени зависит от выбранного метода обнаружения сигналов и установки порога. Неправильная конфигурация может привести к избыточному количеству ложных сигналов или упущенным важным торговым возможностям.

  2. Установление риска системной фильтрации: Хотя система подтверждения из нескольких источников может уменьшить количество ложных сигналов, она также может привести к упущению выгодных торговых возможностей. Слишком строгие требования к подтверждению могут заставить стратегию пропустить быстро развивающиеся тенденции рынка. Решение заключается в том, чтобы сбалансировать строгость системы подтверждения или разработать различные критерии подтверждения для различных состояний рынка.

  3. Ограничения фиксированной остановки/остановки убытков: использование фиксированных стоп/стоп может не подходить для всех рыночных условий, особенно в рынках с большим количеством волатильных изменений. рекомендуется привязывать стоп/стоп-пост к индикатору волатильности рынка (например, ATR), чтобы адаптироваться к различным рыночным условиям.

  4. Отличия от реального диска: Все результаты ретроспективного анализа могут отличаться от результатов ретроспективного анализа, поскольку ретроспективный анализ не позволяет полностью моделировать скольжение, затраты на транзакции и проблемы с ликвидностью. Перед тем, как проводить ретроспективный анализ, трейдер должен проверить эффективность стратегии в симуляторной среде.

  5. Сложность кодаСложность стратегии может увеличить сложность дебютирования и обслуживания. Подробные комментарии и модульный дизайн могут помочь управлять этой сложностью и обеспечить поддерживаемость кода.

Направление оптимизации стратегии

  1. Динамическое управление рискамиВ настоящее время используются фиксированные точки для остановки/потери, которые можно оптимизировать для динамической системы управления рисками, основанной на волатильности рынка. Например, привязывание точки остановки/потери к ATR (Average True Range), расширяя пределы остановки при увеличении волатильности и уменьшая пределы остановки при уменьшении волатильности. Это позволяет лучше адаптироваться к различным рыночным условиям.

  2. Усиление системы подтвержденияТекущая система подтверждения может быть расширена, чтобы включать в себя дополнительные фильтрационные условия, такие как фильтрация по времени (избегайте торговли в определенное время рынка), фильтрация по волатильности (избегайте торговли в условиях низкой волатильности) или фильтрация по тенденции (торгуйте только в направлении, соответствующем основной тенденции). Это еще больше уменьшит количество ложных сигналов и повысит устойчивость стратегии.

  3. Управление некоторыми позициями: Стратегия может добавить функции управления отдельными позициями, позволяя вводить и выводить поэтапно, а не открывать или выводить все позиции за один раз. Этот метод может снизить риск входа/выхода в отдельных точках и может повысить производительность общей стратегии.

  4. Оптимизация машинного обучения: Можно внедрить алгоритмы машинного обучения для оптимизации параметров сигналов и настроек риска, автоматически корректируя параметры стратегии в соответствии с историческими данными для адаптации к различным рыночным условиям.

  5. Добавление показателей производительностиВ то время как стратегия уже обеспечивает базовый мониторинг состояния, можно добавить больше показателей эффективности, таких как коэффициент Шарпа, максимальный отказ, соотношение прибыли и убытка, чтобы обеспечить более полную оценку стратегии. Эти показатели могут отображаться в таблице состояния, чтобы помочь трейдерам лучше оценить эффективность стратегии.

Подвести итог

Multi-Source Confirmation Indicator Feedback Framework - это полнофункциональная система количественного тестирования сделок, которая предоставляет трейдерам мощный инструмент для оценки и оптимизации их торговых стратегий путем интеграции различных методов обнаружения сигналов, многоуровневой системы подтверждения и профессиональных функций управления рисками. Основными преимуществами системы являются ее гибкость и настраиваемость, позволяющая трейдерам тестировать практически любой тип комбинации индикаторов и методов генерации сигналов.

Несмотря на наличие некоторых присущих рисков и ограничений, таких как зависимость от обнаружения сигналов и фиксированных параметров риска, эти проблемы могут быть решены с помощью предлагаемых направлений оптимизации, таких как внедрение динамического управления рисками, усиление системы подтверждения и введение частичного управления позициями. Благодаря этим оптимизациям, эта структура может еще больше повысить свою эффективность и адаптивность, став ценным инструментом в арсенале трейдеров.

В целом, Multi-Source Confirmation Indicator Feedback Framework представляет собой профессиональный, систематизированный подход к тестированию и оценке торговых стратегий, который выходит за рамки простого генерирования сигналов и включает в себя управление рисками и многоуровневую подтверждение, которые являются ключевыми компонентами успешной торговой системы. Для трейдеров, стремящихся создать и протестировать собственные торговые стратегии, эта структура предоставляет полное решение.

Исходный код стратегии
/*backtest
start: 2024-07-08 00:00:00
end: 2025-07-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("FULLY FUNCTIONAL INDICATOR TESTER", overlay=true, margin_long=100, margin_short=100)

// Entry/Exit Signal Inputs
longEntry = input.source(close, 'Long Entry Trigger', 'Source for long signal (connect your indicator here)')
shortEntry = input.source(close, 'Short Entry Trigger', 'Source for short signal (connect your indicator here)')
activateLongExit = input.bool(false, 'Activate Long Exit Signals')
longExit = input.source(high, 'Long Exit Trigger', 'Source for long exit signal')
activateShortExit = input.bool(false, 'Activate Short Exit Signals')
shortExit = input.source(low, 'Short Exit Trigger', 'Source for short exit signal')

// Signal Detection Method
signalMethod = input.string('Value Change', 'Signal Detection Method', options=['Value Change', 'Crossover Above', 'Crossover Below', 'Value Above Threshold', 'Value Below Threshold'])
signalThreshold = input.float(0, 'Signal Threshold', tooltip='Threshold value for signal detection methods')

// Take Profit and Stop Loss
fixedTp = input.int(0, 'Static TP (in ticks)', 0, tooltip='0 = disabled')
initialSL = input.int(0, 'Initial SL (in ticks)', 0, tooltip='0 = disabled')

// Break Even Settings
breakEvenTrigger = input.int(0, 'Break Even Trigger (in ticks)', 0, tooltip='Move SL to break even after this many ticks profit. 0 = disabled')

// Confluence Settings
useConfluence = input.bool(false, 'Use Confluence Filter', 'Activate confluence filter for entries')
longConfluence = input.source(high, 'Long Signal Confluence', 'Source for long confluence filter')
longConfluenceTrigger = input.source(low, 'Long Confluence Trigger', 'Value that must be below confluence source for long entry')
shortConfluence = input.source(high, 'Short Signal Confluence', 'Source for short confluence filter')
shortConfluenceTrigger = input.source(low, 'Short Confluence Trigger', 'Value that must be above confluence source for short entry')
confluenceLookback = input.int(0, 'Confluence Lookback Period', 0, 10, 1, 'Number of candles to look back for confluence')

// Variables to track entry prices for break-even
var float longEntryPrice = na
var float shortEntryPrice = na

// Signal Detection Functions
detectLongSignal() =>
    switch signalMethod
        'Value Change' => longEntry != longEntry[1] and longEntry > 0
        'Crossover Above' => ta.crossover(longEntry, signalThreshold)
        'Crossover Below' => ta.crossunder(longEntry, signalThreshold)
        'Value Above Threshold' => longEntry > signalThreshold and longEntry[1] <= signalThreshold
        'Value Below Threshold' => longEntry < signalThreshold and longEntry[1] >= signalThreshold
        => false

detectShortSignal() =>
    switch signalMethod
        'Value Change' => shortEntry != shortEntry[1] and shortEntry > 0
        'Crossover Above' => ta.crossover(shortEntry, signalThreshold)
        'Crossover Below' => ta.crossunder(shortEntry, signalThreshold)
        'Value Above Threshold' => shortEntry > signalThreshold and shortEntry[1] <= signalThreshold
        'Value Below Threshold' => shortEntry < signalThreshold and shortEntry[1] >= signalThreshold
        => false

detectLongExit() =>
    switch signalMethod
        'Value Change' => longExit != longExit[1] and longExit > 0
        'Crossover Above' => ta.crossover(longExit, signalThreshold)
        'Crossover Below' => ta.crossunder(longExit, signalThreshold)
        'Value Above Threshold' => longExit > signalThreshold and longExit[1] <= signalThreshold
        'Value Below Threshold' => longExit < signalThreshold and longExit[1] >= signalThreshold
        => false

detectShortExit() =>
    switch signalMethod
        'Value Change' => shortExit != shortExit[1] and shortExit > 0
        'Crossover Above' => ta.crossover(shortExit, signalThreshold)
        'Crossover Below' => ta.crossunder(shortExit, signalThreshold)
        'Value Above Threshold' => shortExit > signalThreshold and shortExit[1] <= signalThreshold
        'Value Below Threshold' => shortExit < signalThreshold and shortExit[1] >= signalThreshold
        => false

// Confluence confirmation functions
longConfirmation() => 
    confirmation = false
    if confluenceLookback == 0
        confirmation := longConfluenceTrigger < longConfluence
    else
        for x = 0 to confluenceLookback
            if longConfluenceTrigger[x] < longConfluence[x]
                confirmation := true
                break
    confirmation

shortConfirmation() => 
    confirmation = false
    if confluenceLookback == 0
        confirmation := shortConfluenceTrigger > shortConfluence
    else
        for x = 0 to confluenceLookback
            if shortConfluenceTrigger[x] > shortConfluence[x]
                confirmation := true
                break
    confirmation

// Entry conditions
longConfirmed = useConfluence ? longConfirmation() : true
shortConfirmed = useConfluence ? shortConfirmation() : true

longCondition = detectLongSignal() and longConfirmed
shortCondition = detectShortSignal() and shortConfirmed

// Entry logic
if (longCondition and strategy.opentrades == 0)
    strategy.entry('Long', strategy.long)
    longEntryPrice := close
    // Set initial exit orders
    if fixedTp > 0 or initialSL > 0
        strategy.exit('Long Exit', 'Long', 
                     profit = fixedTp > 0 ? fixedTp : na, 
                     loss = initialSL > 0 ? initialSL : na, 
                     comment_profit = 'TP Hit', 
                     comment_loss = 'SL Hit')

if (shortCondition and strategy.opentrades == 0)
    strategy.entry('Short', strategy.short)
    shortEntryPrice := close
    // Set initial exit orders
    if fixedTp > 0 or initialSL > 0
        strategy.exit('Short Exit', 'Short', 
                     profit = fixedTp > 0 ? fixedTp : na, 
                     loss = initialSL > 0 ? initialSL : na, 
                     comment_profit = 'TP Hit', 
                     comment_loss = 'SL Hit')

// Custom exit signal logic
if (activateLongExit and detectLongExit() and strategy.position_size > 0)
    strategy.close('Long', 'Custom Long Exit')

if (activateShortExit and detectShortExit() and strategy.position_size < 0)
    strategy.close('Short', 'Custom Short Exit')

// Break-even logic
if (breakEvenTrigger > 0)
    // Long position break-even
    if (strategy.position_size > 0 and not na(longEntryPrice))
        ticksProfit = math.round((high - longEntryPrice) / syminfo.mintick)
        if (ticksProfit >= breakEvenTrigger)
            strategy.exit('Long Exit', 'Long', stop = longEntryPrice, comment_loss = 'Break Even')
    
    // Short position break-even  
    if (strategy.position_size < 0 and not na(shortEntryPrice))
        ticksProfit = math.round((shortEntryPrice - low) / syminfo.mintick)
        if (ticksProfit >= breakEvenTrigger)
            strategy.exit('Short Exit', 'Short', stop = shortEntryPrice, comment_loss = 'Break Even')

// Reset entry prices when no position
if (strategy.position_size == 0)
    longEntryPrice := na
    shortEntryPrice := na

// Plot signals for debugging
plotshape(longCondition, title='Long Signal', location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortCondition, title='Short Signal', location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
plotshape(activateLongExit and detectLongExit() and strategy.position_size > 0, title='Long Exit', location=location.abovebar, color=color.orange, style=shape.xcross, size=size.small)
plotshape(activateShortExit and detectShortExit() and strategy.position_size < 0, title='Short Exit', location=location.belowbar, color=color.orange, style=shape.xcross, size=size.small)

// Display current settings in a table for easy reference
if barstate.islast
    var table infoTable = table.new(position.top_right, 2, 8, bgcolor=color.white, border_width=1)
    table.cell(infoTable, 0, 0, "Signal Method:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 0, signalMethod, text_color=color.black)
    table.cell(infoTable, 0, 1, "Threshold:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 1, str.tostring(signalThreshold), text_color=color.black)
    table.cell(infoTable, 0, 2, "TP (ticks):", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 2, str.tostring(fixedTp), text_color=color.black)
    table.cell(infoTable, 0, 3, "SL (ticks):", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 3, str.tostring(initialSL), text_color=color.black)
    table.cell(infoTable, 0, 4, "Break Even:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 4, str.tostring(breakEvenTrigger), text_color=color.black)
    table.cell(infoTable, 0, 5, "Confluence:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 5, useConfluence ? "ON" : "OFF", text_color=color.black)
    table.cell(infoTable, 0, 6, "Position:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 6, strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT", text_color=color.black)
    table.cell(infoTable, 0, 7, "Status:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 7, "FULLY FUNCTIONAL", text_color=color.green)