동적 ATR 트레일링 스톱 로스 전략


생성 날짜: 2023-12-11 14:24:18 마지막으로 수정됨: 2023-12-11 14:24:18
복사: 0 클릭수: 755
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

동적 ATR 트레일링 스톱 로스 전략

개요

이 전략은 ATR 지표에 기반한 설계된 다이내믹 트래킹 스톱 메커니즘으로, 손실을 보장하면서도, 실시간으로 스톱 위치를 조정하여 더 큰 수익을 얻을 수 있다.

전략 원칙

전략은 빠른 ATR 사이클 5과 느린 ATR 사이클 10을 사용하여 쌍층 동적 추적 스톱을 구축한다. 가격이 유리한 방향으로 움직일 때, 빠른 계층은 처음으로 추적을 시작하여 중지 위치를 강화합니다. 가격이 단기 회귀 할 때, 느린 계층의 중지 위치가 조기 중지되는 것을 피할 수 있습니다. 동시에, 빠른 계층 사이의 교차는 거래 신호로 사용됩니다.

구체적으로, 빠른 계층의 정지 거리는 0.5배의 5주기 ATR이고, 느린 계층의 정지 거리는 3배의 10주기 ATR이다. 빠른 계층이 위로 침투하면 구매 신호가 발생하고, 빠른 계층이 아래로 침투하면 판매 신호가 발생한다. 정지 라인은 실시간으로 업데이트되며, 가격 곡선 아래에 그려진다.

우위 분석

이 전략의 가장 큰 장점은 스톱 포지션을 동적으로 조정할 수 있다는 점이며, 스톱 손실을 보장하는 전제 하에, 더 많은 수익을 극대화하기 위해 노력한다. 고정된 스톱 거리와 비교하여, 동적 ATR 스톱 라인은 시장의 변동 정도에 따라 조정할 수 있으며, 스톱 손실이 활성화되는 확률을 감소시킨다.

또한, 이중 계층 ATR 디자인은 손해 차단의 민감성을 균형을 잡을 수 있다. 빠른 계층은 신속하게 반응하고, 느린 계층은 단기 잡음을 필터링하여 조기 손해 차단을 방지할 수 있다.

위험 분석

이 전략의 주요 위험은 손실 거리를 설정하는 것이 합리적인지 여부에 달려 있습니다. ATR 배수가 너무 크면 손실 폭이 가격 운행을 따라가지 못할 것입니다. ATR 배수가 너무 작으면 단기 잡음으로 손상 될 수 있습니다. 따라서 다른 품종의 특성에 따라 변수를 조정해야합니다.

또한, 평형상황에서 ATR 값이 작고, 스톱라인에 가깝고, 자주 스톱되는 경향이 있다. 따라서 이 전략은 약간의 변동성이 있는 품종에 더 적합하다.

최적화 방향

다른 ATR 주기 파라미터 조합을 시도하여 최적의 균형을 찾을 수 있다. 또한 다른 지표와 함께 사용이 고려될 수 있다. 예를 들어, 트렌드 지표는 시장 단계를 판단하여 ATR 배수의 크기를 동적으로 조정할 수 있다.

또한 ATR 지표를 대체하는 가능성을 연구할 수 있다. ATR을 DKVOL, HRANGE 또는 ATR 비율과 같은 지표 값으로 바꾸면 더 나은 손실 효과를 얻을 수 있다.

요약하다

이 전략은 ATR 지표에 기반한 2층의 동적 추적 메커니즘을 설계하여 더 큰 수익을 추구할 수 있고, 과도한 상실을 피할 수 있다. 상실을 요구하는 사용자가 더 높다. 이 전략은 시장과 품종 특성에 따라 파라미터를 유연하게 조정하여 최적의 상실을 달성할 수 있다.

전략 소스 코드
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("ATR Trailing Stop Strategy by ceyhun", overlay=true)

/////////notes////////////////////////////////////////
// This is based on the ATR trailing stop indicator //
// width addition of two levels of stops and        //
// different interpretation.                        //
// This is a fast-reacting system and is better     //
// suited for higher volatility markets             //
//////////////////////////////////////////////////////

SC = input(close, "Source", input.source)

// Fast Trail //
AP1 = input(5, "Fast ATR period", input.integer)  // ATR Period
AF1 = input(0.5, "Fast ATR multiplier", input.float)  // ATR Factor
SL1 = AF1 * atr(AP1)  // Stop Loss
Trail1 = 0.0
Trail1 := iff(SC > nz(Trail1[1], 0) and SC[1] > nz(Trail1[1], 0), max(nz(Trail1[1], 0), SC - SL1), iff(SC < nz(Trail1[1], 0) and SC[1] < nz(Trail1[1], 0), min(nz(Trail1[1], 0), SC + SL1), iff(SC > nz(Trail1[1], 0), SC - SL1, SC + SL1)))

// Slow Trail //
AP2 = input(10, "Slow ATR period", input.integer)  // ATR Period
AF2 = input(3, "Slow ATR multiplier", input.float)  // ATR Factor
SL2 = AF2 * atr(AP2)  // Stop Loss
Trail2 = 0.0
Trail2 := iff(SC > nz(Trail2[1], 0) and SC[1] > nz(Trail2[1], 0), max(nz(Trail2[1], 0), SC - SL2), iff(SC < nz(Trail2[1], 0) and SC[1] < nz(Trail2[1], 0), min(nz(Trail2[1], 0), SC + SL2), iff(SC > nz(Trail2[1], 0), SC - SL2, SC + SL2)))

// Bar color for trade signal //
Green = Trail1 > Trail2 and close > Trail2 and low > Trail2
Blue = Trail1 > Trail2 and close > Trail2 and low < Trail2
Red = Trail2 > Trail1 and close < Trail2 and high < Trail2
Yellow = Trail2 > Trail1 and close < Trail2 and high > Trail2

// Signals //
Bull = barssince(Green) < barssince(Red)

Buy = crossover(Trail1, Trail2)
Sell = crossunder(Trail1, Trail2)

TS1 = plot(Trail1, "Fast Trail", style=plot.style_line, color=Trail1 > Trail2 ? color.blue : color.yellow, linewidth=2, display=display.none)
TS2 = plot(Trail2, "Slow Trail", style=plot.style_line, color=Trail1 > Trail2 ? color.green : color.red, linewidth=2)
fill(TS1, TS2, Bull ? color.new(color.green, 90) : color.new(color.red, 90))

plotcolor = input(true, "Paint color on chart", input.bool)

bcl = iff(plotcolor == 1, Blue ? color.blue : Green ? color.lime : Yellow ? color.yellow : Red ? color.red : color.white, na)
barcolor(bcl)

if Buy
    strategy.entry("Buy", strategy.long, comment="Buy")

if Sell
    strategy.close("Buy")