이중 ATR 트레일링 스톱에 기반한 동적 스톱 손실 및 영업 전략

저자:차오장, 2024-03-22 13:52:59
태그:

img

전반적인 설명

이 전략은 다른 기간을 가진 두 개의 평균 진정한 범위 (ATR) 인디케이터를 사용하여 이중 동적 추적 스톱-손실 라인을 구축하여 가격이 스톱-손실 라인을 통과 할 때 거래 신호를 생성합니다. 또한 동적 스톱-손실 및 스톱-손실을 달성하기 위해 현재 촛불 몸 길이를 기반으로 수익을 취하는 수준을 동적으로 설정합니다. 전략은 또한 트렌드를 판단하는 데 도움이되는 EMA 인디케이터를 통합합니다.

전략 원칙

  1. ATR 지표 값은 두 개의 다른 기간 (디폴트 10 및 20) 에 대해 계산하고, 각각의 민감도 계수 (디폴트 1 및 2) 로 곱하여 두 개의 스톱 로스 너비를 얻습니다.
  2. 두 개의 스톱 로스 라인 이상 또는 아래의 가격 위치와 브레이크 아웃 상황을 기반으로 긴 또는 짧은 신호를 생성합니다.
  3. 이윤수준은 현재 촛불 몸집 길이의 1.65배 (조정 가능) 를 기준으로 동적으로 계산됩니다.
  4. 포지션을 열고 나면, 만약 가격이 영업이익 수준에 도달한다면, 포지션은 영업이익을 얻기 위해 폐쇄됩니다.
  5. EMA와 같은 지표를 사용하여 현재 추세를 판단하고 진입에 대한 참조를 제공합니다.

이 전략은 트렌딩 시장에서 더 많은 수익을 창출 할 수 있습니다. 전반적으로, 전략은 트렌딩 시장에서 잘 수행하지만 범위 제한 시장에서 빈번한 이익과 손실 상쇄를 경험할 수 있습니다.

이점 분석

  1. 이중 동적 스톱 로스 라인은 다른 시장 변동성에 적응할 수 있으며 높은 유연성을 가지고 있습니다.
  2. 이윤 취득 수준은 현재 촛불 몸의 길이를 기반으로 동적으로 계산되며 트렌딩 시장에서 더 많은 이윤을 얻을 수 있습니다.
  3. 트렌드 판단에 도움이 되는 EMA 및 다른 지표의 사용은 진입에 대한 기준을 제공하며 전략의 신뢰성을 향상시킵니다.
  4. 코드 로직은 명확하고 읽기 쉬워서 이해하기 쉽고 최적화 가능합니다.

위험 분석

  1. 범주형 시장에서 빈번한 거래는 높은 거래 비용을 초래하고 수익성에 영향을 줄 수 있습니다.
  2. 스톱 로스 라인 매개 변수와 이윤 인수 매개 변수의 설정은 다른 시장 및 제품 특성에 따라 최적화되어야 합니다. 부적절한 매개 변수는 전략 성과가 좋지 않을 수 있습니다.
  3. 이 전략은 주로 신호를 생성하기 위해 동적 스톱 로스 라인의 가격 브레이크에 의존하며, 이는 일부 큰 변동 가짜 브레이크에서 잘못된 신호를 생성 할 수 있습니다.

최적화 방향

  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)

더 많은