적응력 있는 후속 정지 전략

저자:차오장, 날짜: 2023-10-08 15:06:28
태그:

전반적인 설명

이 전략은 주로 가격 변동에 따라 자동으로 스톱 로스 포지션을 조정하여 더 나은 스톱 로스 효과를 달성하는 적응 스톱 로스 메커니즘을 구현합니다. 이 전략은 ATR 지표를 사용하여 합리적인 스톱 로스 범위를 계산하고 EMA 라인과 결합하여 거래 신호를 생성합니다. 가격이 EMA 라인을 통과 할 때 긴 또는 짧은 포지션을 열고, 적응 스톱 로스 알고리즘을 사용하여 스톱 로스를 추적합니다.

전략 논리

  1. ATR 지표를 계산하고 ATR 값을 매개 변수 a로 곱하여 정지 손실 범위 nLoss로 설정합니다.
  2. EMA 라인을 계산하세요.
  3. 가격이 EMA 라인을 넘어서면 롱, EMA 라인을 넘어서면 쇼트.
  4. 적응식 스톱 손실 알고리즘을 사용하여 다음과 같은 규칙을 사용하여 자동으로 스톱 손실 위치를 조정합니다.
    • 가격이 스톱 로스 포지션을 넘어서면, 스톱 로스를 가격 마이너스 스톱 로스 범위 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)

더 많은