추세 추종 평균 진범위 손절매 전략

ATR TS
생성 날짜: 2024-05-24 18:12:01 마지막으로 수정됨: 2024-05-24 18:12:01
복사: 8 클릭수: 521
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

추세 추종 평균 진범위 손절매 전략

개요

이 전략은 평균 실제 파장 (ATR) 을 사용하여 스톱로스 (TS) 를 추적합니다. 동적으로 스톱로스 위치를 조정하여 트렌드를 추적합니다. 가격이 유리한 방향으로 움직일 때, 스톱로스 위치도 그에 따라 조정되어 얻은 이익을 잠금합니다. 가격이 불리한 방향으로 움직일 때, 스톱로스는 변하지 않으며, 가격이 스톱로스 가격에 도달하면 평평한 스톱로스가됩니다. 이 전략의 핵심은 스톱로스의 동적인 조정입니다.

전략 원칙

  1. ATR은 시장의 변동성을 반영하고 가격 변화의 평균을 측정합니다.
  2. ATR과 KeyValue의 변수를 기준으로 스톱 라인 nLoss을 계산한다. KeyValue는 사용자 지정된 곱이고, nLoss은 KeyValue와 ATR의 곱으로, 스톱 라인 nLoss은 ATR의 몇 배이다.
  3. 동적 추적 스톱 위치를 xATRTrailingStop.로 계산하십시오. 다중 상위 포지션을 보유할 때, “전 K 선의 최고 가격과 [폐쇄 가격-nLoss]의 큰 값”; 공백 포지션을 보유할 때, “전 K 선의 최저 가격과 [폐쇄 가격+nLoss]의 작은 값”으로 설정하십시오.
  4. 포지션 개시 신호를 생성한다. 종결 가격 위에 xATRTrailingStop를 넘으면 더 많이 한다. 종결 가격 아래에서 xATRTrailingStop를 넘으면 공백한다.

우위 분석

  1. 스톱 로즈는 가격 변동에 따라 동적으로 조정되며, 수익을 고정시키기도 하고, 추세에 따라 수익을 확대시키기도 한다.
  2. 스톱포지션은 ATR 계산에 기반하여 시장의 변동성을 객관적으로 반영할 수 있으며 주관적으로 설정된 고정 스톱포지션보다 더 유연하고 효과적입니다.
  3. KeyValue 변수를 통해 ATR을 확대하면 자신의 위험 선호도에 따라 적절한 중지 거리를 설정할 수 있습니다. 더 큰 KeyValue는 더 넓은 중지 공간을 가져오고 더 적은 중지 빈도를 가져옵니다.

위험 분석

  1. 트렌드형 전략은 흔들리는 시장에서 잘 작동하지 않으며, 일방적인 추세가 눈에 띄지 않을 때 자주 손실이 발생하여 급속한 자금 유출이 발생합니다.
  2. 진입 시기는 종결 가격과 동적 스톱 라인의 교차 신호에 의존하며, 충격적인 상황에서는 연속적으로 작은 스톱이 발생할 수 있다.
  3. 스톱로스 전략은 대가 공백이나 리도로 인한 격차 공백을 피할 수 없으며, 스톱로스 위치의 조정 속도는 가격 변화의 속도를 따라가지 못하여 실제 손실이 예상되는 통제 가능한 손실보다 훨씬 더 큰 결과를 초래합니다.

최적화 방향

  1. 전략에 따라 유행 판단 지표를 추가할 수 있다. 유행이 명확한 경우에만 진입하여, 흔들리는 시장에서 자주 거래하는 것을 피할 수 있다.
  2. 케일리 공식에 따라 포지션 보유, 고정 이득 수회 철회 차단 등을 도입하여 트렌드 말기 잠재적인 이익 회귀의 가능성을 줄일 수 있다.
  3. 폭파 구멍을 위해 최대 손실 제한을 설정할 수 있습니다. 고정 금액이나 고정 비율과 같은 제한이 달성되면 동적 중단 가격이 어디에 있든 즉시 중단됩니다.

요약하다

ATR 추적 스톱 전략은 가격 변동의 폭에 따라 스톱 위치를 동적으로 조정할 수 있으며, 트렌드 상황에서 좋은 효과를 얻을 수 있습니다. 그러나, 이 전략은 불안한 시장, 너무 자주 스톱 및 도약 틈을 피할 수 없는 위험을 감당할 수 없습니다. 위의 결함에 대해, 트렌드 판단, 스톱 전략, 최대 스톱 제한 등 측면에서 전략에 최적화 및 개선이 가능합니다. 이러한 조정으로 전략의 적응성과 수익성을 향상시킬 수 있습니다.

전략 소스 코드
/*backtest
start: 2024-04-01 00:00:00
end: 2024-04-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Long TAP", overlay=true)

// Constants
keyValueDefault = 3.0
keyValueStep = 0.5
atrPeriodDefault = 10

// Inputs
keyValue = input.float(keyValueDefault, title="Key Value")
atrPeriod = input.int(atrPeriodDefault, title="ATR Period")

// Calculations
xATR = ta.atr(atrPeriod)
nLoss = keyValue * xATR

// Trailing Stop Calculation
var float xATRTrailingStop = 0.0
xATRTrailingStop := ta.highest(math.max(nz(xATRTrailingStop[1], 0), close - nLoss), 1)
xATRTrailingStop := ta.lowest(math.min(nz(xATRTrailingStop, 0), close + nLoss), 1)

// Position Calculation
var int pos = 0
pos := nz(pos[1], 0)
if (close[1] < nz(xATRTrailingStop, 0) and close > nz(xATRTrailingStop, 0))
    pos := 1
else if (close[1] > nz(xATRTrailingStop, 0) and close < nz(xATRTrailingStop, 0))
    pos := -1

// Plotting Trailing Stop
var color xcolor = na
if (pos == -1)
    xcolor := color.red
else if (pos == 1)
    xcolor := color.green
plot(xATRTrailingStop, color=xcolor, title="Trailing Stop")

// Buy/Sell Signals
buySignal = ta.crossover(close, xATRTrailingStop)
sellSignal = ta.crossunder(close, xATRTrailingStop)

// Strategy
if (buySignal)
    strategy.entry("Long", strategy.long)
    label.new(bar_index, xATRTrailingStop, text="Buy Signal", color=color.green, style=label.style_label_up, yloc=yloc.belowbar)
if (sellSignal)
    strategy.entry("Short", strategy.short)
    label.new(bar_index, xATRTrailingStop, text="Sell Signal", color=color.red, style=label.style_label_down, yloc=yloc.abovebar)

// Alerts
alertcondition(buySignal, title='UT BOT Buy', message='UT BOT Buy')
alertcondition(sellSignal, title='UT BOT Sell', message='UT BOT Sell')