
Multi-Source Confirmation Indicator Feedback Framework - это профессиональная система количественного тестирования сделок, предназначенная для оценки пользовательских индикаторов и торговых сигналов. Она включает в себя множество методов обнаружения сигналов, продвинутую систему фильтрации подтверждений и профессиональные функции управления рисками, позволяющие трейдерам полностью тестировать свои торговые стратегии.
Ключевым принципом стратегии является предоставление полной тестовой среды, позволяющей трейдерам оценивать эффективность различных показателей. Код реализует следующие ключевые функции:
Различные методы обнаружения сигналовФункции detectLongSignal () и detectShortSignal () реализуют пять различных методов обнаружения сигналов:
Система подтверждения: с помощью функций longConfirmation ((() и shortConfirmation ((() реализуется система подтверждения из нескольких источников, требующая, чтобы торговый сигнал выполнял дополнительные условия в течение заданного периода отсчета. Эта функция значительно уменьшает количество ложных сигналов.
Логика входа и выхода: стратегия использует функции strategy.entry и strategy.exit для управления входом и выходом из сделки. Условия входа определяются совместно с системой обнаружения и подтверждения сигналов, а выход может быть осуществлен различными способами:
Логика Поубена: Когда сделка достигает определенного количества преимуществ, стратегия автоматически переносит стоп-лосс на цену входа, защищая полученную прибыль. Это достигается путем обнаружения разницы между текущей ценой и ценой входа и изменения уровня стоп-лосса при достижении установленного количества пунктов, установленных BreakEvenTrigger.
Визуализация и мониторинг: Стратегия использует функцию plotshape, чтобы пометить на графике все входные и выходные сигналы и создать таблицу состояния в режиме реального времени с помощью table.new, показывающую текущие настройки стратегии и состояние торгов.
Высокая гибкость: Стратегия позволяет подключить любой индикатор в качестве источника сигнала, что делает его пригодным для различных стилей торговли и рыночных условий. Пользователь может тестировать различные комбинации индикаторов, просто меняя источник ввода.
Многослойная система фильтрацииС помощью подтверждающего фильтра стратегия может требовать одновременного выполнения нескольких условий для совершения сделки, что значительно снижает количество ошибочных сигналов. Такой метод подтверждения из нескольких источников имитирует практику профессиональных трейдеров, которые ищут согласованность нескольких показателей перед принятием торгового решения.
Всестороннее управление рискамиВ стратегии встроены функции профессионального управления рисками, включающие:
Реальная обратная связьС помощью сигнальных маркеров и таблиц состояния трейдер может получить интуитивное представление о состоянии и производительности стратегии, что облегчает настройку и оптимизацию.
Совместимость: Стратегия совместима с Pine Script v6, может работать на любой торговой платформе, поддерживающей эту версию, и поддерживает функцию отслеживания, позволяющую трейдерам оценивать историческую производительность.
Зависимость от обнаружения сигналовЭффективность стратегии в значительной степени зависит от выбранного метода обнаружения сигналов и установки порога. Неправильная конфигурация может привести к избыточному количеству ложных сигналов или упущенным важным торговым возможностям.
Установление риска системной фильтрации: Хотя система подтверждения из нескольких источников может уменьшить количество ложных сигналов, она также может привести к упущению выгодных торговых возможностей. Слишком строгие требования к подтверждению могут заставить стратегию пропустить быстро развивающиеся тенденции рынка. Решение заключается в том, чтобы сбалансировать строгость системы подтверждения или разработать различные критерии подтверждения для различных состояний рынка.
Ограничения фиксированной остановки/остановки убытков: использование фиксированных стоп/стоп может не подходить для всех рыночных условий, особенно в рынках с большим количеством волатильных изменений. рекомендуется привязывать стоп/стоп-пост к индикатору волатильности рынка (например, ATR), чтобы адаптироваться к различным рыночным условиям.
Отличия от реального диска: Все результаты ретроспективного анализа могут отличаться от результатов ретроспективного анализа, поскольку ретроспективный анализ не позволяет полностью моделировать скольжение, затраты на транзакции и проблемы с ликвидностью. Перед тем, как проводить ретроспективный анализ, трейдер должен проверить эффективность стратегии в симуляторной среде.
Сложность кодаСложность стратегии может увеличить сложность дебютирования и обслуживания. Подробные комментарии и модульный дизайн могут помочь управлять этой сложностью и обеспечить поддерживаемость кода.
Динамическое управление рискамиВ настоящее время используются фиксированные точки для остановки/потери, которые можно оптимизировать для динамической системы управления рисками, основанной на волатильности рынка. Например, привязывание точки остановки/потери к ATR (Average True Range), расширяя пределы остановки при увеличении волатильности и уменьшая пределы остановки при уменьшении волатильности. Это позволяет лучше адаптироваться к различным рыночным условиям.
Усиление системы подтвержденияТекущая система подтверждения может быть расширена, чтобы включать в себя дополнительные фильтрационные условия, такие как фильтрация по времени (избегайте торговли в определенное время рынка), фильтрация по волатильности (избегайте торговли в условиях низкой волатильности) или фильтрация по тенденции (торгуйте только в направлении, соответствующем основной тенденции). Это еще больше уменьшит количество ложных сигналов и повысит устойчивость стратегии.
Управление некоторыми позициями: Стратегия может добавить функции управления отдельными позициями, позволяя вводить и выводить поэтапно, а не открывать или выводить все позиции за один раз. Этот метод может снизить риск входа/выхода в отдельных точках и может повысить производительность общей стратегии.
Оптимизация машинного обучения: Можно внедрить алгоритмы машинного обучения для оптимизации параметров сигналов и настроек риска, автоматически корректируя параметры стратегии в соответствии с историческими данными для адаптации к различным рыночным условиям.
Добавление показателей производительностиВ то время как стратегия уже обеспечивает базовый мониторинг состояния, можно добавить больше показателей эффективности, таких как коэффициент Шарпа, максимальный отказ, соотношение прибыли и убытка, чтобы обеспечить более полную оценку стратегии. Эти показатели могут отображаться в таблице состояния, чтобы помочь трейдерам лучше оценить эффективность стратегии.
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)