트래일링 스톱 손실 역전 전략

저자:차오장, 날짜: 2023-12-01 13:41:41
태그:

img

전반적인 설명

이것은 매우 간단한 전략입니다. 그것은 단지 하나의 트레일링 스톱 로스로 구성됩니다. 스톱 로스가 트리거되면 포지션은 역전되고 새로운 포지션에 트레일링 스톱 로스가 설정됩니다.

전략 논리

전략은 세 가지 스톱 손실 유형 중 하나에 기반을두고 있습니다: 퍼센트 스톱 손실, ATR 스톱 손실, 절대 스톱 손실. 스톱 손실이 유발되면 포지션은 역전되고 새로운 포지션에 대한 후속 스톱 손실이 설정됩니다.

특히, 전략은 먼저 선택된 스톱 로스 유형에 따라 스톱 로스 값을 계산합니다. 그 다음 엔트리 신호를 확인하고, 이전 스톱 로스 가격보다 높을 때 길고, 이전 스톱 로스 가격보다 낮을 때 짧습니다. 입력 후, 가격 변화를 추적하기 위해 스톱 로스 가격을 계속 업데이트합니다. 긴 스톱 로스 가격이 낮습니다 마이너스 스톱 로스 값, 짧은 스톱 로스 가격은 높습니다 마이너스 스톱 로스 값.

이점 분석

이 전략의 가장 큰 장점은 진입 및 출구 포인트 선택을 고려할 필요 없이 하나의 스톱 손실만을 추적해야 하는 단순성입니다. 스톱 손실 값의 유연한 설정은 또한 그 응용 범위를 넓혀줍니다.

고정 스톱 손실과 비교하여, 트레일링 스톱 손실은 더 큰 수익을 올릴 수 있으며 또한 스톱 손실이 발생할 확률을 줄일 수 있습니다. 스톱 손실이 발생 할 때마다 포지션을 반전하면 가격 반전 기회를 잡을 수 있습니다.

위험 분석

이 전략의 주요 위험은 잘못된 스톱 로스 값 설정에서 발생할 수 있습니다. 너무 큰 스톱 로스 값은 손실을 확대시킬 수 있으며 너무 작은 값은 빈번한 스톱 로스 트리거를 일으킬 수 있습니다. 이것은 시장 조건에 따라 적응적 최적화를 필요로합니다.

또 다른 위험은 포지션을 반전할 때 스톱 로스 트리거를 한 후 방향 판단이 정확하지 않아 가격 반전 기회를 놓치고 손실을 증가시키는 것입니다. 이것은 최적의 반전 타이밍을 결정하기 위해 트렌드 및 지원 / 저항 분석을 결합해야합니다.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 트렌드 판단을 추가하여 트렌드 상거래를 피합니다.
  2. 더 동적으로 시장을 추적 할 수 있도록 중지 손실 가치 계산을 최적화하십시오.
  3. 더 높은 확률의 반전 신호에 대한 브레이크아웃 검증을 높일 것
  4. 가장 좋은 환전 시기를 찾기 위해 변동성 측정치를 포함합니다.

결론

이 전략은 간단한 트레일링 스톱 로스 메커니즘을 통해 수익을 창출하며 초보자들도 쉽게 이해할 수 있습니다. 전통적인 스톱 로스 전략과 비교하면 추가 이득을 얻기 위해 포스트 스톱 로스 트리거 반전 포지션을 추가합니다. 지속적인 테스트와 최적화로 매우 실용적인 양적 프로그램이 될 수 있습니다.


/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Trailing SL Strategy [QuantNomad]", shorttitle = "TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50)

////////////
// Inputs //

sl_type    = input("%", options = ["%", "ATR", "Absolute"])

sl_perc    = input(4,     title = "% SL",        type = input.float)
atr_length = input(10,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)
sl_absol   = input(10,    title = "Absolute SL", type = input.float)

// 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 = 2016, 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

//////////////////
// CALCULATIONS //

// SL values
sl_val = sl_type == "ATR"      ? atr_mult * atr(atr_length) : 
         sl_type == "Absolute" ? sl_absol : 
         close * sl_perc / 100
         
// Init Variables
pos         = 0
trailing_sl = 0.0

// Signals
long_signal  = nz(pos[1]) !=  1 and high > nz(trailing_sl[1])
short_signal = nz(pos[1]) != -1 and low  < nz(trailing_sl[1]) 

// Calculate SL
trailing_sl := short_signal     ? high + sl_val : 
               long_signal      ? low  - sl_val : 
               nz(pos[1]) ==  1 ? max(low  - sl_val, nz(trailing_sl[1])) :  
               nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : 
               nz(trailing_sl[1])
               
// Position var               
pos := long_signal  ? 1 : short_signal ? -1 : nz(pos[1]) 

//////////////
// PLOTINGS //

plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)

//////////////
// STRATEGY //

if (time_cond and pos != 1)
    strategy.entry("long",  true, stop = trailing_sl)
  
if (time_cond and pos != -1) 
    strategy.entry("short", false, stop = trailing_sl)

더 많은