Chiến lược giao dịch trung bình động điều chỉnh biến động

Tác giả:ChaoZhang, Ngày: 2023-11-07 17:18:05
Tags:

img

Tổng quan

Chiến lược này sử dụng sự kết hợp của trung bình động T3, chỉ số ATR và Heikin Ashi để xác định tín hiệu mua và bán, và sử dụng ATR để tính toán mức dừng lỗ và lấy lợi nhuận cho xu hướng sau giao dịch.

Phân tích nguyên tắc

Tính toán chỉ số

  • T3 Moving Average: Tính toán một đường trung bình di chuyển T3 trơn (thời gian mặc định 100) để xác định hướng xu hướng

  • ATR: Tính toán phạm vi trung bình thực sự, được sử dụng để xác định kích thước dừng lỗ / lấy lợi nhuận

  • ATR Trailing Stop: Tính toán stop loss dựa trên ATR điều chỉnh dựa trên biến động giá và biến động

Logic thương mại

  • Tín hiệu mua: Được kích hoạt khi đóng vượt trên ATR trailing stop và dưới trung bình động T3

  • Tín hiệu bán: Được kích hoạt khi đóng chéo dưới ATR trailing stop và trên trung bình động T3

  • Stop Loss/Take Profit: Sau khi nhập, giá stop loss và take profit được tính dựa trên ATR và tỷ lệ rủi ro/lợi nhuận được xác định bởi người dùng

Nhập và ra

  • Long Entry: Stop loss là giá nhập trừ ATR, take profit là giá nhập cộng ATR * tỷ lệ rủi ro/lợi nhuận

  • Short Entry: Stop loss là giá nhập cộng ATR, take profit là giá nhập trừ ATR * tỷ lệ rủi ro/lợi nhuận

  • Ra khỏi khi giá đạt mức dừng lỗ hoặc lấy lợi nhuận

Phân tích lợi thế

Phản ứng nhanh chóng

Thời gian mặc định trung bình động T3 là 100, nhạy cảm hơn so với trung bình động điển hình để phản ứng nhanh hơn với những thay đổi giá

Kiểm soát rủi ro

ATR trailing stop di chuyển với biến động thị trường để tránh bị dừng lại.

Xu hướng tiếp theo

ATR trailing stop theo xu hướng, tránh thoát sớm ngay cả trong thời gian rút ngắn

Tối ưu hóa tham số

Thời gian cho cả T3 và ATR có thể được tối ưu hóa cho các thị trường khác nhau để cải thiện độ vững chắc

Phân tích rủi ro

Dừng Loss Breakeven

Sự chuyển động giá nghiêm trọng có thể xâm nhập stop loss gây ra lỗ. có thể mở rộng thời gian ATR và khoảng cách dừng.

Sự đảo ngược xu hướng

Mất khả năng nếu xu hướng đảo ngược và giá vượt qua dừng lại.

Tối ưu hóa quá phù hợp

Tối ưu hóa tham số có nguy cơ quá phù hợp với dữ liệu lịch sử hạn chế. Cần tối ưu hóa mạnh mẽ trên các thị trường / khung thời gian.

Cơ hội cải thiện

  • Kiểm tra các khoảng thời gian trung bình động T3 khác nhau để tìm sự cân bằng tối ưu về độ nhạy và ổn định

  • Tối ưu hóa thời gian ATR để tìm ra kiểm soát rủi ro tốt nhất và xu hướng sau cân bằng

  • Kết hợp chỉ số RSI, MACD để tránh giao dịch sai ở các điểm chuyển đổi

  • Học máy cho các thông số tự động tối ưu, giảm sự thiên vị bằng tay

  • Thêm các quy tắc kích thước vị trí để kiểm soát rủi ro tốt hơn

Tóm lại

Chiến lược này kết hợp các lợi thế của T3 và ATR để cho phép phản ứng nhanh chóng với kiểm soát rủi ro. Tăng cường hơn nữa về sự ổn định và hiệu quả có thể thông qua tối ưu hóa tham số và các bộ lọc bổ sung. Nhưng các nhà giao dịch vẫn nên theo dõi rủi ro đảo ngược và cân bằng, và tránh quá phụ thuộc vào kết quả backtest.


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

//@version=5
strategy(title='UT Bot Alerts (QuantNomad) Strategy w/ NinjaView', overlay=true)
T3 = input(100)//600
// Input for Long Settings
// Input for Long Settings


xPrice3 = close
xe1 = ta.ema(xPrice3, T3)
xe2 = ta.ema(xe1, T3)
xe3 = ta.ema(xe2, T3)
xe4 = ta.ema(xe3, T3)
xe5 = ta.ema(xe4, T3)
xe6 = ta.ema(xe5, T3)

