EMA 강화된 슈퍼 트렌드 전략


생성 날짜: 2023-10-07 10:07:15 마지막으로 수정됨: 2023-10-07 10:07:15
복사: 1 클릭수: 700
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 평균 실제 변동 범위 ATR을 계산하여 가격과 비교하여 가격 트렌드 방향을 판단하고, 이동 평균 보조 판단과 결합한다. 다른 트렌드 판단 방법에 비해 가격 변화 트렌드를 더 빨리 포착하고, 회귀가 작다.

전략 원칙

이 전략은 주로 다음과 같은 단계를 통해 가격 동향을 판단합니다.

  1. 최근 N일 동안의 평균 실제 변동 범위 ATR을 계산한다. 여기서는 와일더 정의의 ATR 계산 방법을 사용하여 현재 시장 변동 상황을 더 잘 반영한다.

  2. ATR과 atk 조정 계수를 기준으로 상궤선과 하궤선을 계산한다. 상궤선=가격- (atk 곱하기 ATR); 하궤선=가격+ (atk 곱하기 ATR) 을 계산한다. 이 중에서 atk는 보통 2-3 사이로 설정된다.

  3. 가격과 상하 궤도선과의 관계를 비교하여 트렌드 방향을 판단한다. 가격의 상하 궤도선과 상하 궤도선 사이의 관계를 비교하여 트렌드 방향을 판단한다. 가격의 상하 궤도선과 상하 궤도선 사이의 관계를 비교하여 트렌드 방향을 판단한다.

  4. 거래 신호가 발생했을 때, 오버 또는 오피를 한다. 여기서 이동 평균과 결합하여 신호의 질을 판단한다.

  5. Stop Loss Strategies에 참여하여 위험을 통제하십시오.

  6. 행동 색깔을 사용하여 전략 상태를 표시하여 판단을 돕습니다.

이 전략은 ATR의 장점을 최대한 활용하여 가격 변화의 트렌드를 빠르게 포착하여 낮은 회수 작업을 수행하는 전형적인 트렌드 추적 전략입니다.

전략적 이점

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 가격 변화에 빠르게 반응한다. ATR은 최신 시세에 빠르게 반응하여 트렌드 변화를 적시에 포착하는 데 도움이 된다.

  2. 철수 작다. 상하 궤도선에는 특정 버퍼 영역이 있어, 정전 피해가 부딪힐 확률을 줄여 철수를 줄일 수 있다.

  3. 거래 신호는 명확하다. 고품질의 거래 신호를 위해 포괄 범위를 돌파하고, 명확하게 더 많은 빈 방향을 할 수 있다.

  4. 커스터마이징이 높습니다. ATR 주기 및 배수는 다른 시장 환경에 적응할 수 있습니다.

  5. 시각화가 강하다. 그래픽 도구가 전략 상태를 표시하고, 조작이 직관적이다.

  6. 최적화하기 쉽다. 모바일 스톱, 필터 등의 모듈을 추가하여 더욱 최적화할 수 있다.

전체적으로 보면, 이 전략은 아주 실용적인 거래 전략입니다.

전략적 위험

이 전략에는 위험도 있습니다.

  1. 트렌드 판단 오류 위험. 가격 변동시 잘못된 신호가 발생할 수 있습니다.

  2. 탈퇴 지점 선택 위험. 탈퇴 지점을 합리적으로 선택하여 조기 탈퇴를 방지해야 한다.

  3. 매개 변수 최적화 위험. ATR 주기 및 배수는 반복 테스트 최적화를 필요로 하며, 부적절한 설정은 전략 성능에 영향을 줄 수 있다.

  4. 거래 빈도가 너무 높은 위험. 시장이 급격하게 변동할 때 거래 빈도가 너무 높을 수 있습니다.

  5. 효과가 좋지 않은 인위적 위험. 일부 시장에서는 추세가 명확하지 않은 경우 효과가 좋지 않을 수 있습니다.

  6. 실 디스크 조정 위험. 실 디스크 동작 시, 미끄러지점, 수수료 등에 대한 조정 최적화도 필요하다.

  7. 시스템적 위험. 전체 시스템의 위험 관리를 고려해야 하며, 이 전략에만 의존할 수 없다.

위와 같은 위험은 다음과 같은 방법으로 통제할 수 있습니다.

  1. ATR 파라미터를 최적화하여 판단의 정확성을 향상시킵니다.

  2. 여러 시간 주기 분석과 함께 트렌드를 파악한다.

  3. 이동한 스톱로스를 사용하여 수익을 고정하고, 회수량을 줄여줍니다.

  4. 필터링 조건을 적용하여 거래 빈도를 제어합니다.

  5. 다른 시장에 맞게 전략변수 조정.

  6. 다양한 품종을 테스트하여 최적의 적용 시나리오를 찾아보세요.

  7. 실제 거래에서 모든 종류의 거래 위험을 고려하십시오.

전략 최적화 방향

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

  1. 평균선과 같은 지표를 도입하여 필터링하여 잘못된 신호를 줄인다. MACD, KDJ 등 지표의 보조 판단을 추가할 수 있다.

  2. ATR 변수를 최적화한다. 다양한 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)