Chiến lược đột phá siêu xu hướng ba lần

Tác giả:ChaoZhang, Ngày: 21-12-2023 12:05:07
Tags:

img

Tổng quan

Chiến lược đột phá siêu xu hướng ba là một chiến lược được sử dụng phổ biến sử dụng nhiều đường siêu xu hướng với các thiết lập tham số khác nhau và EMA xác định xu hướng để xác định hướng xu hướng và giao dịch. Ý tưởng chính của chiến lược này là thiết lập các vị trí dài khi ít nhất hai đường siêu xu hướng đang hiển thị xu hướng tăng trên đường EMA xác định xu hướng, và thiết lập các vị trí ngắn khi ít nhất hai đường siêu xu hướng đang hiển thị xu hướng giảm dưới đường EMA xác định xu hướng.

Nguyên tắc chiến lược

Chiến lược này sử dụng ba đường siêu xu hướng với các thông số khác nhau và đường EMA xác định xu hướng chính để xác định các bước vào và ra:

  1. Thiết lập ba đường siêu xu hướng - siêu xu hướng1, siêu xu hướng2, siêu xu hướng3, với màu xanh lá cây cho thấy xu hướng tăng và màu đỏ cho thấy xu hướng giảm.

  2. Thiết lập một đường EMA ematrend để xác định xu hướng chính. Khi cả ba đường siêu xu hướng trên đường EMA này, thị trường được xác định là đang trong xu hướng tăng, và ngược lại đối với xu hướng giảm.

  3. Khi ít nhất hai đường siêu xu hướng cho thấy xu hướng tăng (xanh) đồng thời trong điều kiện của một thị trường xu hướng tăng lớn, tức là giá trị hướng nhỏ hơn 0, nó được đánh giá là tín hiệu dài; khi ít nhất hai đường siêu xu hướng cho thấy xu hướng giảm (màu đỏ) đồng thời trong điều kiện của một thị trường xu hướng giảm lớn, tức là giá trị hướng lớn hơn 0, nó được đánh giá là tín hiệu ngắn.

  4. Sau đó, mở các vị trí dài / ngắn khi các tín hiệu được kích hoạt.

  5. Thiết lập các điều kiện dừng lỗ và lấy lợi nhuận. Lợi nhuận cố định được thiết lập ở tỷ lệ rủi ro / phần thưởng là 3; Lợi nhuận dừng lại được thiết lập ở mức giảm một ATR.

  6. Đóng các vị trí khi các điều kiện dừng lỗ hoặc lấy lợi nhuận được kích hoạt.

Phân tích lợi thế

Những lợi thế của chiến lược này bao gồm:

  1. Sử dụng ba đường siêu xu hướng kết hợp với EMA đánh giá xu hướng có thể xác định hiệu quả các tín hiệu xu hướng.

  2. Các điều kiện dài và ngắn là rõ ràng và dễ hiểu và thực hiện.

  3. Thiết lập lệnh dừng lỗ và lợi nhuận cố định quản lý rủi ro hiệu quả.

  4. Hyperparameters có thể được điều chỉnh khi cần thiết để tối ưu hóa chiến lược.

Phân tích rủi ro

Ngoài ra còn có một số rủi ro cho chiến lược này:

  1. Cài đặt tham số không chính xác có thể dẫn đến việc bỏ lỡ các cơ hội giao dịch tốt.

  2. Có một số khả năng thất bại, điều này có thể được giảm bằng cách điều chỉnh các thông số.

  3. Đặt stop loss hoặc take profit quá rộng có thể làm tăng xác suất mất mát.

  4. Dữ liệu backtest có thể dễ dàng dẫn đến các vấn đề quá phù hợp.

Hướng dẫn tối ưu hóa

Một số cách để tối ưu hóa chiến lược này:

  1. Kiểm tra các kết hợp thông số tối ưu. Các kết hợp khác nhau của các khoảng thời gian ATR, số nhân và khoảng thời gian EMA có thể được kiểm tra để tìm ra tốt nhất.

  2. Tăng các loại giao dịch. Có thể thêm cổ phiếu, tiền điện tử vv để kiểm tra hiệu quả trên các thị trường.

  3. Kết hợp với các chỉ số khác để lọc tín hiệu. Ví dụ, RSI, MACD vv có thể được thêm để tránh đọc sai các tín hiệu xu hướng.

  4. Tối ưu hóa cơ chế dừng lỗ và lấy lợi nhuận.

Kết luận

Tóm lại, chiến lược đột phá siêu xu hướng ba là một chiến lược theo xu hướng tương đối đơn giản và thực tế. Nó kết hợp nhiều đường siêu xu hướng và EMA đánh giá xu hướng để khám phá cơ hội và quản lý rủi ro hiệu quả. Thông qua tối ưu hóa tham số và logic, kết quả tốt hơn có thể đạt được. Chiến lược này dễ hiểu và đáng học hỏi.


/*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]")

Thêm nữa