적응형 정지 트레일링 전략


생성 날짜: 2023-10-08 15:06:28 마지막으로 수정됨: 2023-10-08 15:06:28
복사: 0 클릭수: 771
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 주로 적응적 인 스톱 메커니즘을 구현하며, 가격 변동에 따라 자동으로 스톱 위치를 조정하여 더 나은 스톱 효과를 달성 할 수 있습니다. 전략은 ATR 지표를 사용하여 합리적인 스톱 범위를 계산하고, EMA 평행선과 결합하여 거래 신호를 생성합니다. EMA 평행선을 돌파 할 때 포지션을 열고 더 많은 공백을 만들며, 동시에 적응적 인 스톱 알고리즘을 사용하여 스톱 위치를 추적합니다.

전략 원칙

  1. ATR 지수를 계산하여 ATR 값을 a의 변수로 nLoss 범위로 설정합니다.
  2. EMA 평균선을 계산한다.
  3. 가격이 EMA 평균선을 통과할 때 더 많이 하고, EMA 평균선을 통과할 때 더 적게 한다.
  4. 자율적 정지 알고리즘을 사용하여 정지 xATRTrailingStop를 자동으로 조정합니다. 규칙은 다음과 같습니다:
    • 가격이 상향으로 스톱로스를 돌파했을 때, 스톱로스는 nLoss을 빼고 가격으로 조정됩니다.
    • 가격이 하향으로 스톱로스를 돌파했을 때, 스톱로스는 가격에 스톱로스 범위를 더한 nLoss에 조정한다.
    • 다른 경우, 스톱 손실은 그대로 유지된다.
  5. 가격이 스톱로스를 터치할 때 매매가 멈춥니다.

우위 분석

  1. 자율적 인 손해 제도가 구현되어 시장의 변동 정도에 따라 자동으로 손해 제도를 조정하여 위험을 효과적으로 제어 할 수 있습니다.
  2. ATR 지수와 합리적 인 상쇄 범위의 계산을 결합하여 너무 크고 너무 작은 상쇄를 피하십시오.
  3. EMA를 사용하여 거래 신호를 생성하면 무의미한 거래를 줄이고 시장 소음을 필터링 할 수 있습니다.
  4. 전략은 간단하고 명확하며, 코드는 쉽게 이해할 수 있으며, 검사 및 최적화를 쉽게 할 수 있습니다.
  5. 입력 가능한 매개 변수는 다른 시장 환경에 맞게 조정됩니다.

위험과 개선

  1. EMA 평균선은 거래 신호를 생성하여 지연될 수 있으며, 입장이 너무 늦어질 수 있다. 다른 지표의 보조 판단을 사용하여 조기 입장을 고려할 수 있다.
  2. 포지션 보유 기간은 불확실하며, 단편적인 스톱로스 크기를 제어할 수 없습니다. 목표 수익 또는 최대 포지션 보유 기간을 설정하여 큰 손실을 피할 수 있습니다.
  3. 큰 트렌드 시장에서, 정지 손실은 너무 자주 유발 될 수 있습니다. 트렌드 상태에 따라 매개 변수를 조정하거나 필터 조건을 추가하는 것이 고려 될 수 있습니다.
  4. 다른 품종의 특성에 따라 ATR 주기, 스톱 로즈 곱 등과 같은 파라미터를 조정해야 하며, 맹목적으로 기본값을 사용하지 않아야 한다.

최적화 방향

  1. 트렌드를 판단하는 지표를 추가하고, 트렌드 방향에 맞춰서 거래하고, 역동적인 거래를 피하는 것을 고려할 수 있다.
  2. 변동율의 크기에 따라 중지 손실 배수를 조정할 수 있으며, 큰 변동에 있어서는 적절하게 중지 손실 범위를 느슨하게 할 수 있다.
  3. 최대 지분 기간을 설정할 수 있으며, 일정 시간을 넘으면 적극적으로 손실을 중지한다.
  4. 가격의 움직임에 따라 스텝스텝으로 스톱스트로프를 높이는 이동식 스톱스트로프를 추가할 수 있습니다.
  5. 주식별 특성에 따라 ATR 주기 파라미터를 사용자 정의할 수 있다.

요약하다

이 전략의 전체적인 아이디어는 명확하고 이해하기 쉽다. ATR 지표를 이용하여 자율적으로 손해를 줄 수 있는 범위를 설정하고, EMA와 협력하여 거래 신호를 생성하여 손실을 효과적으로 제어할 수 있다. 그러나 전략 자체는 수동적이며, 최적화 공간은 넓으며, 트렌드 판단을 포함하는 것을 고려할 수 있으며, 시장상황에 따라 조정 파라미터와 같은 방법으로 전략을 더 적극적으로 만들 수 있다.

전략 소스 코드
/*backtest
start: 2023-09-07 00:00:00
end: 2023-10-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay = true)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 

// Inputs
a = input(1,     title = "Key Vaule. 'This changes the sensitivity'")
c = input(10,    title = "ATR Period")
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 = true
 
////////////////////////////////////////////////////////////////////////////////


xATR  = atr(c)
nLoss = a * xATR

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

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

ema   = ema(src,1)
above = crossover(ema, xATRTrailingStop)
below = crossover(xATRTrailingStop, ema)

buy  = src > xATRTrailingStop and above 
sell = src < xATRTrailingStop and below

barbuy  = src > xATRTrailingStop 
barsell = src < xATRTrailingStop 

plotshape(buy,  title = "Buy",  text = 'Buy',  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny)
plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, transp = 0, size = size.tiny)

barcolor(barbuy  ? color.green : na)
barcolor(barsell ? color.red   : na)

strategy.entry("long",   true, when = buy  and time_cond)
strategy.entry("short", false, when = sell and time_cond)