
Стратегия представляет собой комплексную систему торговли, основанную на одновременном трендовом отслеживании и динамическом синхронизации, основанную на определении среднелинейных тенденций и подтверждении относительно сильных динамических показателей (RSI) для выявления высоковероятных торговых возможностей. В основе стратегии лежит торговая философия “продвижение”, ожидание отклонения и поиск оптимальной точки входа в рынок только после подтверждения направления основных тенденций рынка.
Принцип действия стратегии основан на четырех ключевых модулях: идентификация тенденций, определение условий входа, управление рисками и оптимизация прибыли.
Выявление тенденций:
Определение условий приема:
Управление рисками:
Оптимизация прибыли:
В реализации стратегии используются точные математические расчеты для определения оптимального размера позиции, что гарантирует, что риск каждой сделки контролируется на заданном уровне, а также позволяет адаптироваться к различным рыночным условиям с помощью параметров.
Эта стратегия имеет следующие значительные преимущества:
Высококачественные торговые сигналы: через подтверждение синхронизации тренда и динамики, открывать позиции только в направлении высокой вероятности, значительно повышая выигрышную вероятность │ в кодеlong_trend_okиlong_rsi_recoveryСочетание условий, обеспечивающих качество торговых сигналов.
Приспособность к управлению рисками: Стоп-дизайн, основанный на ATR, позволяет стратегии автоматически корректировать параметры риска в зависимости от волатильности рынка. Использование более свободных стопов в условиях бурных рыночных колебаний, а в спокойных рынках - более тесных стопов, обеспечивает оптимальный контроль риска.
Оптимизация управления капиталом: Механизм поэтапной прибыли ((50% позиций прибыльны при 2.1R, остальные используют стоп-пост) обеспечивает баланс, обеспечивающий прибыль и максимизирующий улов тренда.long_tp1_hitиlong_trail_stopПроцесс точно контролируется с помощью переменных.
Правила объективно ясныСтратегия полностью количественна, устранение эмоциональных помех в торговле, дисциплинированное исполнение. Все торговые решения основаны на четких математических вычислениях и логических условиях, избегая субъективного суждения.
Визуализация в процессе принятия решенийСтратегия предоставляет исправленную систему визуальной обратной связи, включая цвет фонового тренда, маркировку входных сигналов и визуализацию стоп-прибыльных целей, что позволяет трейдеру понимать и контролировать работу стратегии.
Настройка параметровОсновные параметры, такие как циклы EMA, RSI, ATR, могут быть изменены, чтобы стратегия могла адаптироваться к различным рыночным условиям и личным рисковым предпочтениям.
Несмотря на многочисленные преимущества, существуют следующие потенциальные риски:
Распознавание отсталости: использование EMA в качестве инструмента для определения тренда имеет свойственную отсталость, возможно, в начале тренда пропущены некоторые возможности или в конце тренда остаются в прежнем направлении. Решение заключается в том, чтобы рассмотреть возможность увеличения показателя подтверждения краткосрочной тенденции или изменения параметров EMA для повышения чувствительности.
Риск ложного проникновения:RSI-обратный сигнал может привести к ложному прорыву, что приведет к ошибочным сделкам. В ответ на этот риск можно добавить условия подтверждения, такие как изменение объема торговли или синхронное подтверждение других динамических показателей.
Не подходит для горизонтального рынка: стратегия лучше всего работает на рынке с явным трендом, а на этапе горизонтальной сборки может возникать частое ошибочное сигнализирование и убыточные сделки. Рекомендуется приостановить стратегию, когда рынок находится в очевидном колебании в диапазоне, что можно идентифицировать, добавив фильтр интенсивности тренда.
Параметр Чувствительность: Стратегическая производительность чувствительна к выбору параметров, особенно к установке порогов циклов EMA и RSI. Рекомендуется оптимизировать параметры в разных рыночных условиях с помощью исторической обратной связи, чтобы избежать чрезмерного соответствия.
Риски управления капиталом: фиксированный процент управления риском в экстремальных рыночных условиях может привести к накоплению убытков в течение длительного времени. Рекомендуется рассмотреть возможность применения механизма динамической корректировки риска, постепенно уменьшая размер позиции после убытков в течение длительного времени.
В соответствии с анализом кода стратегии, возможные направления оптимизации:
Синхронное подтверждение в нескольких периодах времени: объединяет тенденции и динамические сигналы в течение нескольких временных периодов, повышает точность принятия торговых решений. Например, можно проверить, соответствует ли тренд солнечной линии 4-часовой динамике, торгуя только в соответствии с направлением.
Фильтрация усиления тенденцииВведение индикатора силы тренда, такого как ADX, чтобы открывать позиции только тогда, когда тренд достаточно силен, чтобы избежать ошибочных сигналов слабого тренда или поперечного рынка.uptrendиdowntrendУсловия для повышения эффективности суждения.
Динамическая коррекция параметров рискаДинамическая корректировка доли риска для каждой сделки на основе рыночной волатильности, кривой аккаунтов или показателей эффективности стратегии, умеренное увеличение риска при хорошей эффективности стратегии и снижение риска при плохой эффективности.
Интеграция анализа рыночной средыВнедрение модулей для идентификации макроэкономической конъюнктуры рынка, таких как индекс волатильности или анализ структуры рынка, автоматическая корректировка параметров стратегии в зависимости от различных стадий рынка или выборочное включение.
Оптимизация тормозного механизмаПри использовании фиксированного 2.1R в качестве первой точки остановки, можно рассматривать возможность динамического корректировки позиции остановки на основе сопротивления поддержки или колебаний, чтобы получить прибыль вблизи ключевого уровня цены.
Добавить фильтр времени сделки: учитывать временные фильтры или условия загрузки, избегать периодов низкой текучести или аномальных условий загрузки, улучшить качество сигнала.
Оптимизация машинного обучения: использует алгоритмы машинного обучения для динамического прогнозирования оптимальных комбинаций параметров или торговых весов, самостоятельно адаптируясь к реальным рыночным условиям.
Количественная торговая стратегия, объединяющая идентификацию тенденций, подтверждение динамики, точный контроль риска и интеллектуальное управление капиталом, является целостной торговой системой. Движущийся индикатор RSI определяет наилучшее время входа в рынок, используя динамический механизм остановки убытков и сегментированной прибыли на основе ATR, чтобы достичь оптимального баланса риска и прибыли.
Наибольшим преимуществом стратегии является ее систематичность и дисциплина, устранение эмоциональных помех в процессе торговли с помощью четких количественных правил, подходящих для количественных трейдеров, стремящихся к устойчивому стилю торговли. В то же время, модуль управления рисками стратегии гарантирует ограниченные потери и неограниченный потенциал прибыли, в соответствии с основными принципами успешной торговли.
Несмотря на некоторые присущие ограничения, такие как отставание в оценке тенденций и недостаточная адаптивность поперечного рынка, оптимизационные направления, предложенные в предыдущем примере, такие как многочасовой анализ, фильтрация силы тенденций и коррекция динамического риска, могут еще больше повысить устойчивость и адаптивность стратегии.
Для инвесторов, стремящихся к систематическому методу торговли, эта стратегия предоставляет прочную базовую структуру, которая может быть дополнительно настроена и оптимизирована в соответствии с личными предпочтениями в отношении риска и пониманием рынка.
/*backtest
start: 2024-06-17 00:00:00
end: 2025-06-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/
//@version=5
strategy("Crypto Swing Trading Strategy (1-5 Day)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0, calc_on_every_tick=false, calc_on_order_fills=false)
// ============================================================================
// STRATEGY INPUTS
// ============================================================================
// Trend Filter Settings
ema_fast_length = input.int(50, title="Fast EMA Length", minval=1, group="Trend Filter")
ema_slow_length = input.int(200, title="Slow EMA Length", minval=1, group="Trend Filter")
// RSI Settings
rsi_length = input.int(14, title="RSI Length", minval=1, group="Momentum")
rsi_oversold = input.int(45, title="RSI Oversold Level", minval=1, maxval=50, group="Momentum")
rsi_overbought = input.int(70, title="RSI Overbought Level", minval=50, maxval=99, group="Momentum")
// ATR Settings
atr_length = input.int(14, title="ATR Length", minval=1, group="Risk Management")
atr_stop_mult = input.float(1.5, title="ATR Stop Loss Multiplier", minval=0.1, step=0.1, group="Risk Management")
atr_trail_mult = input.float(1.0, title="ATR Trailing Stop Multiplier", minval=0.1, step=0.1, group="Risk Management")
// Risk Management
risk_per_trade = input.float(1.0, title="Risk Per Trade (%)", minval=0.1, maxval=5.0, step=0.1, group="Risk Management")
reward_ratio = input.float(2.1, title="Initial Take Profit Ratio (R:R)", minval=1.0, step=0.1, group="Risk Management")
// Strategy Settings
pullback_distance = input.float(1.0, title="Max Distance from 50 EMA for Pullback (ATR)", minval=0.1, step=0.1, group="Entry Conditions")
enable_shorts = input.bool(true, title="Enable Short Trades", group="Strategy Settings")
enable_longs = input.bool(true, title="Enable Long Trades", group="Strategy Settings")
// ============================================================================
// INDICATOR CALCULATIONS
// ============================================================================
// Moving Averages
ema_fast = ta.ema(close, ema_fast_length)
ema_slow = ta.ema(close, ema_slow_length)
// RSI
rsi = ta.rsi(close, rsi_length)
// ATR
atr = ta.atr(atr_length)
// ============================================================================
// TREND IDENTIFICATION
// ============================================================================
// Primary trend based on EMA relationship
uptrend = ema_fast > ema_slow
downtrend = ema_fast < ema_slow
// ============================================================================
// ENTRY CONDITIONS
// ============================================================================
// Long Entry Conditions
long_trend_ok = uptrend and enable_longs
long_pullback = math.abs(close - ema_fast) <= (pullback_distance * atr) and close < ema_fast[1]
long_rsi_oversold = rsi[1] < rsi_oversold
long_rsi_recovery = rsi > rsi_oversold and rsi[1] <= rsi_oversold
long_entry_condition = long_trend_ok and long_pullback and long_rsi_oversold and long_rsi_recovery
// Short Entry Conditions
short_trend_ok = downtrend and enable_shorts
short_pullback = math.abs(close - ema_fast) <= (pullback_distance * atr) and close > ema_fast[1]
short_rsi_overbought = rsi[1] > rsi_overbought
short_rsi_decline = rsi < rsi_overbought and rsi[1] >= rsi_overbought
short_entry_condition = short_trend_ok and short_pullback and short_rsi_overbought and short_rsi_decline
// ============================================================================
// POSITION SIZING
// ============================================================================
// Calculate position size based on risk per trade and ATR stop distance
calculate_position_size(entry_price, stop_price, risk_percent) =>
risk_amount = strategy.equity * (risk_percent / 100)
stop_distance = math.abs(entry_price - stop_price)
position_size = stop_distance > 0 ? risk_amount / stop_distance : 0
position_size
// ============================================================================
// STRATEGY VARIABLES
// ============================================================================
var float long_entry_price = na
var float long_stop_price = na
var float long_tp1_price = na
var float long_trail_stop = na
var bool long_tp1_hit = false
var float short_entry_price = na
var float short_stop_price = na
var float short_tp1_price = na
var float short_trail_stop = na
var bool short_tp1_hit = false
// ============================================================================
// LONG TRADE MANAGEMENT
// ============================================================================
// Long Entry
if long_entry_condition and strategy.position_size == 0
long_entry_price := close
long_stop_price := close - (atr_stop_mult * atr)
long_tp1_price := close + (reward_ratio * (close - long_stop_price))
long_trail_stop := long_stop_price
long_tp1_hit := false
// Calculate position size
pos_size = calculate_position_size(long_entry_price, long_stop_price, risk_per_trade)
strategy.entry("Long", strategy.long, qty=pos_size)
strategy.exit("Long Stop", "Long", stop=long_stop_price)
// Long TP1 Management (Take 50% profit at 2:1 R:R)
if strategy.position_size > 0 and not long_tp1_hit and high >= long_tp1_price
long_tp1_hit := true
strategy.close("Long", qty_percent=50, comment="TP1 - 50%")
// Move stop to breakeven
long_trail_stop := long_entry_price
strategy.cancel("Long Stop")
// Long Trailing Stop (for remaining 50% position)
if strategy.position_size > 0 and long_tp1_hit
// Calculate new trailing stop
highest_since_tp1 = ta.highest(high, 1)
new_trail_stop = highest_since_tp1 - (atr_trail_mult * atr)
// Only move stop up, never down
if new_trail_stop > long_trail_stop
long_trail_stop := new_trail_stop
// Exit on trailing stop or trend reversal
if close <= long_trail_stop or not uptrend
strategy.close("Long", comment=not uptrend ? "Trend Reversal" : "Trailing Stop")
// ============================================================================
// SHORT TRADE MANAGEMENT
// ============================================================================
// Short Entry
if short_entry_condition and strategy.position_size == 0
short_entry_price := close
short_stop_price := close + (atr_stop_mult * atr)
short_tp1_price := close - (reward_ratio * (short_stop_price - close))
short_trail_stop := short_stop_price
short_tp1_hit := false
// Calculate position size
pos_size = calculate_position_size(short_entry_price, short_stop_price, risk_per_trade)
strategy.entry("Short", strategy.short, qty=pos_size)
strategy.exit("Short Stop", "Short", stop=short_stop_price)
// Short TP1 Management (Take 50% profit at 2:1 R:R)
if strategy.position_size < 0 and not short_tp1_hit and low <= short_tp1_price
short_tp1_hit := true
strategy.close("Short", qty_percent=50, comment="TP1 - 50%")
// Move stop to breakeven
short_trail_stop := short_entry_price
strategy.cancel("Short Stop")
// Short Trailing Stop (for remaining 50% position)
if strategy.position_size < 0 and short_tp1_hit
// Calculate new trailing stop
lowest_since_tp1 = ta.lowest(low, 1)
new_trail_stop = lowest_since_tp1 + (atr_trail_mult * atr)
// Only move stop down, never up
if new_trail_stop < short_trail_stop
short_trail_stop := new_trail_stop
// Exit on trailing stop or trend reversal
if close >= short_trail_stop or not downtrend
strategy.close("Short", comment=not downtrend ? "Trend Reversal" : "Trailing Stop")
// ============================================================================
// PLOTTING
// ============================================================================
// Plot EMAs
plot(ema_fast, title="EMA 50", color=color.blue, linewidth=2)
plot(ema_slow, title="EMA 200", color=color.red, linewidth=2)
// Color background based on trend
bgcolor(uptrend ? color.new(color.green, 95) : downtrend ? color.new(color.red, 95) : na, title="Trend Background")
// Plot RSI levels (scaled to price for visualization)
hline(rsi_overbought, title="RSI Overbought", color=color.red, linestyle=hline.style_dashed)
hline(rsi_oversold, title="RSI Oversold", color=color.green, linestyle=hline.style_dashed)
// Plot entry signals
plotshape(long_entry_condition, title="Long Entry", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.normal)
plotshape(short_entry_condition, title="Short Entry", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.normal)
// Plot stop losses and targets for current position
plot(strategy.position_size > 0 ? long_trail_stop : na, title="Long Trailing Stop", color=color.red, style=plot.style_stepline, linewidth=2)
plot(strategy.position_size < 0 ? short_trail_stop : na, title="Short Trailing Stop", color=color.red, style=plot.style_stepline, linewidth=2)
plot(strategy.position_size > 0 and not long_tp1_hit ? long_tp1_price : na, title="Long TP1", color=color.green, style=plot.style_cross, linewidth=2)
plot(strategy.position_size < 0 and not short_tp1_hit ? short_tp1_price : na, title="Short TP1", color=color.green, style=plot.style_cross, linewidth=2)
// ============================================================================
// INFORMATION DISPLAY (Using Labels instead of Table)
// ============================================================================
// Display key information using labels on the last bar
if barstate.islast
// Create info label with key metrics
trend_text = uptrend ? "UP" : downtrend ? "DOWN" : "SIDE"
position_text = strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "NONE"
info_text = "Trend: " + trend_text + "\nRSI: " + str.tostring(math.round(rsi, 1)) + "\nATR: " + str.tostring(math.round(atr, 2)) + "\nPosition: " + position_text
label.new(bar_index, high + atr, info_text,
color=uptrend ? color.new(color.green, 80) : downtrend ? color.new(color.red, 80) : color.new(color.gray, 80),
textcolor=color.white, style=label.style_label_down, size=size.normal)
// ============================================================================
// ALERTS
// ============================================================================
// Alert conditions
alertcondition(long_entry_condition, title="Long Entry Signal", message="LONG: Swing trading signal for {{ticker}} at {{close}}")
alertcondition(short_entry_condition, title="Short Entry Signal", message="SHORT: Swing trading signal for {{ticker}} at {{close}}")
alertcondition(strategy.position_size > 0 and long_tp1_hit, title="Long TP1 Hit", message="LONG TP1: First target hit for {{ticker}} at {{close}}")
alertcondition(strategy.position_size < 0 and short_tp1_hit, title="Short TP1 Hit", message="SHORT TP1: First target hit for {{ticker}} at {{close}}")
// ============================================================================
// STRATEGY SUMMARY
// ============================================================================
// This strategy implements the full swing trading approach described in the document:
// 1. Trend filtering using 50/200 EMA (only trade with the trend)
// 2. RSI momentum for entry timing (buy oversold in uptrend, sell overbought in downtrend)
// 3. ATR-based position sizing and stop losses (volatility-adjusted risk management)
// 4. Partial profit taking at 2:1 R:R (50% of position)
// 5. Trailing stops for remaining position using ATR
// 6. Trend reversal exits (close all when trend changes)
//
// Key Features:
// - Configurable parameters for different market conditions
// - Risk management with consistent 1% risk per trade
// - Visual indicators for trend, signals, and trade management
// - Information table showing key metrics
// - Alert system for automated notifications
//
// Recommended for: BTC, ETH, XRP on daily timeframes
// Holding period: 1-5 days typical