EMA 강화된 슈퍼 트렌드 전략

저자:차오장, 날짜: 2023-10-07 10:07:15
태그:

전반적인 설명

이 전략은 이동 평균 보조 판단과 결합하여 ATR과 가격을 비교하여 가격 트렌드 방향을 판단합니다. 다른 트렌드 판단 방법과 비교하면 작은 드라우다운으로 가격 트렌드 변화를 더 빨리 파악 할 수 있습니다.

전략 원칙

가격 동향을 결정하는 이 전략의 주요 단계는 다음과 같습니다.

  1. 최근 N일 동안의 ATR을 계산하여 현재 시장 변동성을 더 잘 반영할 수 있는 와일더의 ATR 계산 방법을 사용한다.

  2. ATR 및 atk 계수를 기반으로 상단 및 하단 대역을 계산합니다. 상단 대역 = 가격 - (atk x ATR); 하단 대역 = 가격 + (atk x ATR). atk는 일반적으로 2-3 사이로 설정됩니다.

  3. 유행 방향을 결정하기 위해 상위 및 하위 대역과 가격을 비교하십시오. 상위 대역의 가격 브레이크는 상승 신호이며, 하위 대역의 가격 브레이크는 하향 신호입니다.

  4. 거래 신호가 발생했을 때 길거나 짧습니다. 이동 평균은 신호 품질을 결정하는 데 사용됩니다.

  5. 위험을 통제하기 위해 스톱 로스 전략을 추가합니다.

  6. 판단을 돕기 위해 전략 상태에 대한 색상 표시를 사용하세요.

이 전략은 ATR의 장점을 최대한 활용하여 가격 트렌드 변화를 빠르게 파악하고 낮은 마취 작업을 달성합니다. 그것은 매우 실용적인 트렌드 다음 전략입니다.

장점

이 전략의 장점은 다음과 같습니다.

  1. 가격 변화에 대한 신속한 반응 ATR은 최신 시장에 신속하게 반응하고 트렌드 변화를 적시에 파악하는 데 도움이됩니다.

  2. 작은 마감: 상위와 하위 대역 사이의 완충 구역은 스톱 로스 브레이크와 낮은 마감의 가능성을 줄일 수 있습니다.

  3. 명확한 거래 신호입니다. 범위 브레이크는 긴 방향과 짧은 방향에 대한 고품질 신호입니다.

  4. 높은 사용자 정의성 ATR 기간과 곱셈은 다른 시장 환경에 적응하도록 조정됩니다.

  5. 강력한 시각화 그래픽 도구는 전략 상태를 직관적으로 표시합니다.

  6. 최적화하기 쉽습니다. 이동 스톱 손실, 필터와 같은 모듈은 추가 최적화를 위해 추가 될 수 있습니다.

일반적으로, 이 전략은 작은 유출과 같은 탁월한 장점을 가지고 있으며, 트렌드를 따르는 전략에 매우 적합합니다.

위험성

또한 몇 가지 위험이 있습니다.

  1. 트렌드 결정 오류 위험. 가격 통합 중에 잘못된 신호가 발생할 수 있습니다.

  2. 출구 지점 선택 위험. 조기 출구를 피하기 위해 중지 손실 지점이 합리적으로 설정되어야 합니다.

  3. 매개 변수 최적화 위험. ATR 기간과 곱셈은 반복 테스트와 최적화가 필요합니다. 잘못된 설정은 성능에 영향을 줄 것입니다.

  4. 높은 거래 빈도 위험. 극심한 시장 변동성 동안 거래 빈도가 너무 높을 수 있습니다.

  5. 성과 위험 중등성: 어떤 시장에서는 명백한 추세가 없는 상태에서 성과가 만족스럽지 않을 수 있습니다.

  6. 라이브 거래 리스크에 대한 조정입니다. 라이브 거래에서 미끄러짐, 수수료에 대한 조정이 필요합니다.

  7. 체계적 위험: 이 전략에만 의존하는 대신 전체 시스템 위험 통제가 고려되어야합니다.

위험은 다음과 같이 통제 할 수 있습니다.

  1. 정확도를 높이기 위해 ATR 매개 변수를 최적화합니다.

  2. 트렌드를 결정하기 위해 다중 시간 프레임 분석을 이용합니다.

  3. 수익을 확보하고 적자를 줄이기 위해 Stop Loss를 도입합니다.

  4. 거래 빈도를 제어하는 필터를 추가합니다.

  5. 다른 시장에 대한 매개 변수를 조정합니다.

  6. 가장 좋은 응용 시나리오를 찾기 위해 다양한 제품을 테스트합니다.

  7. 실시간 거래에서 모든 거래 위험을 종합적으로 고려합니다.

최적화 방향

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

  1. 잘못된 신호를 줄이기 위해 이동 평균과 같은 필터를 추가합니다. MACD, KDJ는 보조 판단에 사용할 수 있습니다.

  2. ATR 매개 변수를 최적화하여 최적의 값을 찾기 위해 다양한 기간을 테스트합니다.

  3. 신호 발생의 민감도를 결정하기 위해 곱셈 매개 변수를 최적화합니다.

  4. ATR 또는 변동성에 기반한 동적 스톱 로스 전략을 추가합니다. 이것은 추출을 더욱 줄일 수 있습니다.

  5. 분석을 위해 더 높은 시간 프레임 지표를 사용하여 산발적인 잘못된 신호를 필터합니다.

  6. 신호 판단을 개선하기 위해 RNN 같은 기계 학습 모델을 채택합니다.

  7. 제품 특성에 따라 매개 변수를 조정합니다. 예를 들어 휘발성 주식에 대한 짧은 ATR 기간을 사용하십시오.

  8. 더 나은 입구를 찾기 위해 브레이크아웃 풀백 접근법을 사용하여 입구 지점을 최적화합니다.

  9. 신호 강도를 판단하기 위해 볼륨 표시기를 결합합니다.

  10. 트렌드 모멘텀 지표에 기반한 수익 전략을 추가합니다.

결론

일반적으로,이 슈퍼 트렌드 전략은 빠른 반응과 작은 드래다운과 같은 장점으로 매우 실용적입니다. 그것은 전형적인 트렌드 다음 시스템입니다. 그러나 판단 오류 및 매개 변수 최적화와 같은 위험은 라이브 거래에서 주의해야하며 포괄적인 위험 관리가 구현되어야합니다. 추가 최적화는 더 많은 시장에서 전략을 더 견고하고 수익성있게 할 수 있습니다.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 6h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic


//@version=4
strategy("SuperTrend STRATEGY", overlay=true)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       
window()  => true
longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())
shortCondition = sellSignal
if (shortCondition)
    strategy.entry("SELL", strategy.short, when = window())
buy1= barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)

//@version=3
//study(title="3 Moving Average Exponential", shorttitle="3 EMA", overlay=true)
//len1 = input(17, minval=1, title="Fast")
//len2 = input(72, minval=1, title="Medium")
len3 = input(305, minval=1, title="Slow")
//src1 = input(close, title="Source Fast")
//src2 = input(close, title="Source Medium")
src3 = input(close, title="Source Slow")
//out1 = ema(src1, len1)
//out2 = ema(src2, len2)
out3 = ema(src3, len3)
//plot(out1, title="EMA1", color=fuchsia)
//plot(out2, title="EMA2", color=orange)
plot(out3, title="EMA3", color=color.blue)

더 많은