Chiến lược siêu xu hướng V

Tác giả:ChaoZhang, Ngày: 2023-10-18 12:35:53
Tags:

img

Tổng quan

Chiến lược siêu xu hướng V là một chiến lược giao dịch ngắn hạn dựa trên đường trung bình động và lệch chuẩn. Nó sử dụng chỉ số siêu xu hướng để xác định hướng xu hướng giá và kết hợp hỗ trợ và kháng cự được hình thành bởi đường trung bình động để vào thị trường. Trong khi đó, nó sử dụng kênh lệch chuẩn để dự đoán các vùng hỗ trợ và kháng cự tiềm năng của giá và thiết lập phạm vi giá dừng lỗ và lấy lợi nhuận để thực hiện một chiến lược giao dịch ngắn hạn theo xu hướng và hiệu quả.

Chiến lược logic

Đầu tiên, chiến lược này tính toán chỉ số siêu xu hướng. Chỉ số siêu xu hướng sử dụng mối quan hệ giữa ATR và giá để xác định hướng xu hướng. Khi giá trên xu hướng tăng, nó tăng. Khi giá dưới xu hướng giảm, nó giảm.

Sau đó, nó tính toán EMA của giá và EMA của giá mở. Khi giá vượt qua trên EMA và cao hơn EMA giá mở, đó là tín hiệu mua. Khi giá vượt qua dưới EMA và thấp hơn EMA giá mở, đó là tín hiệu bán.

Tiếp theo, nó sử dụng độ lệch chuẩn để tính toán các dải trên và dưới của kênh giá và thực hiện xử lý làm mịn. Khi giá vượt qua dải trên của độ lệch chuẩn, đó là tín hiệu dừng lỗ. Khi giá vượt qua dải dưới của độ lệch chuẩn, đó là tín hiệu lấy lợi nhuận.

Cuối cùng, nó kết hợp các đường trung bình động của các khung thời gian khác nhau để xác định hướng xu hướng, cùng với chỉ số Super Trend, để hình thành một đánh giá xu hướng ổn định.

Ưu điểm của Chiến lược

  • Sử dụng chỉ số Super Trend để xác định hướng xu hướng giá, tránh tổn thất do đảo ngược xu hướng
  • Mức trung bình động kết hợp với giá mở giúp xác định thời gian nhập cảnh, tránh phân tích sai
  • Kênh lệch chuẩn dự đoán các vùng hỗ trợ và kháng cự tiềm năng của giá để dừng lỗ và lấy lợi nhuận
  • Sự kết hợp nhiều khung thời gian cải thiện sự ổn định của phán đoán xu hướng

Rủi ro của chiến lược

  • Chỉ số siêu xu hướng có tác dụng chậm, có thể bỏ lỡ các điểm thay đổi xu hướng
  • Crossover của đường trung bình động có hiệu ứng chậm, thời gian nhập có thể không chính xác
  • Phạm vi kênh lệch chuẩn quá cố định để phản ánh biến động thị trường trong thời gian thực
  • Phán quyết dựa trên nhiều khung thời gian có thể xung đột với nhau

Quản lý rủi ro:

  • Giảm các thông số Super Trend đúng cách để cải thiện độ nhạy
  • Tối ưu hóa thời gian trung bình động hoặc thêm các chỉ số khác để xác định mục nhập
  • Điều chỉnh kênh độ lệch chuẩn một cách năng động để phù hợp với thị trường
  • Xác định logic rõ ràng cho các phán quyết nhiều khung thời gian để xử lý xung đột

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

  • Tối ưu hóa các thông số siêu xu hướng để tìm kết hợp tốt nhất
  • Hãy thử các chỉ số khác kết hợp với trung bình động để xác định mục nhập
  • Thử điều chỉnh động của kênh lệch chuẩn
  • Kiểm tra các kết hợp nhiều khung thời gian khác nhau để tìm sự phù hợp tốt nhất
  • Tối ưu hóa chiến lược dừng lỗ và kiếm lợi nhuận để cải thiện không gian lợi nhuận

Kết luận

Chiến lược Super Trend V tích hợp các lợi thế của xu hướng, trung bình động, kênh lệch chuẩn và các chỉ số khác để đạt được phán đoán xu hướng ổn định, thời gian vào đúng, và dừng lỗ và lấy lợi nhuận dựa trên các vùng giá. Bằng cách tối ưu hóa các tham số, chỉ số, dừng lỗ và lấy lợi nhuận, vv, nó có thể cải thiện sự ổn định và lợi nhuận của chiến lược.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © theCrypster 2020

