ATR 및 MA 조합을 기반으로 하는 슈퍼트렌드 거래 전략

저자:차오장, 날짜: 2023-12-01 16:40:27
태그:

img

전반적인 설명

슈퍼트렌드 트레이딩 전략 (Supertrend trading strategy) 은 평균 참 범위 (ATR) 와 이동 평균 (MA) 를 기반으로 트렌드를 따르는 전략이다. 트렌드 추적과 브레이크아웃 트레이딩의 장점을 모두 통합하여 중간 트렌드 방향을 파악하고 트렌드 변화에 기반한 트레이딩 신호를 생성한다.

이 전략의 주된 아이디어는 가격이 슈퍼 트렌드 채널을 통과 할 때 길거나 짧게 이동하는 것입니다. 트렌드 반전을 나타냅니다. 또한 수익을 잠금하고 위험을 제어하기 위해 스톱 로스를 설정하고 수익 수준을 취합니다.

이 전략 의 효과

슈퍼트렌드 계산은 여러 단계로 이루어집니다.

  1. ATR을 계산합니다. ATR은 일정 기간 동안의 평균 변동성을 반영합니다.
  2. 가장 높은 높음과 가장 낮은 낮음에 기초하여 중간선을 계산합니다. 중간선은 다음과 같이 계산됩니다. (최고의 높음 + 최저의 낮음) / 2
  3. 상위 채널과 하위 채널은 거래자가 설정한 ATR 및 ATR 곱셈을 기반으로 계산합니다. 상위 채널은: 중점 + (ATR × 곱셈). 하위 채널은: 중점 - (ATR × 곱셈) 으로 계산됩니다.
  4. 트렌드 방향을 결정하기 위해 닫기 가격을 상위/하위 채널과 비교합니다. 닫는 것이 상위 채널 위에 있다면 트렌드가 상승합니다. 닫는 것이 하위 채널 아래에 있다면 트렌드가 하락합니다.
  5. 채널 위 또는 아래의 브레이크오웃은 역 거래 신호를 생성합니다. 예를 들어, 상위 채널 위의 브레이크오웃은 긴 진입을 신호하고, 하위 채널 아래의 파업은 짧은 진입을 신호합니다.

이 전략의 장점은 트렌드 추적 및 트렌드 역전 기술을 결합한다는 것입니다. 주요 트렌드를 식별하면서 역전 기회를 적시에 포착 할 수 있습니다. 또한 스톱 로스 / 영업 메커니즘은 위험을 제어하는 데 도움이됩니다.

강점

슈퍼트렌드 전략은 다음과 같은 강점을 가지고 있습니다.

1. 중간 추세를 추적

슈퍼트렌드 채널은 중간 가격 변동 범위를 효과적으로 반영하는 ATR를 기반으로 계산됩니다. 간단한 이동 평균보다 중간 트렌드를 더 잘 추적합니다.

2. 역행 현상을 적시에 파악

채널에서 가격 브레이크는 트레이딩 신호를 빠르게 생성하여 주요 트렌드 반전을 적시에 포착 할 수 있습니다. 이것은 적절한 재 위치화를 허용합니다.

3. 손해를 멈추고 이익을 취하라

전략은 사전 정의 된 스톱 로스를 설정하고 위험 통제와 함께 자동 출구에 대한 수익 수준을 취합니다. 이것은 과도한 스톱 로스의 위험을 크게 줄이고 더 나은 트렌드 추세를 허용합니다.

4. 적용 하기 쉽다

이 전략은 주로 MA와 ATR와 같은 기본 지표를 사용합니다. 이것은 실시간 거래에 대해 이해하기 쉽고 구현하기 쉽습니다.

**5. 높은 자본 효율성 **

중간 트렌드를 추적하고 개별 미끄러짐을 제어함으로써 슈퍼트렌드 전략은 전반적으로 높은 자본 효율을 제공합니다.

위험 분석

슈퍼트렌드 전략은 또한 몇 가지 잠재적인 약점을 가지고 있습니다:

1. 시장에서 낮은 성과

이 전략은 중장기 트렌드 거래에 초점을 맞추고 있습니다. 범위 또는 통합 시장에서는 놓친 짧은 거래의 더 높은 기회 비용으로 낮은 성과를 내는 경향이 있습니다.

2. 매개 변수 최적화에 민감

ATR 기간 및 곱셈자에 대한 선택 값은 전략 성과에 상대적으로 큰 영향을 미칩니다. 매개 변수의 부적절한 조정은 거래 신호의 효과를 손상시킬 수 있습니다.

3. 지연 문제 가 있을 수 있다

슈퍼트렌드 채널 계산에 약간의 지연 문제가 발생할 수 있으며, 이는 시시한 신호 발생을 유발할 수 있습니다. 지연 문제를 해결하는 것이 우선 순위가 되어야 합니다.

4. 엄격한 스톱 로스 관리

극단적인 시장 조건에서, 부적절하게 큰 스톱 손실 허용 또는 불충분한 위험 관리는 큰 손실로 이어질 수 있습니다. 엄격한 스톱 손실 규칙을 따르는 것이 일관성있는 수익성에 중요합니다.

개선 할 수 있는 분야

이 슈퍼트렌드 전략을 최적화 할 수있는 더 많은 공간이 있습니다.

1. 여러 ATR 기간을 결합

10일과 20일과 같은 다양한 기간에 걸쳐 ATR 판독을 결합하면 복합 지표가 형성되며, 감수성 향상과 지연 문제를 돕습니다.

2. 중지 손실 모듈을 추가

트리플 스톱 로스, 변동성 스톱 로스, 순차 스톱 로스 같은 더 정교한 스톱 로스 메커니즘을 추가하면 위험 통제와 마감 감축을 강화할 수 있습니다.

