리소스 로딩... 로딩...

이중 EMA 풀백 거래 시스템 ATR 기반 동적 스톱 로스 최적화

저자:차오장, 날짜: 2025-01-10 15:19:40
태그:EMAATRSLTPMA

 Dual EMA Pullback Trading System with ATR-Based Dynamic Stop-Loss Optimization

전반적인 설명

이 전략은 이중 EMA와 ATR 동적 스톱 로스에 기반한 트렌드-추천 거래 시스템이다. 38주기 및 62주기 기하급수적 이동 평균 (EMA) 을 사용하여 시장 트렌드를 식별하고, 빠른 EMA와 가격 크로스오버를 통해 엔트리 신호를 결정하고, 동적 스톱 로스 관리를 위해 ATR 지표를 통합한다. 이 전략은 공격적이고 보수적인 거래 모드를 모두 제공하여 다른 위험 선호도를 가진 거래자를 수용한다.

전략 원칙

핵심 논리는 다음과 같은 핵심 요소에 기반합니다. 1. 트렌드 결정: 시장 트렌드는 38주기 및 62주기 EMA의 상대적 위치를 통해 확인됩니다. 빠른 EMA가 느린 EMA보다 높을 때 상승 추세가 확인됩니다. 2. 진입 신호: 상승 추세 동안 가격이 빠른 EMA를 넘을 때 긴 신호가 생성됩니다. 하락 추세 동안 가격이 빠른 EMA를 넘을 때 짧은 신호가 발생합니다. 3. 리스크 관리: ATR 기반의 동적 스톱 로스 시스템을 사용하여 가격의 유리한 움직임에 따라 스톱 레벨을 조정하여 수익을 보호하면서 조기 출출을 피합니다. 고정 비율의 스톱 로스 및 수익 목표도 구현됩니다.

전략적 장점

  1. 우수한 트렌드 추적: 이중 EMA 시스템은 다양한 시장에서 빈번한 거래를 피하면서 중장기 트렌드를 효과적으로 포착합니다.
  2. 포괄적 리스크 제어: 수익을 보호하면서 최대 리스크를 제한하기 위해 고정 및 동적 스톱을 결합합니다.
  3. 높은 적응력: 공격적이고 보수적인 거래 방식을 제공하며 시장 조건과 개인적인 위험 선호도에 적응 할 수 있습니다.
  4. 명확한 시각적 피드백: 시장 조건과 거래 신호는 색상 바와 화살표를 통해 직관적으로 표시됩니다.

전략 위험

  1. 트렌드 역전 위험: 트렌드 역전 지점에서 연속적으로 중단될 수 있습니다. 거래는 명확한 트렌드 기간으로 제한되어야 합니다.
  2. 미끄러짐 위험: 높은 변동성 동안 실제 실행 가격은 신호 가격과 크게 다를 수 있습니다. 중지 손실 범위는 적절히 넓혀야합니다.
  3. 매개 변수 민감성: 전략 성능은 EMA 기간과 ATR 곱셈자 선택에 의해 크게 영향을 받는다. 다른 시장 조건에 최적화가 필요합니다.

전략 최적화 방향

  1. 트렌드 강도 필터를 추가하십시오. ADX와 같은 트렌드 강도 지표를 포함하여 명확한 트렌드 중만 입력하십시오.
  2. 스톱 로스 메커니즘을 최적화: 더 적응적인 스톱을 위해 변동성에 따라 ATR 곱셈을 동적으로 조정합니다.
  3. 부피 확인을 포함합니다. 입력 지점에서 부피 분석을 통합하여 신호 신뢰성을 향상시킵니다.
  4. 시장 환경 분류: 다른 시장 조건 (트렌드/레인지) 에 따라 전략 매개 변수를 동적으로 조정합니다.

요약

이 전략은 고전적인 이중 EMA 시스템과 현대적인 동적 스톱-로스 기술을 결합하여 완전한 트렌드-추천 거래 시스템을 구축합니다. 이 전략의 장점은 포괄적인 위험 통제와 높은 적응력입니다. 그러나 거래자는 여전히 특정 시장 조건에 따라 매개 변수를 최적화하고 위험을 관리해야합니다. 제안된 최적화 방향을 통해 전략의 안정성과 수익성이 더욱 향상 될 수 있습니다.


