ATR과 MA 조합을 기반으로 한 슈퍼트렌드 트레이딩 전략


생성 날짜: 2023-12-01 16:40:27 마지막으로 수정됨: 2023-12-01 16:40:27
복사: 0 클릭수: 1074
avatar of ChaoZhang ChaoZhang
1
집중하다
1619
수행원

ATR과 MA 조합을 기반으로 한 슈퍼트렌드 트레이딩 전략

개요

슈퍼 트렌드 트레이딩 전략 (Supertrend Trading Strategy) 은 평균 실제 범위 (ATR) 와 이동 평균 (MA) 를 기반으로 한 트렌드 추적 전략이다. 그것은 트렌드 추적과 브레이크 트레이딩의 장점을 결합하여 중기 트렌드 방향을 식별하고 트렌드 변화에 따라 거래 신호를 생성하는 것을 목표로 한다.

이 전략의 주요 아이디어는 가격이 슈퍼 트렌드 채널을 뚫을 때, 트렌드가 반전되는 것을 표시하고, 이 때 구매하거나 판매한다. 이 전략은 수익을 잠금하고 위험을 제어하기 위해 동시에 중지 및 중지 수준을 설정한다.

전략 원칙

슈퍼 트렌드 전략의 계산 과정은 다음과 같은 몇 가지 단계로 구성됩니다.

  1. ATR을 계산한다. ATR은 한 기간 동안의 평균 변동량을 나타낸다.
  2. 최고 가격과 최저 가격에 따라 통로 중간선. 통로 중간선의 계산 공식은: ((최고 가격 + 최저 가격) / 2
  3. ATR과 사용자가 설정한 ATR 곱수에 따라 채널 상한과 하한을 계산한다. 채널 상한의 계산 공식은: 중선+(ATR×ATR 곱); 채널 하한의 계산 공식은: 중선-(ATR×ATR 곱) 이다.
  4. 닫기 가격과 채널 상하계와 관계를 비교하여 트렌드 방향을 판단한다. 닫기 가격이 채널 상하계보다 높으면 상승하는 경향이 있고, 닫기 가격이 채널 하하계보다 낮으면 하향하는 경향이 있다.
  5. 가격이 트렌드 채널을 뚫을 때 역거래를 한다. 예를 들어, 가격이 아래에서 위쪽으로 채널 상한을 뚫고 구매 신호를 생성한다. 가격이 위에서 아래로 채널 하한을 뚫고 판매 신호를 생성한다.

이 전략의 장점은, 동시 동향을 따르는 것과 동향 반향을 따르는 거래 방식을 결합한다는 것입니다. 그것은 큰 동향의 방향을 판단 할 수 있고, 반향 기회를 적시에 잡을 수 있습니다. 또한, 위험을 제어하기 위해 손실을 막는 제도를 설정합니다.

우위 분석

슈퍼 트렌드 전략은 다음과 같은 장점이 있습니다.

1. 중기 트렌드를 추적하는 것

슈퍼 트렌드 채널은 ATR 계산을 기반으로 중기 가격 변동 범위를 효과적으로 반영할 수 있다. 일반 이동 평균보다 중기 트렌드를 더 잘 추적한다.

2. 트렌드 반전을 적시에 잡는 것

가격이 통로를 뚫을 때, 빠르게 거래 신호를 발송하여, 큰 추세의 반전을 적시에 포착할 수 있다. 이것은 적절히 포지션을 조정하고, 초과 기간을 보유하는 것을 줄이는 것을 보장한다.

3. 손해 방지 장치

이 전략은 동시에 중지 지점과 중지 지점을 설정하여 자동으로 중지 할 수 있습니다. 이것은 대폭적으로 범용 손실의 위험을 줄여주고 트렌드 상황을 파악하는 데 도움이됩니다.

4. 간단하게 구현할 수 있습니다.

이 전략은 평균선과 ATR 지표를 주로 사용하며, 비교적 간단하고 쉽게 습득할 수 있다. 이것은 실디스크 동작의 난이도를 낮춘다.

5. 자금 사용 효율성

슈퍼 트렌드 전략은 중기 트렌드를 추적하고, 단일 슬라이드 포인트를 제어하며, 전반적인 자금 활용 효율성이 높습니다.

위험 분석

슈퍼 트렌드 전략에는 몇 가지 잠재적인 위험도 있습니다.

1. 동요의 기회비용이 높습니다.

슈퍼 트렌드 전략은 중장기 트렌드를 추적하는 데 초점을 맞추고 있으며, 격동이 있는 시장에서 비용이 더 높기 때문에 일부 공백 기회를 놓칠 수 있습니다.

2. 변수 최적화 효과

ATR 주기 및 ATR 곱수의 선택은 거래 전략의 효과에 큰 영향을 미칩니다. 파라미터를 잘못 설정하면 거래 신호의 효과가 저하됩니다.

3. 다소 뒤처진 상태

슈퍼 트렌드 채널 계산에는 약간의 지연이 존재하며, 이는 신호가 제때 생성되지 않도록 할 수 있다. 이것은 이 전략이 해결해야 하는 주요 문제이다.

4. 엄격한 손해 방지 장치가 필요합니다.

만약 스톱로드 포지션이 너무 커 설정되거나 풍력 조절 회피가 완벽하지 않다면, 극단적인 상황에서는 큰 손실을 초래할 수 있다. 따라서 스톱로드 전략을 엄격하게 실행해야 안정적인 수익을 얻을 수 있다.

최적화 방향

이 슈퍼 트렌드 전략에는 다음과 같은 추가적인 최적화 기능이 있습니다.

1. 여러 ATR 사이클을 결합합니다.

예를 들어 10일, 20일 등 여러 개의 ATR 주기를 결합하여 복합 ATR 지표를 형성할 수 있다. 이렇게하면 지표의 민감성을 높이고, 지연 문제를 개선할 수 있다.

2. Stop Loss Module를 추가합니다.

또한, 트리플 스톱, 오징어 스톱, 순차 스톱과 같은 전략 모듈을 추가하여 스톱 컨트롤을 더욱 강화하여 손실 위험을 줄일 수 있습니다.

3. 최적화 변수 설정

최적화 ATR 주기, ATR 곱하기 등 파라미터 설정을 통해 최적의 파라미터 조합을 찾아서 전략적 수익을 더 향상시킬 수 있다. 또한, 파라미터도 동적으로 최적화하여 다양한 품종과 시장 단계에 따라 적절한 값을 선택할 수 있다.

4. 통합 기계 학습 모델

마지막으로, 트렌드 판단과 신호를 생성하는 자동화를 구현하기 위해 기계 학습 모델을 통합하는 것도 시도할 수 있습니다. 이것은 주관적 요소의 간섭을 줄일 수 있으며, 전략 시스템의 안정성을 더욱 향상시킬 수 있습니다.

요약하다

슈퍼 트렌드 트레이딩 전략은 중간 트렌드를 판단하기 위해 평균선 지표와 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)