ATR 더블 트레일링 스톱을 기반으로 한 다이나믹 스톱프로핏 및 스톱로스 전략


생성 날짜: 2024-03-22 13:52:59 마지막으로 수정됨: 2024-03-22 13:52:59
복사: 1 클릭수: 616
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

ATR 더블 트레일링 스톱을 기반으로 한 다이나믹 스톱프로핏 및 스톱로스 전략

개요

이 전략은 두 개의 다른 주기의 ATR (Average True Range) 지표를 사용하여 두 개의 동적 트래킹 스톱 라인을 구축하고, 가격이 스톱 라인을 돌파 할 때 거래 신호를 발생시킨다. 동적 스톱 스톱을 실현하기 위해 스톱 라인 엔티티의 길이를 동적으로 사용하여 스톱 가격을 설정한다. 전략은 또한 EMA 지표를 결합하여 추세를 판단하는 것을 보조한다.

전략 원칙

  1. 두 개의 다른 주기 (기본 10과 20) 의 ATR 지표값을 계산하고 각각의 민감도 계수 (기본 1과 2) 를 곱하면 두 개의 스톱 라이트가 나옵니다.
  2. 두 개의 스톱 라인 위 또는 아래의 위치와 파격 상황에 따라 다중 또는 공중 신호를 생성한다.
  3. 정지 가격은 현재의 정지선 개체 길이의 1.65배 ((조정가능) 에 따라 동적으로 계산된다.
  4. 포지션 개시 후, 가격이 스톱 가격에 도달하면, 평점 포지션은 수익을 얻었다.
  5. EMA와 같은 지표를 사용하여 현재 추세를 판단하여 진입을위한 참고 자료를 제공합니다.

이 전략은 ATR 지표의 특성을 활용하여 이중 동적 스톱을 구축하여 다른 시장의 변동률에 더 잘 적응할 수 있으며 시장 변동에도 빠르게 대응할 수 있다. 동적 스톱의 설정은 전략이 트렌드 상황에서 더 많은 이익을 얻을 수 있게 한다. 종합적으로 볼 때, 이 전략은 트렌드 시장에서 더 잘 작동하지만, 흔들리는 시장에서 더 많은 손실이 발생할 수 있다.

우위 분석

  1. 이중 동적 중지 라인은 다양한 시장 변동률에 적응할 수 있으며, 유연성이 높다.
  2. 스톱 리치 가격은 현재 리치 엔티티 길이의 동적 계산에 따라 트렌드 상황에서 더 많은 수익을 얻을 수 있습니다.
  3. EMA와 같은 지표가 동향을 판단하는데 도움을 주며, 진입을 위한 참고 자료를 제공함으로써 전략의 신뢰성을 강화한다.
  4. 코드 논리는 명확하고, 읽기 쉽고, 이해하기 쉽고, 최적화하기 쉽습니다.

위험 분석

  1. 불안정한 시장에서, 빈번한 거래는 높은 수수료 비용으로 인해 수익에 영향을 미칠 수 있습니다.
  2. 스톱 라인 파라미터와 스톱 배수의 설정은 다른 시장과 제품 특성에 따라 최적화되어야 하며, 부적절한 파라미터는 전략의 부적절한 성능을 초래할 수 있다.
  3. 전략은 주로 가격의 파동적 정지선 (Dynamic Stop Lines) 을 깨는 신호에 의존하며, 일부 큰 변동의 가짜 돌파 시나리오에서는 잘못된 신호를 일으킬 수 있다.

최적화 방향

  1. 흔들리는 시장의 경우, RSI, MACD 등과 같은 거래 신호를 필터링하기 위해 더 많은 지표 또는 조건을 도입하는 것을 고려할 수 있습니다.
  2. 다른 제품과 시장에 대해, 역사 회수 및 변수 최적화를 통해 최적의 스톱 라인 변수와 스톱 배수를 찾을 수 있다.
  3. 포지션 관리 및 위험 제어 모듈을 도입하여 시장의 변동성과 계정 위험 동력에 따라 포지션 크기를 조정하는 것이 고려될 수 있습니다.
  4. 트렌드를 판단하는 지표들을 추가하여 신호의 신뢰성과 정확성을 향상시킵니다.

요약하다

이 전략은 이중 동적 스톱 라인 및 동적 스톱을 설계하여 다양한 시장 환경에 더 잘 적응할 수 있으며 추세 상황에서 우수한 성능을 발휘합니다. 그러나 불안정한 시장에서는 빈번한 거래 및 손해배상 문제가 발생할 수 있습니다. 따라서 이 전략은 추세 시장에서 사용하기에 더 적합하며 제품 특성과 시장 환경을 결합하여 매개 변수를 최적화하고 조정해야합니다. 또한, 전략의 안정성과 수익성을 높이기 위해 더 많은 필터링 조건, 위치 관리 및 위험과 같은 제어 모듈을 도입하는 것과 같은 추가적인 최적화의 여지가 있습니다.

전략 소스 코드
/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay=true)

