トリプル・スーパートレンド・ブレークアウト戦略

作者: リン・ハーンチャオチャン開催日:2023年12月21日 12:05:07
タグ:

img

概要

トリプルスーパートレンドブレイクアウト戦略は,トレンド方向と取引を特定するために,異なるパラメータ設定とトレンドを定義するEMAを持つ複数のスーパートレンドラインとトレンドを定義するEMAを使用する一般的に使用される戦略である.この戦略の主なアイデアは,少なくとも2つのスーパートレンドラインがトレンドを定義するEMA線上の上昇傾向を示しているときにロングポジションを確立し,少なくとも2つのスーパートレンドラインがトレンドを定義するEMAラインの下のダウントレンドを示しているときにショートポジションを確立することである.

戦略原則

この戦略は,異なるパラメータを持つ3つのスーパートレンドラインと,エントリーとアウトートを決定するための主要なトレンドを定義するEMAラインを使用します.

  1. 3つのスーパートレンドラインを設定します スーパートレンド1, スーパートレンド2, スーパートレンド3です 緑色は上昇傾向を示し 赤色は下落傾向を示します

  2. 主なトレンドを定義するために,EMAラインのemaトレンドを設定します.このEMA以上にある3つのスーパートレンドラインはすべて,市場が上昇傾向にあると定義され,下落傾向の場合も逆です.

  3. 最大上昇傾向市場の条件下で,少なくとも2つのスーパートレンドラインが同時に上昇傾向 (緑色) を示す場合,すなわち方向値が0未満の場合,それは長信号とみなされます. 最大減少傾向市場の条件下で,少なくとも2つのスーパートレンドラインが同時に下落傾向 (赤色) を示す場合,すなわち方向値が0を超えると,それはショート信号とみなされます.

  4. その後,信号が発信されると,ロング/ショートポジションを開きます.

  5. ストップ・ロスの条件を設定し,利益を引き取る.固定・テイク・ロフはリスク/リターン比3で設定され,トライリング・ストップ・ロスはATRの1回落で設定される.

  6. ストップ・ロースまたはメリット・テイク・プロフィート条件が起動すると,ポジションを閉じる.

利点分析

この戦略の利点は以下の通りです.

  1. 3つのスーパートレンドラインとトレンド判断EMAを組み合わせることで,トレンドシグナルを効果的に識別できます.

  2. 長い条件と短い条件は 明確で理解し実行しやすいものです

  3. ストップ・ロスの設定と固定・テイク・プロフィートの設定は リスクを効果的に管理します

  4. 戦略を最適化するために必要に応じてハイパーパラメータを調整できます.

リスク分析

この戦略にはいくつかのリスクもあります:

  1. パラメータの設定が正しくない場合,良い取引機会が失われる可能性があります.異なる期間,ATRの倍数,EMAの期間をテストすることができます.

  2. パラメータを調整することで 減少する可能性があります

  3. ストップ・ロスの幅が大きすぎる場合,ストップ・ロスの範囲は適切に締め切らなければなりません.

  4. バックテストデータでは,簡単にオーバーフィット問題が生じます.マルチマーケット,マルチタイムフレームのテストを注意してください.

オプティマイゼーションの方向性

この戦略を最適化できるいくつかの方法:

  1. 最適なパラメータ組み合わせをテストする. 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]")

もっと