
Chiến lược này dựa trên thiết kế KAMA của Kaufman, có thể điều chỉnh các vị trí giao dịch động, tự động theo dõi xu hướng thị trường. Các chức năng chính của chiến lược bao gồm:
Bằng cách sử dụng các tính năng này, chiến lược cố gắng thu được lợi nhuận bổ sung từ xu hướng, đồng thời kiểm soát rủi ro.
Chiến lược này dựa trên Kaufman thích ứng với các chỉ số trung bình di chuyển. KAMA, bằng cách tính toán tỷ lệ động lượng và biến động của giá, động điều chỉnh trọng lượng và độ mịn của trung bình, để phản ứng nhanh hơn với sự thay đổi giá.
Khi KAMA đi qua đường dừng xuống, nó biểu thị xu hướng đảo ngược, tạo ra tín hiệu mua; khi KAMA đi qua đường dừng xuống, nó biểu thị xu hướng đảo ngược, tạo ra tín hiệu bán. Sau khi vào vị trí, chiến lược sẽ tính toán khoảng cách dừng động dựa trên ATR và thiết lập đường dừng. Khi KAMA di chuyển theo hướng thuận lợi, đường dừng cũng sẽ điều chỉnh theo, di chuyển đường dừng đến vị trí thuận lợi hơn để khóa thêm lợi nhuận.
Bằng cách này, chiến lược có thể theo dõi xu hướng và di chuyển đường dừng dần dần cho đến khi đường dừng bị kích hoạt hoặc tín hiệu đảo ngược được kích hoạt và thanh toán.
Chiến lược này có những ưu điểm sau đây so với chiến lược trung bình di chuyển truyền thống:
Nhìn chung, chiến lược này phản ứng nhanh, có thể kiểm soát được và là một chiến lược theo dõi xu hướng điển hình.
Chiến lược này cũng có một số rủi ro:
Những rủi ro này có thể được kiểm soát bằng cách tối ưu hóa khoảng cách dừng lỗ, thiết lập tỷ lệ dừng lỗ tối đa. Các chỉ số khác cũng có thể được kết hợp để xác nhận và tránh giao dịch sai.
Chiến lược này có thể được tối ưu hóa như sau:
Ví dụ, bạn có thể thử nghiệm thêm MACD như một chỉ số xác nhận phụ trợ, đồng thời yêu cầu MACDDif cũng là tích cực và mở rộng. Điều này có thể lọc ra một số tín hiệu giả và tránh mở vị trí lặp lại không cần thiết.
Chiến lược này hoạt động suôn sẻ, sử dụng các bước dừng động để theo dõi xu hướng và tối đa hóa lợi nhuận theo xu hướng. Tính thích ứng của chỉ số KAMA cũng cho phép chiến lược theo kịp sự thay đổi nhanh chóng của thị trường. Với một số tối ưu hóa, chiến lược có thể trở thành một chương trình theo dõi xu hướng hiệu quả, phù hợp với hoạt động đường dài trung bình.
/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)
// Function to calculate pips with higher precision
getPips(price) =>
difc = syminfo.mintick
hlpips = price / difc
math.round(hlpips / syminfo.mintick) * syminfo.mintick
// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )
tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)
// Function to calculate the TMA
gettma() =>
mom = math.abs(ta.change(src, length))
volatility = math.sum(math.abs(ta.change(src)), length)
er = volatility != 0 ? mom / volatility : 0
fastAlpha = 2 / (fastLength + 1)
slowAlpha = 2 / (slowLength + 1)
alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
kama = 0.0
kama := alpha * src + (1 - alpha) * nz(kama[1], src)
await = awaitBarConfirmation ? barstate.isconfirmed : true
maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
thma = kama
hma_dif = (thma - thma[2])/2
colour = hma_dif > 0 ? color.green : color.red
isGreen = hma_dif > 0
[thma, isGreen, colour]
// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1
// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na
[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
plot(thma, title='KAMA', linewidth=2, color=colour)
if ta.crossover(thma, psl) and strategy.position_size < 0
strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)
if ta.crossunder(thma, psl) and strategy.position_size > 0
strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)
if isGreen and strategy.position_size <= 0
if na(psl)
psl := close + getPips(pips)
strategy.entry("Buy", strategy.long, alert_message=buyMess)
lastSignal := 1
if not isGreen and strategy.position_size >= 0
if na(psl)
psl := close - getPips(pips)
strategy.entry("Sell", strategy.short, alert_message=sellMess)
lastSignal := -1
if (thma >= lastPsl or na(lastPsl)) and thma > psl
psl := psl + getPips(pips)
lastPsl := psl
if (thma <= lastPsl or na(lastPsl)) and thma < psl
psl := psl - getPips(pips)
lastPsl := psl
plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)