
이 전략은 두 지수 이동 평균 (EMA) 필터와 지능형 간격 및 잡음 탐지 메커니즘을 결합한 고급 트렌드 추적 시스템으로, 명확하고 작동 가능한 거래 신호를 제공하기 위해 고안되었습니다. 핵심 설계 아이디어는 흔들리는 시장을 피하고 거래의 정확성을 향상시키고 다른 시장 조건에 적응할 수 있습니다. 이 전략은 EMA의 높은 선과 EMA의 낮은 선의 교차로로 트렌드 방향을 판단하며, 간격 필터와 변동율 필터를 사용하여横盘 또는 낮은 변동 환경에서 거래하는 것을 피하면서 거래의 성공률을 크게 향상시킵니다.
이 전략의 핵심 기구는 다음과 같은 핵심 구성 요소에 기반합니다.
이중 EMA 필터링 시스템전략: 두 개의 지수 이동 평균을 사용 하 여 (고 가격 EMA와 낮은 가격 EMA) 시장의 추세를 확인 . 가격이 두 개의 EMA 라인 위에 동시에있을 때, 다중 신호를 생성; 가격이 두 개의 EMA 라인 아래에 동시에있을 때, 하위 신호를 생성 . 이 이중 확인 메커니즘은 가짜 돌파의 발생을 효과적으로 감소 .
간격 탐지 메커니즘전략은 가격 범위의 비율을 기반으로 한 분기 식별 알고리즘을 사용하며, 시장이 수평 정리 단계에 진입했을 때 (즉, 가격 변동 범위가 설정된 하위값보다 작을 때) 자동으로 거래를 중지합니다. 시스템은 연속적인 분기 바의 수를 지속적으로 모니터링하며, 시장이 진정한 분기 상태에 있음을 확인했을 때만 분기 필터를 활성화하여 초기 돌파 기회를 놓치지 않도록합니다.
변동율 필터현재 가격에 대한 ATR (진정한 변동의 평균) 의 비율을 계산함으로써, 전략은 낮은 변동의 환경을 식별하고 이러한 조건에서 거래를 피할 수 있습니다. 이 메커니즘은 시장에서 충분한 동력이있는 경우에만 거래를 보장합니다.
트렌드당 거래 원칙: 전략은 트렌드 상태 메커니즘을 구현하여 트렌드 방향이 변경될 때까지 동일한 트렌드 방향에서 한 번만 거래하는 것을 보장합니다. 이것은 동일한 트렌드에서 과도한 거래와 신호 반복을 방지합니다.
미시분간 시각화전략은 잠재적으로 높은 확률의 거래 기회를 식별하는 데 도움이 될 수있는 통합 영역을 탐지하고 표시 할 수 있습니다.
동적 위험 관리이 전략은 ATR 기반의 중지 또는 고정 비율 중지, 그리고 선택 가능한 패러블 라인 SAR 추적 중단을 제공하여 위험 관리를 더 유연하고 시장 변화에 적응시킵니다.
고도로 적응력이 전략은 다양한 시장 조건에 자동으로 적응할 수 있고, 동향 시장에서 동향을 잡을 수 있으며, 동향 시장에서 관측을 유지할 수 있습니다. 이러한 적응성은 다양한 시장 환경에서 안정적으로 유지되도록합니다.
다중 필터링 장치이 전략은 트렌드, 간격, 그리고 변동률을 결합하여 트리플 필터링을 통해 거래 신호의 질을 크게 향상시키고, 잘못된 신호와 가짜 브레이크 거래를 줄여줍니다.
지능형 변동률 조정전략: 시장의 변동성에 따라 포지션 크기를 조정하여 높은 변동성 환경에서 위험을 줄이고 적당한 변동성 환경에서 수익 잠재력을 최대화하십시오.
전체적인 시각화 도구전략은 다양한 시각적 보조 도구를 제공하는데, 그 중에는 간격 표시, 깨지지 않은 간격框, EMA 라인 및 SAR 점 등이 있다. 이 도구는 거래자가 시장 상태와 전략 논리를 직관적으로 이해할 수 있도록 해준다.
유연한 위험 관리여러 종류의 손실을 막는 전략을 지원합니다. 고정된 비율, ATR 배수, SAR 추적을 통해 거래자가 개인 위험 선호와 시장 특성에 따라 가장 적합한 위험 관리 방법을 선택할 수 있습니다.
일회성 거래 원칙: 트렌드 상태 메커니즘을 통해 트렌드 방향마다 한 번만 거래하는 것을 보장하여 과도한 거래와 과도한 자금이 단일 방향의 위험에 노출되는 것을 피합니다.
트렌드 반전 지연: EMA를 주요 트렌드 지표로 사용하기 때문에, 전략은 빠른 트렌드 반전시 느리게 반응할 수 있으며, 반전 초기에는 약간의 회전이 발생합니다. 해결책은 EMA 길이 변수를 조정하는 것입니다. 변동성이 큰 시장에서는 짧은 EMA 길이를 사용할 수 있습니다.
수평 시장의 비효율성: 전략이 간격 필터를 설계했음에도 불구하고, 장기 수평 시장에서 오랜 시간 동안 거래 기회가 발생하지 않고 자금 사용 효율성에 영향을 미칠 수 있습니다. 해결책은 다중 시간 프레임 분석과 결합하거나 다른 시장 간 순환으로 전략을 사용하는 것입니다.
변수 최적화 의존성: 전략 성능은 EMA 길이, 분기 값 및 ATR 배수 등과 같은 파라미터 설정에 크게 의존한다. 다른 시장과 시간 프레임에 따라 다른 파라미터 조합이 필요할 수 있다. 특정 시장과 시간 프레임에 대한 역검사를 통해 파라미터를 최적화하는 것이 좋습니다.
급격한 큰 변동의 위험급격한 시장 사건 (중요한 보도 발표와 같은) 으로 인해 가격이 급등하는 경우, 정지 손실은 예상된 가격으로 실행되지 않을 수 있으며, 예상보다 실제 손실이 발생할 수 있습니다. 추가 자금 관리 규칙을 사용하여 단일 거래의 위험을 제한하는 것이 좋습니다.
기술적인 지표에 지나치게 의존하는 것전략은 전적으로 기술적 지표에 기반하고, 기본적 요소를 무시한다. 중요한 기본적 변화가 있을 때, 순수한 기술적 분석은 무효가 될 수 있다. 기본적 분석과 함께 또는 중요한 경제 데이터가 발표되기 전에 포지션을 줄이거나 거래를 중지하는 위험 이벤트 달력을 설정하는 것이 좋습니다.
다중 시간 프레임 확인 시스템: 여러 시간 프레임 분석을 도입하면 전략의 정확도가 크게 향상될 수 있습니다. 더 높은 시간 프레임의 트렌드 확인 조건을 추가하여 더 높은 시간 프레임의 트렌드 방향이 현재 거래 방향과 일치하는 경우에만 거래를 수행하는 것이 좋습니다. 이것은 역동적인 거래를 줄이고 승률을 높일 수 있습니다.
동적 변수는 스스로 적응합니다.: 전략은 시장의 변동률과 트렌드 강도에 따라 자동으로 EMA 길이를 조정하는 적응 변수 조정 메커니즘을 통합 할 수 있습니다. 이 전략은 다른 시장 단계에 더 잘 적응 할 수 있습니다.
기계학습 모델을 통합합니다.: 진입 시기를 최적화하고 범위를 돌파하는 방향을 예측하기 위해 기계 학습 모델을 도입하면 전략 성능을 크게 향상시킬 수 있습니다. 예를 들어, 분류 알고리즘을 사용하여 범위를 돌파하는 것을 예측하거나, 회귀 모델을 사용하여 돌파 후의 가격 목표를 예측합니다.
변동율 필터를 개선: 현재 변동율 필터는 간단한 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}}")