
Движущаяся стоп-стратегия DCA является высокотехнологичной системой торговли на коротких линиях, которая сочетает в себе технический анализ и среднюю стоимость доллара (DCA). Стратегия использует несколько технических показателей, таких как EMA 48, RSI 14, MACD и буринговые полосы, для подтверждения потенциальных точек входа, в то время как внедряется структурированный метод управления позициями и заранее установленный механизм контроля риска.
Принцип стратегии основан на комбинации признаний по множеству технических показателей, включающих в себя следующие ключевые компоненты:
Система условий приема:
Динамическое управление позициями:
Интеллектуальная прибыль:
Глубокий анализ кода показал, что стратегия также включает в себя систему распознавания долины пика, которая отслеживает отклонения от модели, отслеживая цены и последние 5 точек колебаний RSI. Система подтверждения высоких временных рамок, которая анализирует поддержку и сопротивление на диаграмме солнечных лучей, чтобы избежать ложных сигналов на низких временных рамах.
Взглянув на код этой стратегии, можно сделать вывод о следующих существенных преимуществах:
Многоуровневая система подтверждения: Благодаря совместному действию нескольких технических индикаторов, значительно снижается вероятность ложных сигналов, повышается выигрышная вероятность торгов. Комбинированное использование EMA, RSI, MACD и Брин-полосы обеспечивает высокое качество входных точек.
Интеллектуальные средстваПрименение метода соотношения 1-2-6 DCA позволяет использовать волатильную среднюю стоимость рынка и ограничивает общий риск. Первоначальный риск ограничен 1-3% от счета, что гарантирует, что даже в худшем случае не будет катастрофических потерь.
Динамическая защита от повреждений: Механизм остановки убытков адаптируется к развитию сделки, особенно при получении части прибыли, которая переносится в позицию залога, что эффективно уравновешивает потребность в защите прибыли и предоставлении пространства для торговли.
Стратегия поэтапной прибылиВ результате закрытия позиций на 25% и 50% в 0,5% и 1% прибыли, стратегия позволяет закрепить часть прибыли, сохраняя позиции, чтобы поймать большие рыночные движения и достичь баланса риска и прибыли.
Высокий срок подтверждения: использование поддержки и сопротивления на более высоких временных рамках для фильтрации торговых сигналов, уменьшая влияние шума и ложных прорывов, которые часто встречаются на более низких временных рамках.
Несмотря на тщательную разработку этой стратегии, существует несколько факторов риска, о которых следует помнить:
Параметр ЧувствительностьВыполнение стратегии сильно зависит от множества параметров, включая циклы EMA, порог RSI и уровень DCA. Небольшие изменения в этих параметрах могут привести к значительным различиям в результатах торгов, которые требуют тщательной оптимизации и обратной измерения.
Опасность огромных колебанийНесмотря на наличие механизма DCA, в условиях резкой волатильности на рынке цена может быстро превысить все установленные точки остановки, что приводит к фактическим потерям, превышающим ожидания. Для такого риска можно рассмотреть возможность использования более строгих размеров начальных позиций или приостановки торговли во время высокой волатильности.
Складывающийся эффект последовательных убытков: Даже если риск отдельной сделки ограничен, последовательные потери могут привести к значительному снижению кривой капитала. Рекомендуется внедрение дополнительного общего контроля риска, такого как ограничение максимальных потерь в день или в неделю.
Сложности выявления RSI: обнаружение отклонения RSI в коде зависит от точности исторических данных, которые могут быть недостаточно надежными в некоторых рыночных условиях. Можно рассмотреть возможность использования более продвинутых статистических методов для подтверждения отклонения.
Зависимость от рыночной ликвидности: В рынках с низкой ликвидностью большое количество заказов DCA может иметь проблемы со скольжением, что влияет на общую эффективность стратегии.
Основываясь на глубоком анализе кода, можно выделить несколько направлений, в которых эта стратегия может быть оптимизирована:
Изменение динамических параметровМожно ввести механизмы для корректировки динамических параметров, основанных на волатильности рынка. Например, автоматическое увеличение требований к понижению RSI во время высокой волатильности или корректировка длины EMA в соответствии с различными рыночными циклами. Такие механизмы самостоятельной адаптации могут повысить устойчивость стратегии в различных рыночных условиях.
Усиление отклонения от обнаружения: Текущий RSI отклоняется от обнаружения относительно просто, можно повысить точность путем введения более сложных алгоритмов, таких как использование преобразования RSI в Fisher или добавление подтверждения в объеме. Это уменьшит сигнал ошибочной информации и повысит точность стратегии.
Интеллектуальная оптимизация прибылиНынешние фиксированные выгоды могут быть преобразованы в динамические выгоды, основанные на рыночной волатильности. Например, установление более высоких целевых показателей прибыли в периоды высокой волатильности и снижение целевых показателей в периоды низкой волатильности в соответствии с изменением рыночных условий.
Управление финансами: можно оптимизировать соотношение и триггеры DCA, в зависимости от структуры рынка и динамики силы текущей тенденции. Например, используйте более радикальное соотношение DCA в сильных тенденциях, а более консервативно в слабых тенденциях.
Оптимизация времени торговлиВнедрение временных фильтров, основанных на объеме и волатильности торгов, чтобы избежать торговли в периоды низкой активности. Это может быть достигнуто путем анализа исторических данных для определения оптимальных временных окон торговли.
Движущаяся стоп-стратегия DCA с прорывом в равновесии с подтверждением множества индикаторов - это хорошо продуманная система коротких линий торговли, которая искусно сочетает в себе несколько инструментов технического анализа с передовыми технологиями управления капиталом. Работая в сочетании с такими показателями, как EMA, RSI, MACD и Brin Belt, эта стратегия позволяет идентифицировать высоковероятные точки входа, используя при этом структурированный DCA-метод и динамический стоп-стоп для управления рисками и блокирования прибыли.
Несмотря на очевидные преимущества этой стратегии, включая строгий контроль риска, многоуровневую систему подтверждения и интеллектуальные механизмы получения прибыли, пользователям необходимо быть бдительными в отношении чувствительности параметров и рисков, связанных с резкой волатильностью рынка.
Для трейдеров эта стратегия наиболее подходит для рынков с достаточной ликвидностью, и до ее использования следует провести полное историческое отсчет и оптимизацию параметров. С тщательным внедрением и постоянной контрольной корректировкой эта многоуровневая торговая система может стать мощным оружием в коробке инструментов коротколинейных трейдеров.
/*backtest
start: 2024-04-11 00:00:00
end: 2025-04-10 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Scalping Strategy with DCA - V2", overlay=true, margin_long=100, margin_short=100)
// Input parameters
emaLength = input.int(48, title="EMA Length", minval=1, group="Main Indicators")
rsiLength = input.int(14, title="RSI Length", minval=1, group="Main Indicators")
macdShortLength = input.int(12, title="MACD Short Length", minval=1, group="Main Indicators")
macdLongLength = input.int(30, title="MACD Long Length", minval=1, group="Main Indicators")
macdSignalLength = input.int(9, title="MACD Signal Length", minval=1, group="Main Indicators")
bbLength = input.int(20, title="Bollinger Bands Length", group="Main Indicators")
bbMult = input.float(2.0, title="Bollinger Bands Multiplier", group="Main Indicators")
// Risk management parameters
initialRiskPercent = input.float(1.0, title="Initial Risk % of Account", minval=0.1, maxval=3.0, step=0.1, group="Risk Management")
stopLossPercent = input.float(1.5, title="Stop Loss % (Unboosted)", minval=0.5, maxval=3.0, step=0.1, group="Risk Management")
fixedSLPercent = input.float(1.3, title="Fixed SL % after full DCA", minval=0.1, maxval=5.0, step=0.1, group="Risk Management")
takeProfitPercent1 = input.float(0.5, title="First Take Profit % (25% Volume)", minval=0.1, group="Risk Management")
takeProfitPercent2 = input.float(1.0, title="Second Take Profit % (50% Volume)", minval=0.1, group="Risk Management")
// DCA parameters
enableDCA = input.bool(true, title="Enable DCA", group="DCA Settings")
dcaLevel1 = input.float(1.0, title="DCA Level 1 % Drop", minval=0.1, group="DCA Settings")
dcaLevel2 = input.float(2.0, title="DCA Level 2 % Drop", minval=0.1, group="DCA Settings")
// Higher Timeframe parameters
higherTF = input.timeframe("D", title="Higher Timeframe for Confirmation", group="Advanced Settings")
useHTFConfirmation = input.bool(true, title="Use Higher Timeframe Confirmation", group="Advanced Settings")
// Debug parameters
showLabels = input.bool(true, title="Show Entry/Exit Labels", group="Visual")
showSL = input.bool(true, title="Show Stop Loss Lines", group="Visual")
showTP = input.bool(true, title="Show Take Profit Lines", group="Visual")
// Calculate indicators
ema = ta.ema(close, emaLength)
rsi = ta.rsi(close, rsiLength)
[macdLine, signalLine, _] = ta.macd(close, macdShortLength, macdLongLength, macdSignalLength)
[middle, upper, lower] = ta.bb(close, bbLength, bbMult)
// Variables for tracking peaks and troughs
var priceHighs = array.new_float(0)
var priceLows = array.new_float(0)
var rsiHighs = array.new_float(0)
var rsiLows = array.new_float(0)
// Track last 5 peaks and troughs for both price and RSI
pivot_high = ta.pivothigh(high, 2, 2)
if not na(pivot_high)
array.push(priceHighs, pivot_high)
if array.size(priceHighs) > 5
array.shift(priceHighs)
pivot_low = ta.pivotlow(low, 2, 2)
if not na(pivot_low)
array.push(priceLows, pivot_low)
if array.size(priceLows) > 5
array.shift(priceLows)
rsi_pivot_high = ta.pivothigh(rsi, 2, 2)
if not na(rsi_pivot_high)
array.push(rsiHighs, rsi_pivot_high)
if array.size(rsiHighs) > 5
array.shift(rsiHighs)
rsi_pivot_low = ta.pivotlow(rsi, 2, 2)
if not na(rsi_pivot_low)
array.push(rsiLows, rsi_pivot_low)
if array.size(rsiLows) > 5
array.shift(rsiLows)
// Check for RSI divergence
rsiDivergenceBullish = array.size(priceLows) >= 5 and array.size(rsiLows) >= 5 and array.get(priceLows, array.size(priceLows) - 1) < array.get(priceLows, array.size(priceLows) - 5) and array.get(rsiLows, array.size(rsiLows) - 1) > array.get(rsiLows, array.size(rsiLows) - 5)
rsiDivergenceBearish = array.size(priceHighs) >= 5 and array.size(rsiHighs) >= 5 and array.get(priceHighs, array.size(priceHighs) - 1) > array.get(priceHighs, array.size(priceHighs) - 5) and array.get(rsiHighs, array.size(rsiHighs) - 1) < array.get(rsiHighs, array.size(rsiHighs) - 5)
// Check if price is near previous high/low (Rule #4)
isNearPrevHigh = array.size(priceHighs) >= 2 and math.abs(high - array.get(priceHighs, array.size(priceHighs) - 2)) / array.get(priceHighs, array.size(priceHighs) - 2) < 0.01
isNearPrevLow = array.size(priceLows) >= 2 and math.abs(low - array.get(priceLows, array.size(priceLows) - 2)) / array.get(priceLows, array.size(priceLows) - 2) < 0.01
// Higher timeframe confirmation (Rule #10)
// Get pivot points from higher timeframe
htf_is_pivot_low = request.security(syminfo.tickerid, higherTF, not na(ta.pivotlow(low, 2, 2)), barmerge.gaps_off, barmerge.lookahead_off)
htf_is_pivot_high = request.security(syminfo.tickerid, higherTF, not na(ta.pivothigh(high, 2, 2)), barmerge.gaps_off, barmerge.lookahead_off)
// Count pivots in higher timeframe to check if this is the 2nd pivot
var htf_pivot_low_count = 0
var htf_pivot_high_count = 0
if htf_is_pivot_low
htf_pivot_low_count := htf_pivot_low_count + 1
htf_pivot_low_count := math.min(htf_pivot_low_count, 10) // Prevent unlimited counting
if htf_is_pivot_high
htf_pivot_high_count := htf_pivot_high_count + 1
htf_pivot_high_count := math.min(htf_pivot_high_count, 10) // Prevent unlimited counting
// Reset counts after a while to maintain relevance
if not htf_is_pivot_low and not htf_is_pivot_high and bar_index % 100 == 0
htf_pivot_low_count := 0
htf_pivot_high_count := 0
// Check if this is the 2nd pivot in higher timeframe
isHTFSecondPivotLow = htf_is_pivot_low and htf_pivot_low_count == 2
isHTFSecondPivotHigh = htf_is_pivot_high and htf_pivot_high_count == 2
// Check crossing of Bollinger Bands
crossUpperBand = ta.crossover(close, upper)
crossLowerBand = ta.crossunder(close, lower)
// Entry conditions refined with higher timeframe confirmation
longCondition = close > ema and close[1] <= ema[1] and rsi > 60 and macdLine > signalLine and isNearPrevLow and rsiDivergenceBullish and (not useHTFConfirmation or isHTFSecondPivotLow)
shortCondition = close < ema and close[1] >= ema[1] and rsi < 40 and macdLine < signalLine and isNearPrevHigh and rsiDivergenceBearish and (not useHTFConfirmation or isHTFSecondPivotHigh)
// Additional entry conditions when price crosses Bollinger Bands (Rule #11)
longBBCondition = crossLowerBand and rsi < 30
shortBBCondition = crossUpperBand and rsi > 70
// Calculate position sizes for DCA
initialSize = strategy.equity * initialRiskPercent / 100 / 9 // Initial sizing according to the 1-2-6 rule
dca1Size = initialSize * 2
dca2Size = initialSize * 6
// Calculate SL in money terms (Rule #3)
slMoneyAmount = strategy.equity * initialRiskPercent / 100 * stopLossPercent / 100
// Variables to track DCA levels
var float longEntryPrice = 0.0
var float shortEntryPrice = 0.0
var int longDCACount = 0
var int shortDCACount = 0
var float stopLossLevel = 0.0
var float takeProfit1Level = 0.0
var float takeProfit2Level = 0.0
var float slMoneyValue = 0.0
// Close partial positions at take profit levels
if strategy.position_size > 0
if close >= takeProfit1Level and takeProfit1Level > 0 and strategy.position_size == initialSize + (longDCACount > 0 ? dca1Size : 0) + (longDCACount > 1 ? dca2Size : 0)
strategy.order("Long TP1", strategy.short, qty=strategy.position_size * 0.25)
if showLabels
label.new(bar_index, high, "TP1 (25%)", color=color.green, textcolor=color.white, style=label.style_label_down)
if close >= takeProfit2Level and takeProfit2Level > 0 and strategy.position_size > initialSize * 0.25
strategy.order("Long TP2", strategy.short, qty=strategy.position_size * 0.5)
stopLossLevel := longEntryPrice // Move SL to breakeven after TP2
if showLabels
label.new(bar_index, high, "TP2 (50%) & SL→BE", color=color.green, textcolor=color.white, style=label.style_label_down)
if strategy.position_size < 0
if close <= takeProfit1Level and takeProfit1Level > 0 and math.abs(strategy.position_size) == initialSize + (shortDCACount > 0 ? dca1Size : 0) + (shortDCACount > 1 ? dca2Size : 0)
strategy.order("Short TP1", strategy.long, qty=math.abs(strategy.position_size) * 0.25)
if showLabels
label.new(bar_index, low, "TP1 (25%)", color=color.red, textcolor=color.white, style=label.style_label_up)
if close <= takeProfit2Level and takeProfit2Level > 0 and math.abs(strategy.position_size) > initialSize * 0.25
strategy.order("Short TP2", strategy.long, qty=math.abs(strategy.position_size) * 0.5)
stopLossLevel := shortEntryPrice // Move SL to breakeven after TP2
if showLabels
label.new(bar_index, low, "TP2 (50%) & SL→BE", color=color.red, textcolor=color.white, style=label.style_label_up)
// DCA Logic
if enableDCA and strategy.position_size > 0 and longDCACount < 2
if close < longEntryPrice * (1 - dcaLevel1/100) and longDCACount == 0
strategy.entry("Long DCA1", strategy.long, qty=dca1Size)
longDCACount := 1
if showLabels
label.new(bar_index, low, "DCA1", color=color.blue, textcolor=color.white, style=label.style_label_up)
if close < longEntryPrice * (1 - dcaLevel2/100) and longDCACount == 1
strategy.entry("Long DCA2", strategy.long, qty=dca2Size)
longDCACount := 2
// Update SL to fixed percentage after full DCA (Rule #6)
stopLossLevel := longEntryPrice * (1 - fixedSLPercent/100)
if showLabels
label.new(bar_index, low, "DCA2 & SL Update", color=color.blue, textcolor=color.white, style=label.style_label_up)
if enableDCA and strategy.position_size < 0 and shortDCACount < 2
if close > shortEntryPrice * (1 + dcaLevel1/100) and shortDCACount == 0
strategy.entry("Short DCA1", strategy.short, qty=dca1Size)
shortDCACount := 1
if showLabels
label.new(bar_index, high, "DCA1", color=color.purple, textcolor=color.white, style=label.style_label_down)
if close > shortEntryPrice * (1 + dcaLevel2/100) and shortDCACount == 1
strategy.entry("Short DCA2", strategy.short, qty=dca2Size)
shortDCACount := 2
// Update SL to fixed percentage after full DCA (Rule #6)
stopLossLevel := shortEntryPrice * (1 + fixedSLPercent/100)
if showLabels
label.new(bar_index, high, "DCA2 & SL Update", color=color.purple, textcolor=color.white, style=label.style_label_down)
// Entry with initial position
if longCondition or longBBCondition
strategy.close("Short")
strategy.entry("Long", strategy.long, qty=initialSize)
longEntryPrice := close
longDCACount := 0
shortDCACount := 0
// Set SL based on money value (not percentage)
slMoneyValue := slMoneyAmount
// Convert to price level - simplified version
stopLossLevel := close * (1 - stopLossPercent/100)
takeProfit1Level := close * (1 + takeProfitPercent1/100)
takeProfit2Level := close * (1 + takeProfitPercent2/100)
if showLabels
label.new(bar_index, low, "LONG", color=color.green, textcolor=color.white, style=label.style_label_up)
if shortCondition or shortBBCondition
strategy.close("Long")
strategy.entry("Short", strategy.short, qty=initialSize)
shortEntryPrice := close
longDCACount := 0
shortDCACount := 0
// Set SL based on money value (not percentage)
slMoneyValue := slMoneyAmount
// Convert to price level - simplified version
stopLossLevel := close * (1 + stopLossPercent/100)
takeProfit1Level := close * (1 - takeProfitPercent1/100)
takeProfit2Level := close * (1 - takeProfitPercent2/100)
if showLabels
label.new(bar_index, high, "SHORT", color=color.red, textcolor=color.white, style=label.style_label_down)
// Stop Loss
if strategy.position_size > 0 and low <= stopLossLevel
strategy.close("Long")
if showLabels
label.new(bar_index, low, "SL", color=color.red, textcolor=color.white, style=label.style_label_up)
if strategy.position_size < 0 and high >= stopLossLevel
strategy.close("Short")
if showLabels
label.new(bar_index, high, "SL", color=color.red, textcolor=color.white, style=label.style_label_down)
// Market cap and holder % check can't be done directly in TradingView, but we display a reminder
if strategy.position_size != 0 and bar_index % 100 == 0
label.new(bar_index, close, "Remember: Only trade coins with large market cap and >7% holder ratio",
color=color.yellow, textcolor=color.black, style=label.style_label_left)
// Plot indicators - these must be at the global scope in Pine Script v6
plot(ema, color=color.blue, title="48 EMA")
plot(upper, color=color.red, title="Upper BB")
plot(lower, color=color.green, title="Lower BB")
plot(middle, color=color.yellow, title="Middle BB")
// Plot stop loss and take profit levels - conditions need to be part of the plot function in v6
plotSL = showSL and stopLossLevel > 0 ? stopLossLevel : na
plot(plotSL, color=color.red, style=plot.style_circles, linewidth=2, title="Stop Loss")
// TP for long positions
plotTP1Long = showTP and strategy.position_size > 0 and takeProfit1Level > 0 ? takeProfit1Level : na
plot(plotTP1Long, color=color.green, style=plot.style_circles, linewidth=1, title="TP1 Long")
plotTP2Long = showTP and strategy.position_size > 0 and takeProfit2Level > 0 ? takeProfit2Level : na
plot(plotTP2Long, color=color.green, style=plot.style_circles, linewidth=2, title="TP2 Long")
// TP for short positions
plotTP1Short = showTP and strategy.position_size < 0 and takeProfit1Level > 0 ? takeProfit1Level : na
plot(plotTP1Short, color=color.green, style=plot.style_circles, linewidth=1, title="TP1 Short")
plotTP2Short = showTP and strategy.position_size < 0 and takeProfit2Level > 0 ? takeProfit2Level : na
plot(plotTP2Short, color=color.green, style=plot.style_circles, linewidth=2, title="TP2 Short")
// Additional table with strategy information
if barstate.islastconfirmedhistory
var table infoTable = table.new(position=position.top_right, columns=2, rows=5, bgcolor=color.new(color.black, 70), frame_width=1)
table.cell(infoTable, 0, 0, "Strategy:", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 1, 0, "Scalping with DCA", text_color=color.white)
table.cell(infoTable, 0, 1, "Initial Risk:", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 1, 1, str.tostring(initialRiskPercent, "#.##") + "% of account", text_color=color.white)
table.cell(infoTable, 0, 2, "DCA Ratio:", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 1, 2, "1-2-6", text_color=color.white)
table.cell(infoTable, 0, 3, "SL After DCA:", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 1, 3, str.tostring(fixedSLPercent, "#.##") + "%", text_color=color.white)
table.cell(infoTable, 0, 4, "REMINDERS:", bgcolor=color.new(color.red, 90), text_color=color.white)
table.cell(infoTable, 1, 4, "Only trade coins with market cap and >7% holder ratio", text_color=color.white)