
Ý 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.
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.
Chiến lược này có những ưu điểm sau:
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.
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.
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ả.
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.
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.
Chiến lược này cũng có một số rủi ro:
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.
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.
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.
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.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Để 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.
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.
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.
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.
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.
Sử dụng phương pháp học máy để tự động tối ưu hóa các tham số.
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.
/*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')