트리플 슈퍼트렌드 이동평균 돌파 전략


생성 날짜: 2023-12-21 12:05:07 마지막으로 수정됨: 2023-12-21 12:05:07
복사: 1 클릭수: 728
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

트리플 슈퍼트렌드 이동평균 돌파 전략

개요

트리플 초상승승평선 돌파 전략은 여러 다른 변수 설정을 이용한 초상승승평선과 defines의 EMA를 이용하여 트렌드 방향을 파악하고 거래를 하는 전략이다. 이 전략의 주요 아이디어는 적어도 두 개의 초상승평선선이 defines의 EMA선 위에 다목적 상태를 나타낼 때 다목적 상태를 구축하는 것이다. 적어도 두 개의 초상승평선선이 defines의 EMA선 아래에 공허 상태를 나타낼 때 공허 상태를 구축하는 것이다.

전략 원칙

이 전략은 3개의 다른 변수를 가진 초상향 평균선과 큰 경향의 방향을 정의하는 EMA를 설정하여 포지션 구축과 포지션을 판단합니다:

  1. 세 개의 초 트렌드 평행선을 supertrend1, supertrend2, supertrend3로 설정합니다. 색상은 각각 초록색으로 상승 추세를 나타내고, 빨간색으로 하향 추세를 나타냅니다.

  2. EMA 평평한 이동 평균 ematrend을 설정하여 큰 트렌드를 정의합니다. 세 개의 초 트렌드 평균선이 모두 이 EMA보다 높을 때 큰 상장 다면 트렌드로 정의되며, 반대로 공허 트렌드로 정의됩니다.

  3. 적어도 두 개의 초상향평균선이 대판 다머리 상태에서 동시에 다머리 ((녹색) 을 표시하면 방향값이 0보다 작을 때 다머리 신호로 판단한다. 적어도 두 개의 초상향평균선이 대판 공허 상태에서 동시에 공허 (붉은) 을 표시하면 방향값이 0보다 크면 공허 신호로 판단한다.

  4. 다음으로 신호가 나오면 상장/공백을 한다.

  5. 고정 스톱은 리스크 수익률, 즉 수익률이 3; 이동 스톱은 하락 한 ATR 즉 스톱이다.

  6. 스톱로스 또는 스프레이드 조건이 발생했을 때 포지션을 청산하십시오.

우위 분석

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

  1. 트리플 초트렌드 평균선과 결합된 트렌드를 판단하는 EMA를 사용하여 트렌드 신호를 효과적으로 식별할 수 있다.

  2. 다공간 조건부 판단 규칙은 명확하고, 이해하기 쉽고, 구현하기 쉽다.

  3. 모바일 스톱 및 고정 스톱을 설정하여 위험을 효과적으로 제어한다.

  4. 필요에 따라 초변수를 조정할 수 있고, 전략을 최적화할 수 있다.

위험 분석

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

  1. 초변수 설정을 잘못하면 좋은 거래 기회를 놓치게 될 수 있다. 다른 ATR 주기, ATR 배수, EMA 주기 변수를 테스트할 수 있다.

  2. 돌파 실패의 확률이 존재하고, 초변수를 조정하여 확률을 줄일 수 있다.

  3. 중지 또는 중지 설정이 너무 느슨하면 손실 확률이 증가합니다. 중지 범위를 적절히 좁혀야합니다.

  4. 복사 데이터는 과도한 적합 문제를 일으킬 수 있다. 다시장 다주기 테스트에 주의를 기울여야 한다.

최적화 방향

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

  1. 최적의 초변수 조합을 테스트한다. 다양한 ATR 주기, ATR 곱수, EMA 평균 주기들을 조합하여 최적의 변수를 찾는다.

  2. 거래 품종을 추가하십시오. 전략의 효과를 확인하기 위해 주식, 디지털 화폐와 같은 다양한 품종을 추가 할 수 있습니다.

  3. 다른 지표와 함께 필터링 신호. 예를 들어, RSI, MACD와 같은 지표가 트렌드 신호를 잘못 읽지 않도록 추가 할 수 있습니다.

  4. 손해 막기 메커니즘을 최적화한다. ATR/변동률 변화에 따른 손해 막기 방법을 테스트할 수 있다.

요약하다

트리플 초트렌드 평균선 돌파 전략은 전체적으로 비교적 간단하고 실용적인 트렌드 추적 전략이다. 그것은 동시에 여러 초트렌드 평균선과 트렌드 판단 EMA를 결합하여 기회를 발굴하고 위험을 효과적으로 제어한다. 매개 변수 최적화 및 규칙 최적화를 통해 더 나은 효과를 얻을 수 있다. 이 전략은 이해하기 쉽고 학습 가치가 있다.

전략 소스 코드
/*backtest
start: 2022-12-14 00:00:00
end: 2023-12-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=5
// author=theasgard and moonshot-indicator (ms)
// year 2021
//
// This is a well knowen strategy by using 3 different Supertrends and a trend-defining EMA,
// feel free to play around with the settings, a backtest on 8h ETHUSDT pair brought some good results using 
// the 233EMA and investing 75% of a 10k start capital
//
// the idea is to have at least 2 supertrnds going green above the trend-EMA to go long and exit by turning 
// 2 supertrends red (idea: 1 supertrend in red could initialize a take profit)
// shorts work vice versa
// The EMA shows in green for uptrends and in red for downtrends, if it is blue no Signal will be taken because 
// the 3 supertrends are not all above or below the trendline(EMA)
//
// Update 1:
// Fixed a minor input error
// Added ATR stoploss, and commented out the percentage stop loss
// Added time window to backtest
// Added exit on risk/revard is met
// This version is only buy...wait for next update adding shorts

strategy("ms hypertrender", overlay=true)

// set up 3 supertrendlines and colour the direction up/down
atrPeriod1 = input(10, "ATR Length 1")
factor1 = input.float(1.0, "ATR Factor 1", step = 0.01)
[supertrend1, direction1] = ta.supertrend(factor1, atrPeriod1)
upTrend1 = plot(direction1 < 0 ? supertrend1 : na, "Up Trend 1", color = color.green, style=plot.style_linebr)
downTrend1 = plot(direction1 < 0? na : supertrend1, "Down Trend 1", color = color.red, style=plot.style_linebr)

atrPeriod2 = input(11, "ATR Length 2")
factor2 = input.float(2.0, "ATR Factor 2", step = 0.01)
[supertrend2, direction2] = ta.supertrend(factor2, atrPeriod2)
upTrend2 = plot(direction2 < 0 ? supertrend2 : na, "Up Trend 2", color = color.green, style=plot.style_linebr)
downTrend2 = plot(direction2 < 0? na : supertrend2, "Down Trend 2", color = color.red, style=plot.style_linebr)

atrPeriod3 = input(12, "ATR Length 3")
factor3 = input.float(3.0, "ATR Factor 3", step = 0.01)
[supertrend3, direction3] = ta.supertrend(factor3, atrPeriod3)
upTrend3 = plot(direction3 < 0 ? supertrend3 : na, "Up Trend 3", color = color.green, style=plot.style_linebr)
downTrend3 = plot(direction3 < 0? na : supertrend3, "Down Trend 3", color = color.red, style=plot.style_linebr)

//set up the trend dividing EMA and color uptrend nutreal downtrend
len = input.int(233, minval=1, title="Trend-EMA Length")
src = input(close, title="Source")
offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)

//general Bull or Bear Trend? Visualized by ema
ematrend = ta.ema(src, len)
generaluptrend = supertrend1 > ematrend and supertrend2 > ematrend and supertrend3 > ematrend
generaldowntrend = supertrend1 < ematrend and supertrend2 < ematrend and supertrend3 < ematrend
emacolor = if generaluptrend
    color.green
else if generaldowntrend
    color.red
else
    color.blue
plot(ematrend, title="EMA", color=emacolor, linewidth=3, offset=offset)

// Bullish? min 2 supertrends green
bullish = (direction1 < 0 and direction2 < 0) or (direction1 < 0 and direction3 < 0) or (direction2 < 0 and direction3 < 0) and generaluptrend
extremebullish = direction1 < 0 and direction2 < 0 and direction3 < 0 and generaluptrend //all 3 green

// Bearish? min 2 supertrends red
bearish = (direction1 > 0 and direction2 > 0) or (direction1 > 0 and direction3 > 0) or (direction2 > 0 and direction3 > 0) and generaldowntrend
extremebearish = direction1 > 0 and direction2 > 0 and direction3 > 0 and generaldowntrend //all 3 red

// Open Long
//plotchar(((bullish and not bullish[1]) or (extremebullish and not extremebullish[1])) and (emacolor==color.green)? close : na, title = 'Start Long', char='▲', color = #80eb34, location = location.belowbar, size = size.small)

// TP 10% Long
TP10long = ((generaluptrend and bullish[1]) or (generaluptrend and extremebullish[1])) and (direction1 > 0 or direction2 > 0 or direction3 > 0)
//plotchar(TP10long and not TP10long[1]? close : na, title = 'TP on Long', char='┼', color = #ffd000, location = location.abovebar, size = size.tiny)

// Exit Long
//plotchar(extremebearish and not extremebearish[1] or bearish and not bearish[1]? close : na, title = 'Close all Longs', char='Ꭓ', color = #ff0037, location = location.abovebar, size = size.tiny)
stopsupertrendup = if supertrend1 < supertrend2 and supertrend1 < supertrend3
    (supertrend1)
else if supertrend2 < supertrend1 and supertrend2 < supertrend3
    (supertrend2)
else if supertrend3 < supertrend1 and supertrend3 < supertrend2
    (supertrend3)
lowestLows = ta.lowest(low, 1)
// Open Short
//plotchar(((bearish and not bearish[1]) or (extremebearish and not extremebearish[1])) and (emacolor==color.red)? close : na, title = 'Start Short', char='▼', color = #0547e3, location = location.abovebar, size = size.small)

// TP 10% Short
TP10short = ((generaldowntrend and bearish[1]) or (generaldowntrend and extremebearish[1])) and (direction1 < 0 or direction2 < 0 or direction3 < 0)
//plotchar(TP10short and not TP10short[1]? close : na, title = 'TP on Short', char='┼', color = #ffd000, location = location.belowbar, size = size.tiny)

// Exit Short
//plotchar(extremebullish and not extremebullish[1] or bullish and not bullish[1]? close : na, title = 'Close all Shorts', char='Ꭓ', color = #ff0037, location = location.belowbar, size = size.tiny)
stopsupertrenddown = if supertrend1 > supertrend2 and supertrend1 > supertrend3
    (supertrend1)
else if supertrend2 > supertrend1 and supertrend2 > supertrend3
    (supertrend2)
else if supertrend3 > supertrend1 and supertrend3 > supertrend2
    (supertrend3)
highestHighs = ta.highest(high,1)
// Set stop loss level with input options (optional)
//longLossPerc = input.float(title="Long Stop Loss (%)",
//     minval=0.0, step=0.1, defval=1) * 0.01

//shortLossPerc = input.float(title="Short Stop Loss (%)",
//     minval=0.0, step=0.1, defval=1) * 0.01
     
// Determine stop loss price
//longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
//shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

openlong = (extremebullish and not extremebullish[1]) and (emacolor==color.green)//(((bullish and not bullish[1]) or 
openshort = (extremebearish and not extremebearish[1]) and (emacolor==color.red)//(((bearish and not bearish[1]) or 
exitlong = lowestLows<(stopsupertrendup - ((stopsupertrendup / 100) * 0.1)) //(extremebearish and not extremebearish[1] or bearish and not bearish[1]) or TP10long or 
exitshort = highestHighs>(stopsupertrenddown - ((stopsupertrenddown / 100) * 0.1)) //(extremebullish and not extremebullish[1] or bullish and not bullish[1]) or TP10short
//strategy.entry("buy", strategy.long, when=openlong)
//strategy.entry("sell", strategy.short, when=openshort)

//strategy.close("buy", when=exitlong)
//strategy.close("sell", when=exitshort)

// Submit exit orders based on calculated stop loss price
//if (strategy.position_size > 0)
//    strategy.exit(id="Long Stop", stop=longStopPrice)

//if (strategy.position_size < 0)
//    strategy.exit(id="Short Stop", stop=shortStopPrice)

backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time")
USE_ENDTIME = input(false,title="Define the ending period for backtests (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("19 Mar 2021 19:30 +0000"), title = "Backtest End Time")
TARGET_PROFIT_MODE = input(false,title="Exit when Risk:Reward met")
REWARD_RATIO = input(3,title="Risk:[Reward] (i.e. 3) for exit")
// Trailing stop loss {
TSL_ON = input(true,title="Use trailing stop loss")
var entry_price = float(0)
ATR_multi_len = 26
ATR_multi = input(2, "ATR multiplier for stop loss")
ATR_buffer = ta.atr(ATR_multi_len) * ATR_multi
plotchar(ATR_buffer, "ATR Buffer", "A", location = location.top)
risk_reward_buffer = (ta.atr(ATR_multi_len) * ATR_multi) * REWARD_RATIO
take_profit_long = low > entry_price + risk_reward_buffer
take_profit_short = low < entry_price - risk_reward_buffer
var trailing_SL_buffer = float(0)
var stop_loss_price = float(0)
stop_loss_price := math.max(stop_loss_price, close - trailing_SL_buffer)
// plot TSL line
trail_profit_line_color = color.green
if strategy.position_size == 0  or not TSL_ON
    trail_profit_line_color := color.black
    stop_loss_price := close - trailing_SL_buffer
plot(stop_loss_price,color=trail_profit_line_color)
// }

if true
    buy_condition = openlong
    exit_condition = exitlong
    //ENTRY:
    if buy_condition
        if strategy.position_size == 0
            entry_price := close
            trailing_SL_buffer := ATR_buffer
            stop_loss_price := close - ATR_buffer
        
        msg = "entry"
        if strategy.position_size > 0
            msg := "pyramiding"
        strategy.entry("Long",strategy.long, comment=msg)

    //EXIT:
    // Case (A) hits trailing stop
    if TSL_ON and strategy.position_size > 0 and close <= stop_loss_price
        if close > entry_price
            strategy.close("Long", comment="take profit [trailing]")
        else if close <= entry_price 
            strategy.close("Long", comment="stop loss")
    // Case (B) take targeted profit relative to risk 
    if strategy.position_size > 0 and TARGET_PROFIT_MODE
        if take_profit_long
            strategy.close("Long", comment="take profits [risk:reward]")
    // Case (C)
    if strategy.position_size > 0 and exit_condition
        if take_profit_long
            strategy.close("Long", comment="exit[rsi]")