Chiến lược hai hướng SuperTrend

Tác giả:ChaoZhang, Ngày: 2023-10-08 15:02:45
Tags:

Tổng quan

Chiến lược này sử dụng các dải trên và dưới được tính toán dựa trên chỉ số ATR để xác định hướng xu hướng hiện tại và tạo ra tín hiệu mua và bán. Nó đề xuất dài khi giá vượt qua dải trên và ngắn khi giá vượt qua dải dưới.

Chiến lược logic

  1. Tính toán chỉ số ATR, đại diện cho phạm vi biến động giá trung bình.
  2. Tính toán các dải trên và dưới dựa trên giá trị ATR nhân một yếu tố.
  3. Xác định hướng xu hướng dựa trên mối quan hệ của giá với các dải.
    • Khi giá trên dải trên, đó là xu hướng tăng.
    • Khi giá thấp hơn dải dưới, đó là xu hướng giảm.
  4. Tạo tín hiệu mua và bán khi xu hướng thay đổi hướng.
    • Một tín hiệu mua được tạo ra gần dải trên khi xu hướng thay đổi từ xu hướng giảm sang xu hướng tăng.
    • Một tín hiệu bán được tạo ra gần dải dưới khi xu hướng thay đổi từ xu hướng tăng xuống xu hướng giảm.
  5. Hình dung các dải trên/dưới, hướng xu hướng và tín hiệu giao dịch.

Phân tích lợi thế

  • Sử dụng ATR để xác định xu hướng có thể điều chỉnh các dải theo biến động thị trường bằng cách điều chỉnh các tham số.
  • Khám phá sự đảo ngược xu hướng kịp thời bằng cách phá vỡ các dải.
  • Bộ lọc tín hiệu theo hướng xu hướng để tránh đột phá giả.
  • Hiển thị rõ ràng các băng tần và tín hiệu.

Phân tích rủi ro

  • Thời gian ATR không phù hợp có thể tách các băng tần khỏi giá.
  • Nhiều nhân quá lớn / nhỏ gây ra nhiều tín hiệu sai và tín hiệu chậm.
  • Thời gian đảo ngược không chính xác dẫn đến tổn thất từ giao dịch đảo ngược.
  • Cần các bộ lọc khác để giảm bị chém.

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

  • Tối ưu hóa năng động của thời gian ATR để phù hợp với biến động thị trường.
  • Điều chỉnh tham số cho các sản phẩm và khung thời gian khác nhau.
  • Kết hợp các chỉ số khác như khối lượng để xác nhận xu hướng.
  • Sử dụng máy học để tối ưu hóa tham số.

Tóm lại

Chiến lược này thực hiện ý tưởng xác định xu hướng hai hướng dựa trên ATR. Các tín hiệu đột phá được tạo ra và lọc theo hướng xu hướng để tránh các tín hiệu giả. Các tham số có thể được điều chỉnh cho các môi trường thị trường khác nhau.


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

TradeId = "RVG"

InitCapital = 1000
InitPosition = 1000
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true

//@version=4
// strategy("Supertrend RG", overlay = true,process_orders_on_close=true,commission_type=strategy.commission.percent,commission_value=InitCommission,
//  currency=currency.USD,initial_capital=InitCapital,default_qty_type=strategy.cash, default_qty_value=InitPosition, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick,pyramiding=InitPyramidMax)

//
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2018, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true



Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


strategy.entry(TradeId + " Long", true, when=buySignal[1] and time_cond)
strategy.entry(TradeId + " Short", false, when=sellSignal[1] and time_cond)   




Thêm nữa