b3 = 0.7
c1 = -b3*b3*b3
c2 = 3*b3*b3+3*b3*b3*b3
c3 = -6*b3*b3-3*b3-3*b3*b3*b3
c4 = 1+3*b3+b3*b3*b3+3*b3*b3
nT3Average = c1 * xe6 + c2 * xe5 + c3 * xe4 + c4 * xe3

//plot(nT3Average, color=color.white, title="T3")

// Buy Signal - Price is below T3 Average
buySignal3 = xPrice3 < nT3Average
sellSignal3 = xPrice3 > nT3Average
// Inputs
a = input(1, title='Key Value. "This changes the sensitivity"')
c = input(50, title='ATR Period')
h = input(true, title='Signals from Heikin Ashi Candles')
riskRewardRatio = input(1, title='Risk Reward Ratio')

xATR = ta.atr(c)
nLoss = a * xATR

src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close

xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossunder(ema, xATRTrailingStop)

buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below

barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop

plotshape(buy, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(sell, title='Sell', text='Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

barcolor(barbuy ? color.new(color.green, 90) : na)
barcolor(barsell ? color.new(color.red, 90) : na)

var float entryPrice = na
var float takeProfitLong = na
var float stopLossLong = na
var float takeProfitShort = na
var float stopLossShort = na

if buy and buySignal3
    entryPrice := src
    takeProfitLong := entryPrice + nLoss * riskRewardRatio
    stopLossLong := entryPrice - nLoss
    takeProfitShort := na
    stopLossShort := na

if sell and sellSignal3
    entryPrice := src
    takeProfitShort := entryPrice - nLoss * riskRewardRatio
    stopLossShort := entryPrice + nLoss
    takeProfitLong := na
    stopLossLong := na

// Strategy order conditions
acct = "Sim101"
ticker = "ES 12-23"
qty = 1

OCOMarketLong = '{ "alert": "OCO Market Long", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '", "qty": "' + str.tostring(qty) + '", "take_profit_price": "' + str.tostring(takeProfitLong) + '", "stop_price": "' + str.tostring(stopLossLong) + '", "tif": "DAY" }'
OCOMarketShort = '{ "alert": "OCO Market Short", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '", "qty": "' + str.tostring(qty) + '", "take_profit_price": "' + str.tostring(takeProfitShort) + '", "stop_price": "' + str.tostring(stopLossShort) + '", "tif": "DAY" }'
CloseAll = '{ "alert": "Close All", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '" }'

strategy.entry("Long", strategy.long, when=buy ,alert_message=OCOMarketLong)
strategy.entry("Short", strategy.short, when=sell , alert_message=OCOMarketShort)

// Setting the take profit and stop loss for long trades
strategy.exit("Take Profit/Stop Loss", "Long", stop=stopLossLong, limit=takeProfitLong,alert_message=CloseAll)

// Setting the take profit and stop loss for short trades
strategy.exit("Take Profit/Stop Loss", "Short", stop=stopLossShort, limit=takeProfitShort,alert_message=CloseAll)

// Plot trade setup boxes
bgcolor(buy ? color.new(color.green, 90) : na, transp=0, offset=-1)
bgcolor(sell ? color.new(color.red, 90) : na, transp=0, offset=-1)

longCondition = buy and not na(entryPrice)
shortCondition = sell and not na(entryPrice)

var line longTakeProfitLine = na
var line longStopLossLine = na
var line shortTakeProfitLine = na
var line shortStopLossLine = na

if longCondition
    longTakeProfitLine := line.new(bar_index, takeProfitLong, bar_index + 1, takeProfitLong, color=color.green, width=2)
    longStopLossLine := line.new(bar_index, stopLossLong, bar_index + 1, stopLossLong, color=color.red, width=2)
    label.new(bar_index + 1, takeProfitLong, str.tostring(takeProfitLong, "#.#####"), color=color.green, style=label.style_none, textcolor=color.green, size=size.tiny)
    label.new(bar_index + 1, stopLossLong, str.tostring(stopLossLong, "#.#####"), color=color.red, style=label.style_none, textcolor=color.red, size=size.tiny)

if shortCondition
    shortTakeProfitLine := line.new(bar_index, takeProfitShort, bar_index + 1, takeProfitShort, color=color.green, width=2)
    shortStopLossLine := line.new(bar_index, stopLossShort, bar_index + 1, stopLossShort, color=color.red, width=2)
    label.new(bar_index + 1, takeProfitShort, str.tostring(takeProfitShort, "#.#####"), color=color.green, style=label.style_none, textcolor=color.green, size=size.tiny)
    label.new(bar_index + 1, stopLossShort, str.tostring(stopLossShort, "#.#####"), color=color.red, style=label.style_none, textcolor=color.red, size=size.tiny)

alertcondition(buy, 'UT Long', 'UT Long')
alertcondition(sell, 'UT Short', 'UT Short')


Thêm nữa