Cốt lõi của chiến lược này nằm trong việc sử dụng chỉ số trung bình động trơn T3 và chỉ số ATR stop loss động để xác định hướng xu hướng và theo dõi xu hướng.
Chiến lược này sử dụng chỉ số T3 để tính toán mức trung bình động trơn của giá, và sử dụng chỉ số ATR để tính toán mức trung bình thực sự của chu kỳ hiện tại. Các tín hiệu giao dịch được tạo ra khi giá vượt qua đường dừng lỗ động ATR. Cụ thể, một tín hiệu mua được tạo ra khi giá vượt qua đường dừng lỗ ATR, và một tín hiệu bán được tạo ra khi giá vượt qua đường dừng lỗ ATR.
Để lọc các tín hiệu sai, chiến lược này cũng yêu cầu giá phải vượt qua đường trung bình động T3 trước khi xác nhận tín hiệu. Ngoài ra, chiến lược tính toán stop loss và take profit dựa trên các giá trị ATR để thực hiện quản lý rủi ro.
So với các đường trung bình động truyền thống, chỉ số T3 có độ nhạy cao hơn và chậm hơn, có thể nắm bắt những thay đổi trong xu hướng giá nhanh hơn.
Giá trị ATR phản ánh mức độ biến động và rủi ro hiện tại của thị trường.
Chiến lược dựa trên tính toán chỉ số và rủi ro được điều chỉnh. Ngoài ra, T3 trơn trung bình động và ATR dừng động có vấn đề chậm lại có thể bỏ lỡ cơ hội đảo ngược giá nhanh. Các tham số có thể được điều chỉnh phù hợp hoặc kết hợp với các chỉ số khác để tối ưu hóa.
Khi xu hướng biến động và đảo ngược, các lỗ dừng có thể bị phá vỡ dẫn đến tổn thất lớn hơn.
Điều chỉnh các thông số chỉ số T3 để tối ưu hóa độ nhạy.
Kiểm tra các tham số chu kỳ ATR khác nhau để tìm ra các giá trị tối ưu.
Hãy thử các tỷ lệ rủi ro và phần thưởng khác nhau để xác định các thông số tốt nhất.
Thêm các chỉ số khác vào các tín hiệu lọc, chẳng hạn như Chỉ số dòng tiền.
Sử dụng các phương pháp học máy để tự động tối ưu hóa các kết hợp tham số.
Chiến lược này tích hợp khả năng theo dõi xu hướng của T3 và khả năng điều chỉnh dừng lỗ động của ATR. Với tối ưu hóa tham số và kiểm soát rủi ro thích hợp, nó hứa hẹn lợi nhuận tốt. Chiến lược này xem xét cả việc theo dõi xu hướng và cơ hội đảo ngược, làm cho nó trở thành một chiến lược giao dịch định lượng linh hoạt.
/*backtest start: 2023-12-26 00:00:00 end: 2024-01-02 00:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title='NinjaView Example 1 (UTBA "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')