Triple Supertrend với chiến lược EMA và ADX

Tác giả:ChaoZhang, Ngày: 2023-09-18 14:02:12
Tags:

Tổng quan

Đây là một chiến lược giao dịch định lượng kết hợp các chỉ số siêu xu hướng ba, EMA và ADX. Nó tạo ra các tín hiệu giao dịch bằng cách sử dụng hệ thống siêu xu hướng ba và áp dụng EMA và ADX như bộ lọc để kiểm soát tần suất giao dịch và cải thiện chất lượng tín hiệu.

Chiến lược logic

  • Sử dụng ba hệ thống siêu xu hướng với các thông số khác nhau và tạo ra các tín hiệu giao dịch khi cả ba siêu xu hướng đồng ý về hướng.

  • Áp dụng EMA như một bộ lọc xu hướng, chỉ đi dài khi đóng là trên EMA và đi ngắn khi đóng là dưới EMA.

  • Áp dụng ADX như một bộ lọc sức mạnh xu hướng, chỉ giao dịch khi ADX vượt quá ngưỡng.

  • Cho phép tùy chọn tái nhập để điều chỉnh lợi nhuận và kiểm soát rủi ro.

Cụ thể, điều kiện nhập cảnh dài là khi cả ba siêu xu hướng trở nên tăng, đóng là trên EMA và ADX cao hơn ngưỡng. Điều kiện nhập cảnh ngắn là khi cả ba siêu xu hướng trở nên giảm, đóng là dưới EMA và ADX cao hơn ngưỡng. Ra khi bất kỳ siêu xu hướng nào đảo chiều.

Chiến lược cũng vẽ đường hỗ trợ và đường kháng cự siêu xu hướng để hỗ trợ xác định xu hướng trực quan.

Phân tích lợi thế

  • Hệ thống siêu xu hướng ba lần lọc các đột phá sai và cải thiện độ chính xác nhập cảnh.

  • EMA và ADX bộ lọc kép làm giảm tổn thất và cải thiện quản lý rủi ro.

  • Tùy chọn nhập lại cho phép điều chỉnh lợi nhuận dựa trên ưu tiên rủi ro.

  • Các đường siêu xu hướng trực quan giúp xác định hướng xu hướng.

Phân tích rủi ro

  • Supertrend và các chỉ số khác có sự chậm trễ và có thể gây ra sự gia nhập muộn hoặc thoát sớm.

  • Các bộ lọc quá nghiêm ngặt có thể bỏ lỡ cơ hội.

  • Whipsaws có thể gây ra tổn thất trong các thị trường giới hạn phạm vi.

  • Cho phép nhập cảnh lại làm tăng tần suất giao dịch và chi phí trượt.

Những rủi ro này có thể được giảm bằng cách tối ưu hóa các tham số, bộ lọc và sử dụng các điểm dừng động.

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

Chiến lược này có thể được tối ưu hóa trong một số khía cạnh:

  • Kiểm tra các kết hợp tham số khác nhau để tìm ra cài đặt siêu xu hướng và EMA tối ưu.

  • Tối ưu hóa ngưỡng ADX để giảm tín hiệu sai.

  • Thêm các bộ lọc khác như biến động, khối lượng vv

  • Tối ưu hóa các tham số riêng biệt cho các sản phẩm khác nhau.

  • Xây dựng các cơ chế dừng lỗ năng động để kiểm soát rủi ro tốt hơn.

  • Khám phá máy học để tìm ra các quy tắc nhập và xuất tốt hơn.

Tóm lại

Chiến lược này sử dụng điểm mạnh của hệ thống siêu xu hướng ba và tăng cường nó với bộ lọc kép EMA và ADX để cải thiện hiệu quả chất lượng tín hiệu và kiểm soát rủi ro. Các cải tiến thêm về các thông số, bộ lọc, dừng động có thể cải thiện độ mạnh mẽ và khả năng thích nghi của nó. Kết hợp với phân tích xu hướng, nó cung cấp các tín hiệu vào và ra hiệu quả cho giao dịch định lượng.


