Chiến lược theo xu hướng tự động dựa trên T3 và ATR


Ngày tạo: 2024-01-03 11:58:25 sửa đổi lần cuối: 2024-01-03 11:58:25
sao chép: 1 Số nhấp chuột: 698
1
tập trung vào
1621
Người theo dõi

Chiến lược theo xu hướng tự động dựa trên T3 và ATR

Tổng quan

Cốt lõi của chiến lược này là sử dụng các chỉ số chuyển động trơn trung bình của chỉ số T3 và các điểm dừng động của chỉ số ATR để xác định định hướng và theo dõi xu hướng. Chiến lược này kết hợp theo dõi xu hướng và cơ hội đảo ngược xu hướng nhằm kiếm được lợi nhuận nhiều hơn trong tình huống xu hướng.

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

Chiến lược này sử dụng chỉ số T3 để tính toán đường trung bình di chuyển trơn của giá và sử dụng chỉ số ATR để tính toán phạm vi biến động thực tế trung bình trong chu kỳ này. Một tín hiệu giao dịch được tạo ra khi giá vượt qua ATR dừng động. Cụ thể, một tín hiệu mua được tạo ra khi giá vượt qua ATR dừng đường trên và một tín hiệu bán được tạo ra khi giá vượt qua ATR dừng đường dưới.

Để lọc các tín hiệu giả, chiến lược này yêu cầu giá cả phải phá vỡ đường trung bình di chuyển T3 để xác nhận tín hiệu. Ngoài ra, chiến lược tính toán điểm dừng lỗ và điểm dừng bằng giá trị ATR để quản lý rủi ro.

Phân tích lợi thế

T3 có độ nhạy cao hơn và độ trễ thấp hơn so với các chỉ số di chuyển truyền thống, có thể nắm bắt được sự thay đổi của xu hướng giá nhanh hơn. Ngoài ra, T3 có lợi thế về tính toán toán học, có thể cung cấp các trung bình di chuyển chính xác hơn.

Giá trị ATR phản ánh mức độ biến động và mức độ rủi ro của thị trường hiện tại. ATR theo dõi động các lệnh dừng và dừng có thể điều chỉnh động quy mô vị trí, thu lợi nhuận nhiều hơn trong tình huống xu hướng và giảm tổn thất trong tình huống xung đột.

Phân tích rủi ro

Chiến lược này phụ thuộc vào tính toán chỉ số và có nguy cơ bị đánh giá. Ngoài ra, T3 Smooth Moving Average và ATR Dynamic Stop đều có vấn đề về sự chậm trễ, có thể bỏ lỡ cơ hội biến đổi giá nhanh. Các tham số có thể được điều chỉnh thích hợp hoặc được tối ưu hóa kết hợp với các chỉ số khác.

Trong khi xu hướng biến động đảo ngược, dừng có thể bị phá vỡ dẫn đến tổn thất tăng lên. Bạn có thể nới lỏng phạm vi dừng một cách thích hợp hoặc sử dụng các tham số khác như giá trị Handle làm cơ sở dừng.

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

  • Các tham số chỉ số T3 có thể được điều chỉnh để tối ưu hóa độ nhạy của nó.

  • Có thể thử nghiệm các tham số chu kỳ ATR khác nhau để tìm ra giá trị tối ưu.

  • Bạn có thể thử các hệ số lợi nhuận rủi ro khác nhau để xác định các tham số tối ưu.

  • Các chỉ số khác có thể được thêm vào các tín hiệu lọc, chẳng hạn như Chỉ số dòng tiền.

  • Có thể 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 kết hợp khả năng theo dõi xu hướng của đường trung bình di chuyển T3 và khả năng điều chỉnh lỗ hổng động của ATR. Với các tham số được tối ưu hóa và kiểm soát rủi ro, có khả năng nhận được tỷ lệ lợi nhuận tốt. Chiến lược này xem xét cả theo dõi xu hướng và cơ hội đảo ngược, là một chiến lược giao dịch định lượng phổ biến.

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