Chiến lược giao dịch đường dừng chuyển động thích nghi

Tác giả:ChaoZhang, Ngày: 2024-02-21 16:07:20
Tags:

img

Tổng quan

Ý tưởng cốt lõi của chiến lược này là sử dụng đường trung bình động T3 và ATR để nắm bắt các điểm vào và ra dọc theo xu hướng. Nó thuộc về các chiến lược theo xu hướng. Các tín hiệu giao dịch được tạo ra khi giá vượt qua đường T3, và mức dừng lỗ và lấy lợi nhuận được đặt bằng cách sử dụng giá trị ATR tại điểm đột phá để đạt được dừng lỗ tự động và lấy lợi nhuận.

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

Chiến lược bao gồm chỉ số T3, chỉ số ATR và cơ chế dừng kéo theo ATR.

Trung bình di chuyển T3 là một trung bình di chuyển mịn mà có thể làm giảm sự chậm trễ của đường cong và làm cho nó phản ứng nhanh hơn với sự thay đổi giá. Một tín hiệu mua được tạo ra khi giá phá vỡ trung bình di chuyển từ dưới. Một tín hiệu bán được tạo ra khi giá phá vỡ từ trên.

Chỉ số ATR được sử dụng để tính toán mức độ biến động của thị trường và thiết lập mức dừng lỗ. Giá trị ATR càng lớn, biến động thị trường càng lớn, và mức dừng lỗ rộng hơn nên được thiết lập. Giá trị ATR càng nhỏ, biến động thị trường càng nhỏ, và mức dừng lỗ hẹp hơn có thể được thiết lập.

Cơ chế dừng lại sau ATR điều chỉnh vị trí đường dừng lỗ dựa trên các giá trị ATR trong thời gian thực, để đường dừng lỗ có thể theo dõi chuyển động giá và ở trong phạm vi hợp lý. Điều này ngăn chặn việc dừng lỗ quá gần và dễ bị loại bỏ, và cũng ngăn chặn việc dừng lỗ quá rộng để kiểm soát rủi ro hiệu quả.

Bằng cách sử dụng T3 để xác định hướng, ATR để tính biến động và cơ chế dừng kéo theo ATR, chiến lược này đạt được việc bắt xu hướng và kiểm soát rủi ro tương đối hiệu quả.

Ưu điểm

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

  1. Việc áp dụng đường T3 cải thiện độ chính xác của xu hướng bắt.

  2. Chỉ số ATR tính toán biến động thị trường một cách năng động, làm cho mức dừng lỗ và lấy lợi nhuận hợp lý hơn.

  3. Cơ chế ATR trailing stop cho phép đường dừng lỗ theo dõi chuyển động giá trong thời gian thực để kiểm soát rủi ro hiệu quả.

  4. Tích hợp các chỉ số và cơ chế dừng lỗ để đạt được giao dịch theo dõi xu hướng tự động.

  5. Có thể kết nối với các nền tảng giao dịch bên ngoài thông qua webhook để thực hiện lệnh tự động.

Rủi ro và giải pháp

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

  1. Các thiết lập tham số T3 không chính xác có thể bỏ lỡ cơ hội xu hướng tốt hơn. Các tham số chu kỳ khác nhau có thể được thử nghiệm để tìm ra các giá trị tối ưu.

  2. Tính toán giá trị ATR không chính xác có thể dẫn đến khoảng cách dừng lỗ quá lớn hoặc quá nhỏ để kiểm soát rủi ro một cách hiệu quả.

  3. Trong các biến động mạnh mẽ, đường dừng lỗ có thể bị phá vỡ dẫn đến tổn thất quá mức.

  4. Việc kích hoạt stop loss thường xuyên có thể xảy ra trên thị trường whipsaw.

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

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa tham số T3 để tìm chu kỳ làm mịn phù hợp nhất.

  2. Kiểm tra các thông số chu kỳ ATR khác nhau để tính giá trị ATR phản ánh tốt nhất sự biến động của thị trường.

  3. Tối ưu hóa phạm vi linh hoạt của khoảng cách dừng phía sau ATR để tránh dừng quá nhạy cảm.

  4. Thêm các bộ lọc thích hợp để tránh giao dịch thường xuyên trên thị trường whipsaw.

  5. Bao gồm các chỉ số đánh giá xu hướng để cải thiện độ chính xác lợi nhuận theo hướng.

  6. Sử dụng các phương pháp học máy để tối ưu hóa các tham số tự động.

Kết luận

Chiến lược này tích hợp việc sử dụng đường T3 để xác định hướng xu hướng, chỉ số ATR để tính toán dừng / mục tiêu và cơ chế dừng sau ATR để điều chỉnh khoảng cách dừng. Nó đạt được theo dõi xu hướng tự động và kiểm soát rủi ro hiệu quả.


/*backtest
start: 2024-01-21 00:00:00
end: 2024-02-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='UT Bot Alerts (QuantNomad) Strategy', 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 and buySignal3, alert_message=OCOMarketLong)
strategy.entry("Short", strategy.short, when=sell and sellSignal3, 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