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.
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
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
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
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á
ATR trailing stop di chuyển với biến động thị trường để tránh bị dừng lại.
ATR trailing stop theo xu hướng, tránh thoát sớm ngay cả trong thời gian rút ngắn
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
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.
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 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.
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
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')