Chiến lược giao dịch trung bình động dừng thích ứng


Ngày tạo: 2024-02-21 16:07:20 sửa đổi lần cuối: 2024-02-21 16:07:20
sao chép: 1 Số nhấp chuột: 687
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch trung bình động dừng thích ứng

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 T3 và ATR để thích ứng với dừng chân di chuyển để nắm bắt các điểm vào và ra trong xu hướng, thuộc loại chiến lược theo dõi xu hướng. Khi giá vượt qua đường trung bình T3, tạo ra tín hiệu giao dịch và sử dụng giá trị ATR để thiết lập điểm dừng lỗ và dừng chân tại điểm phá vỡ, để thực hiện dừng chân tự động.

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

Chiến lược này bao gồm các chỉ số đường trung bình T3, chỉ số ATR và cơ chế dừng lỗ di động ATR.

Đường trung bình T3 là một đường trung bình di chuyển có tính mượt mà, có thể làm giảm độ trễ của đường cong và cho phép nó phản ứng nhanh hơn với sự thay đổi giá. Khi giá phá vỡ từ phía dưới đường trung bình, nó tạo ra tín hiệu mua; Khi giá phá vỡ từ phía trên đường trung bình, nó tạo ra tín hiệu bá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 điểm dừng lỗ. Càng lớn ATR, thị trường biến động lớn hơn, tại thời điểm này cần thiết lập dừng rộng hơn; ATR nhỏ hơn, thị trường biến động nhỏ hơn, có thể thiết lập dừng hẹp hơn.

Cơ chế dừng di động của ATR, là điều chỉnh vị trí của đường dừng theo thời gian thực dựa trên giá trị ATR, cho phép đường dừng hoạt động theo giá và giữ trong phạm vi hợp lý. Như vậy, cả hai ngăn chặn dừng quá gần bị rung và ngăn chặn dừng quá rộng không thể kiểm soát hiệu quả rủi ro.

Chiến lược này sử dụng tổng hợp các chỉ số T3 để xác định định hướng, ATR để tính toán biến động và ATR để dừng lỗ di động, để nắm bắt xu hướng và kiểm soát rủi ro hiệu quả hơn.

Ưu điểm

Chiến lược này có những ưu điểm sau:

  1. Việc sử dụng đường trung bình T3 làm tăng độ chính xác của xu hướng chụp.

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

  3. ATR có cơ chế dừng lỗ di động, cho phép dây dừng lỗ hoạt động theo 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ố đánh giá và các cơ chế dừng lỗ để thực hiện tự động hóa theo dõi xu hướng giao dịch.

  5. Có thể kết nối với nền tảng giao dịch bên ngoài thông qua webhook để tự động đặt hàng.

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

Chiến lược này cũng có một số rủi ro:

  1. Các tham số đường trung bình T3 được thiết lập không đúng, có thể bỏ lỡ cơ hội có xu hướng tốt hơn. Bạn có thể thử nghiệm các tham số của các chu kỳ khác nhau để tìm tham số tối ưu.

  2. ATR không chính xác, khoảng cách dừng quá lớn hoặc quá nhỏ, không thể kiểm soát rủi ro hiệu quả. Các tham số chu kỳ ATR có thể được điều chỉnh kết hợp với các đặc điểm biến động của thị trường.

  3. Trong những biến động mạnh, đường dừng có thể bị phá vỡ dẫn đến tổn thất quá mức. Bạn có thể đặt một đường lỗ tổng hợp hợp lý để tránh tổn thất đơn lẻ quá lớn.

  4. Trong trường hợp lặp đi lặp lại hai chiều, có thể xảy ra tình huống dừng thường xuyên được kích hoạt. ATR có thể được giải phóng thích hợp cho khoảng cách dừng di động.

Hướng tối ưu hóa

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

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

  2. Kiểm tra các tham số khác nhau của chu kỳ ATR để tính toán 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 khoảng cách linh hoạt của ATR di động để ngăn chặn quá nhạy cảm.

  4. Thêm các điều kiện lọc thích hợp để tránh giao dịch thường xuyên của thị trường hai chiều.

  5. Kết hợp với các chỉ số đánh giá xu hướng, tăng độ chính xác đánh giá hướng lợi nhuận.

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

Tóm tắt

Chiến lược này tích hợp việc sử dụng T3 đường trung bình để xác định xu hướng xu hướng, ATR chỉ số tính toán dừng lỗ và ATR cơ chế dừng lỗ di động điều chỉnh khoảng cách dừng lỗ, thực hiện theo dõi tự động của xu hướng và kiểm soát rủi ro hiệu quả, là một chiến lược theo dõi xu hướng đáng tin cậy. Trong ứng dụng thực tế, vẫn cần phải liên tục thử nghiệm và tối ưu hóa để tìm ra sự kết hợp các tham số phù hợp nhất với môi trường thị trường hiện tại, để có được hiệu quả chiến lược tốt hơn.

Mã nguồn chiến lược
/*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')