// Inputs
a1 = input(1, title="Key Value 1 ('This changes the sensitivity')")
c1 = input(10, title="ATR Period 1")
a2 = input(2, title="Key Value 2 ('This changes the sensitivity')")
c2 = input(20, title="ATR Period 2")
h = input(false, title="Signals from Heikin Ashi Candles")

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2019, title="From Year", minval=1970)
 
// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////

xATR1 = atr(c1)
nLoss1 = a1 * xATR1
xATR2 = atr(c2)
nLoss2 = a2 * xATR2

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=false) : close

xATRTrailingStop1 = 0.0
xATRTrailingStop1 := iff(src > nz(xATRTrailingStop1[1], 0) and src[1] > nz(xATRTrailingStop1[1], 0), max(nz(xATRTrailingStop1[1]), src - nLoss1),
   iff(src < nz(xATRTrailingStop1[1], 0) and src[1] < nz(xATRTrailingStop1[1], 0), min(nz(xATRTrailingStop1[1]), src + nLoss1), 
   iff(src > nz(xATRTrailingStop1[1], 0), src - nLoss1, src + nLoss1)))

xATRTrailingStop2 = 0.0
xATRTrailingStop2 := iff(src > nz(xATRTrailingStop2[1], 0) and src[1] > nz(xATRTrailingStop2[1], 0), max(nz(xATRTrailingStop2[1]), src - nLoss2),
   iff(src < nz(xATRTrailingStop2[1], 0) and src[1] < nz(xATRTrailingStop2[1], 0), min(nz(xATRTrailingStop2[1]), src + nLoss2), 
   iff(src > nz(xATRTrailingStop2[1], 0), src - nLoss2, src + nLoss2)))
 
pos = 0   
pos := iff(src[1] < nz(xATRTrailingStop1[1], 0) and src > nz(xATRTrailingStop1[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop1[1], 0) and src < nz(xATRTrailingStop1[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema1 = ema(src, 1)
above1 = crossover(ema1, xATRTrailingStop1)
below1 = crossover(xATRTrailingStop1, ema1)
buy1 = src > xATRTrailingStop1 and above1 
sell1 = src < xATRTrailingStop1 and below1
barbuy1 = src > xATRTrailingStop1 
barsell1 = src < xATRTrailingStop1 

ema2 = ema(src, 1)
above2 = crossover(ema2, xATRTrailingStop2)
below2 = crossover(xATRTrailingStop2, ema2)
buy2 = src > xATRTrailingStop2 and above2 
sell2 = src < xATRTrailingStop2 and below2
barbuy2 = src > xATRTrailingStop2 
barsell2 = src < xATRTrailingStop2 

plotshape(buy1,  title="Buy 1",  text='Buy 1',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell1, title="Sell 1", text='Sell 1', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)
plotshape(buy2,  title="Buy 2",  text='Buy 2',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell2, title="Sell 2", text='Sell 2', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)

barcolor(barbuy1  ? color.green : na)
barcolor(barsell1 ? color.red   : na)
barcolor(barbuy2  ? color.green : na)
barcolor(barsell2 ? color.red   : na)

// Calculate SL and TP levels
candle_size = abs(open - close)
tp_level = close + candle_size *65

// Close long positions if TP is hit
strategy.exit("TP Long", "long", limit=tp_level)

// Close short positions if TP is hit
strategy.exit("TP Short", "short", limit=tp_level)

// Enter long position
strategy.entry("long", strategy.long, when=(buy1 or buy2) and time_cond)

// Enter short position
strategy.entry("short", strategy.short, when=(sell1 or sell2) and time_cond)

//adding ema with width
// Calculate EMA and SMA
ema5 = ema(close, 5)
ema200 = ema(close, 200)
ema21 = ema(close, 21)
ema50 = ema(close, 50)
sma50 = sma(close, 50)

// Plot EMA and SMA with width
plot(ema5, color=color.rgb(130, 235, 139), title="EMA 5", linewidth=1)
plot(ema200, color=color.rgb(243, 246, 249), title="EMA 200", linewidth=2)
plot(ema21, color=color.blue, title="21", linewidth=1)
plot(ema50, color=color.rgb(255, 64, 0), title="EMA 50", linewidth=2)
//plot(sma50, color=color.purple, title="SMA 20", linewidth=2)