3. 파라미터 최적화

양적 방법을 통해 ATR 기간, 곱셈자 및 기타 입력값을 최적화하는 것은 전략 성능을 더욱 향상시킬 수 있습니다. 또한 매개 변수는 다른 제품과 시장 체제에 따라 동적으로 조정 될 수 있습니다.

4. 기계 학습 모델을 통합

마지막으로, 기계 학습 모델을 통합하면 자동 트렌드 인식과 신호 생성, 주관적 결정에 대한 의존도를 줄이고 시스템 안정성을 향상시킬 수 있습니다.

결론

슈퍼트렌드 거래 전략은 MA 및 ATR 지표를 사용하여 중간 트렌드 방향을 식별하고 자동화 된 스톱 로스 / 토크 노프프 구현으로 트렌드 반전을 중심으로 거래 입출 시그널을 생성합니다. 주요 트렌드를 유지하면서 일부 반전 기회를 포착합니다. 주요 장점은 중간 트렌드 추적, 트렌드 반전 식별 및 스톱 로스 / 토크 노프프를 통해 위험 통제에 있습니다.

그러나 범위 제한 시장 포착 부족 및 후속 문제와 관련하여 일부 결함이 있습니다. 복합 ATR를 사용하여 스톱 손실 모듈을 강화하고 조정 매개 변수 및 기계 학습 모델을 통합하는 등 여러 차원에서 추가 최적화가 탐구 될 수 있습니다. 이러한 개선은 슈퍼 트렌드 전략의 안정성과 효율성을 향상시킬 가능성이 있습니다.


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

//@version=3
strategy("Supertrend V1.0 - Buy or Sell Signal",overlay=true)
Factor=input(3, minval=1,maxval = 100)
Pd=input(7, minval=1,maxval = 100)
//Calculating ATR
atrLength = input(title="ATR Length:",  defval=14, minval=1)
Stop_Loss_Factor = input(1.5, minval=0,step=0.01)
factor_profit = input(1.0, minval=0,step=0.01)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 10, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2016, title = "From Year", minval = 2009)
ToMonth   = input(defval = 4, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 10, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2039, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"


// Calculate ATR
atrValue=atr(atrLength)
decimals = abs(log(syminfo.mintick) / log(10)) 
Atr = atrValue
if(decimals == 5)
    Atr := atrValue * 10000
if(decimals == 4)
    Atr := atrValue * 1000
if(decimals == 3)
    Atr := atrValue * 100
if(decimals == 2)
    Atr := atrValue * 10


//VJ2 Supertrend

Up=hl2-(Factor*atr(Pd))
Dn=hl2+(Factor*atr(Pd))

TrendUp = 0.0
TrendUp:=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown = 0.0
TrendDown:=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn

Trend = 0.0
Trend := close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl = 0.0
Tsl := Trend==1? TrendUp: TrendDown

linecolor = Trend == 1 ? green : red

plot(Tsl, color = linecolor , style = line , linewidth = 2,title = "SuperTrend")

plotshape(cross(close,Tsl) and close>Tsl , "Up Arrow", shape.triangleup,location.belowbar,green,0,0)
plotshape(cross(Tsl,close) and close<Tsl , "Down Arrow", shape.triangledown , location.abovebar, red,0,0)
//plot(Trend==1 and Trend[1]==-1,color = linecolor, style = circles, linewidth = 3,title="Trend")

plotarrow(Trend == 1 and Trend[1] == -1 ? Trend : na, title="Up Entry Arrow", colorup=lime, maxheight=60, minheight=50, transp=0)
plotarrow(Trend == -1 and Trend[1] == 1 ? Trend : na, title="Down Entry Arrow", colordown=red, maxheight=60, minheight=50, transp=0)




//Strategy 
Trend_buy = Trend == 1 
Trend_buy_prev = Trend[1] == -1
algo_buy_pre = Trend_buy and Trend_buy_prev
algo_buy = algo_buy_pre == 1 ? 1 : na
Trend_sell= Trend == -1 
Trend_sell_prev = Trend[1] == 1
algo_sell_pre = Trend_sell and Trend_sell_prev
algo_sell = algo_sell_pre == 1 ? 1:na

strategy.entry("Long1", strategy.long, when= window() and algo_buy==1)

strategy.entry("Short1", strategy.short, when=window() and algo_sell==1)

bought = strategy.position_size > strategy.position_size 
sold = strategy.position_size < strategy.position_size 

longStop = Stop_Loss_Factor * valuewhen(bought, Atr, 0) 
shortStop = Stop_Loss_Factor * valuewhen(sold, Atr, 0) 
longProfit = factor_profit * longStop 
shortProfit = factor_profit * shortStop 


if(decimals == 5) 
    longStop := longStop *100000 
    longProfit := longProfit *100000 
if(decimals == 4) 
    longStop := longStop * 10000 
    longProfit := longProfit * 10000 
if(decimals == 3) 
    longStop := longStop * 1000 
    longProfit := longProfit * 1000 
if(decimals == 2) 
    longStop := longStop * 100 
    longProfit := longProfit *100 
if(decimals == 5) 
    shortStop := shortStop * 100000 
    shortProfit := shortProfit * 100000 
if(decimals == 4) 
    shortStop := shortStop * 10000 
    shortProfit := shortProfit * 10000 
if(decimals == 3) 
    shortStop := shortStop * 1000 
    shortProfit := shortProfit * 1000 
if(decimals == 2) 
    shortStop := shortStop * 100 
    shortProfit := shortProfit * 100 

strategy.exit("Exit Long", from_entry = "Long1", loss =longStop, profit = longProfit) 
strategy.exit("Exit Short", from_entry = "Short1", loss =shortStop, profit = shortProfit) 


더 많은