
Стратегия является высокотехнологичной системой отслеживания трендов, которая сочетает в себе фильтры двузначных скользящих средних (EMA) с интеллектуальными интервалами и механизмами обнаружения шума, чтобы обеспечить четкие и управляемые торговые сигналы. Основная идея ее дизайна заключается в том, чтобы избежать колебаний рынка, повысить точность торговли и адаптироваться к различным рыночным условиям. Стратегия определяет направление тренда через перекрестные линии высокой и низкой линии EMA, а также использует фильтры интервала и фильтры волатильности, чтобы избежать торговли в поперечной или низкой волатильности, что значительно повышает уровень успешности торговли.
Основные механизмы стратегии основаны на следующих ключевых компонентах:
Двойная система фильтрации EMAСтратегия использует два скользящих средних индекса (высокая и низкая EMA) для определения рыночных тенденций. Когда цена одновременно находится над двумя линиями EMA, генерируется многосигналный сигнал. Когда цена одновременно находится ниже двух линий EMA, генерируется короткий сигнал.
Механизм диапазона: Стратегия использует алгоритм распознавания диапазона, основанный на процентах от ценового диапазона, который автоматически приостанавливает торговлю, когда рынок входит в фазу горизонтального урегулирования (то есть, диапазон ценовых колебаний меньше, чем установленный порог). Система непрерывно контролирует количество последовательных диапазонов, и только тогда активирует диапазоновый фильтр, когда подтверждается, что рынок находится в реальном диапазоне, чтобы избежать упущенных первоначальных возможностей для прорыва.
Фильтр частоты колебаний: С помощью расчета ATR (средняя величина реальной волатильности) в процентах от текущей цены, стратегия может идентифицировать низкие волатильности и избегать торговли в этих условиях. Этот механизм гарантирует, что торговля осуществляется только в условиях достаточной динамики на рынке.
Принцип “одна сделка за тренд”: Стратегия реализует механизм состояния тренда, который гарантирует, что сделка будет выполнена только один раз в одном направлении тренда, пока не изменится направление тренда. Это позволяет избежать чрезмерной торговли и повторения сигналов в одном и том же тренде.
Неразрывная визуализацияСтратегия позволяет обнаружить и показать зоны интеграции, которые могут привести к прорыву, помогая трейдерам идентифицировать потенциальные высоковероятные торговые возможности.
Динамическое управление рискамиСтратегия предлагает остановку на основе ATR или фиксированную процентную остановку, а также опционную параллельную SAR-следующую остановку, что позволяет управлять риском более гибко и адаптироваться к изменениям рынка.
Высокая адаптивностьЭта способность автоматически адаптироваться к различным рыночным условиям, улавливать тенденции в трендовых рынках и одновременно сохранять бдительность в волатильных, позволяет ей оставаться устойчивой в различных рыночных условиях.
Множественная фильтрацияС помощью трёхкратной фильтрации, включающей тренд, интервал и волатильность, стратегия значительно повышает качество торговых сигналов и уменьшает количество ложных сигналов и ложных прорывов.
Интеллектуальная коррекция колебанийСтратегия: изменение размеров позиций в зависимости от динамики волатильности рынка, снижение рисковых проемов в условиях высокой волатильности и максимизация потенциала прибыли в условиях умеренной волатильности.
Всесторонний инструмент визуализацииСтратегия предлагает множество визуальных вспомогательных инструментов, включая маркировку промежутков, нетронутые рамки промежутков, линии EMA и точки SAR, которые позволяют трейдерам получить интуитивное представление о состоянии рынка и логике стратегии.
Гибкий контроль риска: поддержка различных стратегий по предотвращению убытков (фиксированные проценты, ATR-множества, отслеживание SAR), что позволяет трейдерам выбирать наиболее подходящий метод управления риском в соответствии с личными предпочтениями в отношении риска и особенностями рынка.
Принцип “одной сделки”: С помощью механизма состояния тренда гарантируется, что каждая тенденция будет выполнена только один раз, чтобы избежать чрезмерной торговли и чрезмерного воздействия средств на риск в одном направлении.
Задержка в обратном направлении: Из-за использования EMA в качестве основного индикатора тренда, стратегия может медленно реагировать на быстрые перемены в тренде, что приводит к некоторому отступлению в начале перемены. Решение заключается в корректировке параметров длины EMA, в более волатильных рынках можно использовать более короткую длину EMA.
Неэффективность бортового рынка: Несмотря на то, что стратегия разработана с использованием интервальной фильтрации, она может привести к длительному отсутствию торговых возможностей на долгосрочных горизонтальных рынках, что может повлиять на эффективность использования средств. Решение заключается в сочетании с многократным анализом временных рамок или в использовании стратегии по очереди между различными рынками.
Параметр оптимизации зависимости: эффективность стратегии в значительной степени зависит от параметров, таких как длина EMA, диапазонный порог и ATR-множитель. Разные рынки и временные рамки могут требовать различные комбинации параметров.
Риск резких колебанийВ случае резкого скачка цены, вызванного внезапными рыночными событиями (например, крупными пресс-релизами), стоп-лосс может не быть исполнен по ожидаемой цене, что приводит к фактическим потерям, превышающим ожидания. Рекомендуется использовать дополнительные правила управления капиталом, ограничивающие риск выхода на одну сделку.
Чрезмерная зависимость от технических показателей: стратегия полностью основана на технических показателях, игнорируя фундаментальные факторы. При значительных фундаментальных изменениях чисто технический анализ может быть неэффективным. Рекомендуется сократить позиции или приостановить торговлю до публикации важных экономических данных в сочетании с фундаментальным анализом или установкой календаря рисковых событий.
Система подтверждения многократных временных рамок: Внедрение анализа в нескольких временных рамках может значительно повысить точность стратегии. Рекомендуется добавление условий подтверждения тенденции в более высоких временных рамках, выполнение сделки только в том случае, если направление тенденции в более высоких временных рамках соответствует текущему направлению торговли, что может уменьшить обратную торговлю и повысить шансы на победу.
Динамические параметры самостоятельно адаптируются: Стратегия может включать в себя механизм адаптации параметров, автоматически корректируя такие параметры, как длина EMA, диапазонные пороги и ATR-множители в зависимости от рыночной волатильности и интенсивности тренда. Это позволит стратегии лучше адаптироваться к различным рыночным этапам.
Интеграция моделей машинного обученияВнедрение моделей машинного обучения для оптимизации времени входа в рынок и прогнозирования направления прорыва в диапазоне может значительно повысить эффективность стратегии. Например, использование классификационных алгоритмов для прогнозирования прорыва в диапазоне или использование регрессионной модели для прогнозирования целей после прорыва.
Улучшение фильтра частоты колебанийФильтр текущей волатильности основан на простом процентном значении ATR, который может быть переведен в показатель относительной волатильности, сравнивая текущую волатильность с историческим распределением волатильности и более точно идентифицируя действительно низкую волатильность.
Увеличение объема подтверждений: Увеличение условий подтверждения объема сделки при генерировании торгового сигнала, выполнение сделки только в случае, если ценовой прорыв сопровождается увеличением объема сделки, снижает риск ложного прорыва. Это улучшение особенно применимо к фондовым и товарным рынкам.
Оптимизация алгоритмов управления капиталомИнтеграция алгоритмов Келли или других передовых алгоритмов управления капиталом в стратегию, динамически корректирующую размер позиции в зависимости от исторической выигрышности и прибыльности, позволяет максимизировать долгосрочную прибыль и минимизировать риск.
Интеллектуальная стратегия отслеживания трендов и фильтрации волатильности является полной и стабильной торговой системой, которая эффективно повышает качество торговых сигналов и уровень успешности торгов путем сочетания технологий отслеживания трендов, диапазона и фильтрации волатильности. Ее уникальный принцип торговли по одному тренду и динамический механизм управления рисками позволяют ей сохранять хорошую прибыльность, контролируя риски.
Хотя в стратегии также присутствуют риски, такие как задержка реверсирования тенденции и зависимость от параметров, эти риски могут быть эффективно управляемыми с помощью предлагаемых направлений оптимизации, таких как подтверждение многократных временных рамок, адаптация динамических параметров и интеграция моделей машинного обучения. С помощью надлежащей оптимизации параметров и управления рисками стратегия может поддерживать стабильную производительность в различных рыночных условиях и является торговой системой, которая заслуживает долгосрочного использования и постоянного улучшения.
/*backtest
start: 2024-08-01 00:00:00
end: 2025-07-30 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Dubic EMA Strategy", overlay=true,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
initial_capital=10000,
currency=currency.USD,
commission_value=0.1,
pyramiding=0,
calc_on_every_tick=true)
// Inputs
ema_length = input.int(40, "EMA Length")
tp_percent = input.float(2.0, "Take Profit %", step=0.1, minval=0.1) / 100
sl_offset = input.float(0.5, "Stop Loss Offset %", step=0.1, minval=0.1) / 100
// Toggles for SL/TP
use_take_profit = input.bool(true, "Use Take Profit")
use_stop_loss = input.bool(true, "Use Stop Loss")
// Range Detection
range_length = input.int(20, "Range Detection Length", minval=5)
range_threshold = input.float(2.0, "Range Threshold %", step=0.1) / 100
min_range_bars = input.int(3, "Min Range Bars", minval=1)
// Parabolic SAR
use_parabolic_sar = input.bool(true, "Use Parabolic SAR Trailing Stop")
sar_start = input.float(0.02, "SAR Start", step=0.01)
sar_increment = input.float(0.02, "SAR Increment", step=0.01)
sar_max = input.float(0.2, "SAR Maximum", step=0.01)
// ATR Stop Configuration
use_atr_stop = input.bool(true, "Use ATR Stop Instead of Fixed %")
atr_length = input.int(14, "ATR Length")
atr_mult = input.float(1.5, "ATR Multiplier", minval=0.5)
// Volatility Filter
min_atr = input.float(0.5, "Min ATR % for Trading", step=0.1) / 100
use_volatility_filter = input.bool(true, "Enable Volatility Filter")
// Unbroken Range Visualization
show_unbroken_range = input.bool(true, "Show Unbroken Range Visualization", group="Unbroken Range")
unbroken_length = input.int(20, 'Minimum Range Length', minval=2, group="Unbroken Range")
unbroken_mult = input.float(1., 'Range Width', minval=0, step=0.1, group="Unbroken Range")
unbroken_atrLen = input.int(500, 'ATR Length', minval=1, group="Unbroken Range")
upCss = input.color(#089981, 'Broken Upward', group="Unbroken Range")
dnCss = input.color(#f23645, 'Broken Downward', group="Unbroken Range")
unbrokenCss = input.color(#2157f3, 'Unbroken', group="Unbroken Range")
// Calculate Indicators
ema_high = ta.ema(high, ema_length)
ema_low = ta.ema(low, ema_length)
ema_200 = ta.ema(close, 200)
sar = ta.sar(sar_start, sar_increment, sar_max)
atr = ta.atr(atr_length)
// Volatility Filter
atr_percentage = (atr / close) * 100
sufficient_volatility = not use_volatility_filter or (atr_percentage >= min_atr * 100)
// Range Detection Logic
range_high = ta.highest(high, range_length)
range_low = ta.lowest(low, range_length)
range_size = range_high - range_low
range_percentage = (range_size / close) * 100
range_condition = range_percentage <= (range_threshold * 100)
// Consecutive range bars counter
var int range_bars_count = 0
range_bars_count := range_condition ? range_bars_count + 1 : 0
in_range = range_bars_count >= min_range_bars
// Visualize Range
bgcolor(in_range ? color.new(color.purple, 85) : na, title="Range Zone")
plot(in_range ? range_high : na, "Range High", color=color.purple, linewidth=2, style=plot.style_linebr)
plot(in_range ? range_low : na, "Range Low", color=color.purple, linewidth=2, style=plot.style_linebr)
// Trading Conditions
buy_condition = (close > ema_high) and (close > ema_low)
sell_condition = (close < ema_high) and (close < ema_low)
// Apply Filters
buy_signal = buy_condition and not in_range and sufficient_volatility
sell_signal = sell_condition and not in_range and sufficient_volatility
// Trend State Machine
var int currentTrend = 0 // 0=neutral, 1=long, -1=short
var bool showBuy = false
var bool showSell = false
trendChanged = false
if buy_signal and currentTrend != 1
currentTrend := 1
trendChanged := true
showBuy := true
showSell := false
else if sell_signal and currentTrend != -1
currentTrend := -1
trendChanged := true
showBuy := false
showSell := true
// Reset signals
showBuy := nz(showBuy[1]) and not trendChanged ? false : showBuy
showSell := nz(showSell[1]) and not trendChanged ? false : showSell
// Plot Indicators
plot(ema_high, "EMA High", color=color.blue, linewidth=2)
plot(ema_low, "EMA Low", color=color.orange, linewidth=2)
plot(ema_200, "200 EMA", color=color.white, linewidth=3)
// Plot SAR with color coding
color sarColor = strategy.position_size > 0 ? color.red :
strategy.position_size < 0 ? color.green :
color.gray
plot(use_parabolic_sar ? sar : na, "SAR", style=plot.style_circles, color=sarColor, linewidth=2)
// Plot signals
plotshape(showBuy, title="Buy Signal", text="BUY", style=shape.labelup,
location=location.belowbar, color=color.green, textcolor=color.white, size=size.tiny)
plotshape(showSell, title="Sell Signal", text="SELL", style=shape.labeldown,
location=location.abovebar, color=color.red, textcolor=color.white, size=size.tiny)
// Strategy Logic
var float long_sl = na
var float long_tp = na
var float short_sl = na
var float short_tp = na
var float long_trail_stop = na
var float short_trail_stop = na
// Position Sizing with Volatility Scaling
position_size = use_volatility_filter ? math.min(100, 100 * (min_atr * 100) / atr_percentage) : 100
// Execute trades
if (showBuy)
// Calculate stop loss and take profit
long_sl := use_atr_stop ? close - atr * atr_mult : ema_low * (1 - sl_offset)
long_tp := close * (1 + tp_percent)
long_trail_stop := use_parabolic_sar ? sar : na
strategy.close("Short", comment="Exit Short")
strategy.entry("Long", strategy.long, qty=position_size)
// Set exit orders with toggle support
if use_stop_loss or use_take_profit
strategy.exit("Long SL/TP", "Long",
stop=use_stop_loss ? long_sl : na,
limit=use_take_profit ? long_tp : na)
if use_parabolic_sar
strategy.exit("Long SAR", "Long", stop=long_trail_stop)
alert("BUY: " + syminfo.ticker, alert.freq_once_per_bar)
if (showSell)
// Calculate stop loss and take profit
short_sl := use_atr_stop ? close + atr * atr_mult : ema_high * (1 + sl_offset)
short_tp := close * (1 - tp_percent)
short_trail_stop := use_parabolic_sar ? sar : na
strategy.close("Long", comment="Exit Long")
strategy.entry("Short", strategy.short, qty=position_size)
// Set exit orders with toggle support
if use_stop_loss or use_take_profit
strategy.exit("Short SL/TP", "Short",
stop=use_stop_loss ? short_sl : na,
limit=use_take_profit ? short_tp : na)
if use_parabolic_sar
strategy.exit("Short SAR", "Short", stop=short_trail_stop)
alert("SELL: " + syminfo.ticker, alert.freq_once_per_bar)
// Update SAR trailing stops
if barstate.isrealtime and use_parabolic_sar
if strategy.position_size > 0
strategy.exit("Long SAR", "Long", stop=long_trail_stop)
else if strategy.position_size < 0
strategy.exit("Short SAR", "Short", stop=short_trail_stop)
// Plot SL/TP levels with toggle support
plot(strategy.position_size > 0 and use_stop_loss ? long_sl : na, "Long Stop", color=color.red, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 and use_take_profit ? long_tp : na, "Long Take Profit", color=color.green, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 and use_stop_loss ? short_sl : na, "Short Stop", color=color.red, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 and use_take_profit ? short_tp : na, "Short Take Profit", color=color.green, style=plot.style_linebr, linewidth=2)
// Plot SAR trailing stops
plot(strategy.position_size > 0 and use_parabolic_sar ? long_trail_stop : na,
"Long Trail Stop", color=color.orange, style=plot.style_circles, linewidth=2)
plot(strategy.position_size < 0 and use_parabolic_sar ? short_trail_stop : na,
"Short Trail Stop", color=color.orange, style=plot.style_circles, linewidth=2)
// Alerts
alertcondition(showBuy, title="Buy Alert", message="BUY: {{ticker}}")
alertcondition(showSell, title="Sell Alert", message="SELL: {{ticker}}")