/*backtest
start: 2024-12-10 00:00:00
end: 2025-01-08 08:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © aalapsharma

//@version=5
strategy(title="CM_SlingShotSystem - Strategy", shorttitle="SlingShotSys_Enhanced_v5", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=1)

// Inputs
sae = input.bool(true, "Show Aggressive Entry Bars? (Highlight only)")
sce = input.bool(true, "Show Conservative Entry Bars? (Highlight only)")
st = input.bool(true, "Show Trend Arrows (Top/Bottom)?")
def = input.bool(false, "(Unused) Only Choose 1 - Either Conservative Entry Arrows or 'B'-'S' Letters")
pa = input.bool(true, "Show Conservative Entry Arrows?")
sl = input.bool(false, "Show 'B'-'S' Letters?")
useStopLoss = input.bool(true, "Use Stop-Loss?")
stopLossPerc = input.float(5.0, "Stop-Loss (%)", step=0.1)
useTakeProfit = input.bool(true, "Use Take-Profit?")
takeProfitPerc = input.float(20.0, "Take-Profit (%)", step=0.1)
useTrailingStop = input.bool(false, "Use ATR Trailing Stop?")
atrLength = input.int(14, "ATR Length", minval=1)
atrMult = input.float(2.0, "ATR Multiple for Trailing Stop", step=0.1)

// Calculations
emaSlow = ta.ema(close, 62)
emaFast = ta.ema(close, 38)
upTrend = emaFast >= emaSlow
downTrend = emaFast < emaSlow
pullbackUpT() => emaFast > emaSlow and close < emaFast
pullbackDnT() => emaFast < emaSlow and close > emaFast
entryUpT() => emaFast > emaSlow and close[1] < emaFast and close > emaFast
entryDnT() => emaFast < emaSlow and close[1] > emaFast and close < emaFast
entryUpTrend = entryUpT() ? 1 : 0
entryDnTrend = entryDnT() ? 1 : 0
atrValue = ta.atr(atrLength)

// Trailing Stop Logic (Improved)
var float trailStopLong = na
var float trailStopShort = na

if (strategy.position_size > 0)
    trailStopLong := math.max(close - (atrValue * atrMult), nz(trailStopLong[1], close))
    trailStopLong := strategy.position_avg_price > trailStopLong ? strategy.position_avg_price : trailStopLong
else
    trailStopLong := na

if (strategy.position_size < 0)
    trailStopShort := math.min(close + (atrValue * atrMult), nz(trailStopShort[1], close))
    trailStopShort := strategy.position_avg_price < trailStopShort ? strategy.position_avg_price : trailStopShort
else
    trailStopShort := na

// Plotting
col = emaFast > emaSlow ? color.lime : emaFast < emaSlow ? color.red : color.yellow
p1 = plot(emaSlow, "Slow MA (62)", linewidth=4, color=col)
p2 = plot(emaFast, "Fast MA (38)", linewidth=2, color=col)
fill(p1, p2, color=color.silver, transp=50)
barcolor((sae and pullbackUpT()) ? color.yellow : (sae and pullbackDnT()) ? color.yellow : na)
barcolor((sce and entryUpT()) ? color.aqua : (sce and entryDnT()) ? color.aqua : na)
plotshape(st and upTrend, title="Trend UP", style=shape.triangleup, location=location.bottom, color=color.lime)
plotshape(st and downTrend, title="Trend DOWN", style=shape.triangledown, location=location.top, color=color.red)
plotarrow((pa and entryUpTrend == 1) ? 1 : na, title="Up Entry Arrow", colorup=color.lime, maxheight=30, minheight=30)
plotarrow((pa and entryDnTrend == 1) ? -1 : na, title="Down Entry Arrow", colordown=color.red, maxheight=30, minheight=30)
plotchar(sl and entryUpTrend ? (low - ta.tr) : na, title="Buy Entry (Letter)", char='B', location=location.absolute, color=color.lime)
plotchar(sl and entryDnTrend ? (high + ta.tr) : na, title="Short Entry (Letter)", char='S', location=location.absolute, color=color.red)
plot(useTrailingStop and strategy.position_size > 0 ? trailStopLong : na, "Trailing Stop Long", color=color.green, style=plot.style_linebr)
plot(useTrailingStop and strategy.position_size < 0 ? trailStopShort : na, "Trailing Stop Short", color=color.red, style=plot.style_linebr)

// Function to calculate stop and limit prices
f_calcStops(_entryPrice, _isLong) =>
    _stopLoss = _isLong ? _entryPrice * (1.0 - stopLossPerc / 100.0) : _entryPrice * (1.0 + stopLossPerc / 100.0)
    _takeProfit = _isLong ? _entryPrice * (1.0 + takeProfitPerc / 100.0) : _entryPrice * (1.0 - takeProfitPerc / 100.0)
    [_stopLoss, _takeProfit]

// Entry and Exit Logic (Simplified using strategy.close)
if (entryUpT() and strategy.position_size == 0)
    strategy.entry("Long", strategy.long)

if (entryDnT() and strategy.position_size == 0)
    strategy.entry("Short", strategy.short)

// Exit conditions based on Stop-loss and Take-profit
[slPrice, tpPrice] = f_calcStops(strategy.position_avg_price, strategy.position_size > 0)

if (strategy.position_size > 0)
    strategy.exit("Exit Long", "Long", stop=slPrice, limit=tpPrice, trail_price = trailStopLong, trail_offset = atrValue * atrMult)

if (strategy.position_size < 0)
    strategy.exit("Exit Short", "Short", stop=slPrice, limit=tpPrice, trail_price = trailStopShort, trail_offset = atrValue * atrMult)

// Close opposite position on new entry signal
if (entryUpT() and strategy.position_size < 0)
    strategy.close("Short", comment="Close Short on Long Signal")

if (entryDnT() and strategy.position_size > 0)
    strategy.close("Long", comment="Close Long on Short Signal")

관련

더 많은