/*backtest
start: 2023-08-18 00:00:00
end: 2023-09-17 00:00:00
period: 2h
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/
// ©kunjandetroja


//@version=5
strategy('Triple Supertrend with EMA and ADX', overlay=true)

m1 = input.float(1,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 1')
m2 = input.float(2,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 2')
m3 = input.float(3,"ATR Multi",minval = 1,maxval= 6,step=0.5,group='ST 3')
p1 = input.int(10,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 1')
p2 = input.int(15,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 2')
p3 = input.int(20,"ATR Multi",minval = 5,maxval= 25,step=1,group='ST 3')
len_EMA = input.int(200,"EMA Len",minval = 5,maxval= 250,step=1)
len_ADX = input.int(14,"ADX Len",minval = 1,maxval= 25,step=1)
len_Di = input.int(14,"Di Len",minval = 1,maxval= 25,step=1)
adx_above = input.float(25,"adx filter",minval = 1,maxval= 50,step=0.5)
var bool long_position = false
adx_filter = input.bool(false, "Add Adx & EMA filter")
renetry = input.bool(true, "Allow Reentry")

f_getColor_Resistance(_dir, _color) =>
    _dir == 1 and _dir == _dir[1] ? _color : na
f_getColor_Support(_dir, _color) =>
    _dir == -1 and _dir == _dir[1] ? _color : na

[superTrend1, dir1] = ta.supertrend(m1, p1)
[superTrend2, dir2] = ta.supertrend(m2, p2)
[superTrend3, dir3] = ta.supertrend(m3, p3)
EMA = ta.ema(close, len_EMA)
[diplus,diminus,adx] = ta.dmi(len_Di,len_ADX)

// ADX Filter
adxup = adx > adx_above and close > EMA
adxdown = adx > adx_above and close < EMA

sum_dir = dir1 + dir2 + dir3

dir_long = if(adx_filter == false)
    sum_dir == -3
else
    sum_dir == -3 and adxup
dir_short = if(adx_filter == false)
    sum_dir == 3
else
    sum_dir == 3 and adxdown
Exit_long = dir1 == 1 and dir1 != dir1[1]
Exit_short = dir1 == -1 and dir1 != dir1[1]

// BuySignal = dir_long and dir_long != dir_long[1]
// SellSignal = dir_short and dir_short != dir_short[1]
// if BuySignal
//     label.new(bar_index, low, 'Long', style=label.style_label_up)
// if SellSignal
//     label.new(bar_index, high, 'Short', style=label.style_label_down)

longenter = if(renetry == false)
    dir_long and long_position == false
else
    dir_long
shortenter = if(renetry == false)
    dir_short and long_position == true
else
    dir_short
if longenter
    long_position := true
if shortenter
    long_position := false

strategy.entry('BUY', strategy.long, when=longenter)
strategy.entry('SELL', strategy.short, when=shortenter)   
strategy.close('BUY', Exit_long)
strategy.close('SELL', Exit_short)

buy1 = ta.barssince(dir_long)
sell1 = ta.barssince(dir_short)

colR1 = f_getColor_Resistance(dir1, color.red)
colS1 = f_getColor_Support(dir1, color.green)

colR2 = f_getColor_Resistance(dir2, color.orange)
colS2 = f_getColor_Support(dir2, color.yellow)

colR3 = f_getColor_Resistance(dir3, color.blue)
colS3 = f_getColor_Support(dir3, color.maroon)

plot(superTrend1, 'R1', colR1, linewidth=2)
plot(superTrend1, 'S1', colS1, linewidth=2)

plot(superTrend2, 'R1', colR2, linewidth=2)
plot(superTrend2, 'S1', colS2, linewidth=2)

plot(superTrend3, 'R1', colR3, linewidth=2)
plot(superTrend3, 'S1', colS3, linewidth=2)

// // Intraday only
// var int new_day = na
// var int new_month = na
// var int new_year = na
// var int close_trades_after_time_of_day = na

// if dayofmonth != dayofmonth[1]
//     new_day := dayofmonth
// if month != month[1]
//     new_month := month
// if year != year[1]
//     new_year := year
// close_trades_after_time_of_day := timestamp(new_year,new_month,new_day,15,15)

// strategy.close_all(time > close_trades_after_time_of_day) 


Thêm nữa