//@version=4
strategy(title = "Super trend V Strategy version", overlay = true, pyramiding=1,initial_capital = 1000, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.075)
strat_dir_input = input(title="Strategy Direction", defval="long", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol = (volume / hilow)
spreadvol = (openclose * vol)
VPT = spreadvol + cum(spreadvol)
window_len = 28

v_len = 14
price_spread = stdev(high-low, window_len)

v =  spreadvol + cum(spreadvol)
smooth = sma(v, v_len)
v_spread = stdev(v - smooth, window_len)
shadow = (v - smooth) / v_spread * price_spread

out = shadow > 0 ? high + shadow : low + shadow
//
src = out
src1=open
src2=low
src3=high
tf =input(720)
len = timeframe.isintraday and timeframe.multiplier >= 1 ? 
   tf / timeframe.multiplier * 7 : 
   timeframe.isintraday and timeframe.multiplier < 60 ? 
   60 / timeframe.multiplier * 24 * 7 : 7

c = ema(src, len)
plot(c,color=color.red)
o = ema(src1,len)
plot(o,color=color.blue)
//h = ema(src3,len)
//l=ema(src2,len)
//
col=c > o? color.lime : color.orange
vis = true
vl = c
ll = o
m1 = plot(vl, color=col, linewidth=1, transp=60)
m2 = plot(vis ? ll : na,  color=col, linewidth=2, transp=80)

fill(m1, m2,  color=col, transp=70)
//

vpt=ema(out,len)

// INPUTS //
st_mult   = input(1,   title = 'SuperTrend Multiplier', minval = 0, maxval = 100, step = 0.01)
st_period = input(10, title = 'SuperTrend Period',     minval = 1)

// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))

up_trend   = 0.0
up_trend   := close[1] > up_trend[1]   ? max(up_lev, up_trend[1])   : up_lev

down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev

// Calculate trend var
trend = 0
trend := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend[1], 1)

// Calculate SuperTrend Line
st_line = trend ==1 ? up_trend : down_trend

// Plotting
plot(st_line[1], color = trend == 1 ? color.green : color.red , style = plot.style_cross, linewidth = 2, title = "SuperTrend")
buy=crossover( close, st_line) and close>o
sell=crossunder(close, st_line) and close<o
//plotshape(crossover( close, st_line), location = location.belowbar, color = color.green,size=size.tiny)
//plotshape(crossunder(close, st_line), location = location.abovebar, color = color.red,size=size.tiny)
plotshape(buy, title="buy", text="Buy", color=color.green, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(sell, title="sell", text="Sell", color=color.red, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0)  //plot for sell icon


//
multiplier = input(title="TP VWAP Deviation", type=input.float, defval=2, minval=1)
src5 = vwap
len5 = input(title="TP length", defval=150, minval=1)
offset = 0

calcSlope(src5, len5) =>
    sumX = 0.0
    sumY = 0.0
    sumXSqr = 0.0
    sumXY = 0.0
    for i = 1 to len5
        val = src5[len5-i]
        per = i + 1.0
        sumX := sumX + per
        sumY := sumY + val
        sumXSqr := sumXSqr + per * per
        sumXY := sumXY + val * per
        
        
    slope = (len5 * sumXY - sumX * sumY) / (len5 * sumXSqr - sumX * sumX)
    average = sumY / len5
    intercept = average - slope * sumX / len5 + slope
    [slope, average, intercept]

var float tmp = na
[s, a, i] = calcSlope(src5, len5)

vwap1=(i + s * (len5 - offset))
sdev = stdev(vwap, len5)
dev = multiplier * sdev
top=vwap1+dev
bott=vwap1-dev

//
z1 = vwap1 + dev
x1 = vwap1 - dev

low1 = crossover(close, x1)  
high1 = crossunder(close, z1) 

plotshape(low1, title="low", text="TP", color=color.red, style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.white, transp=0)  //plot for buy icon
plotshape(high1, title="high", text="TP", color=color.green, style=shape.labeldown, location=location.abovebar, size=size.small, textcolor=color.white, transp=0)  //plot for sell icon



//
// Testing Start dates
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

l = buy
s1 = sell
        
if l and testPeriod()
    strategy.entry("buy", strategy.long)
if s1 and testPeriod()
    strategy.entry("sell", strategy.short)



Thêm nữa