
Chiến lược này kết hợp các chỉ số siêu xu hướng, các điểm trọng tâm và các điểm Pivot và các đường dừng động hình thành từ sóng thực trung bình và các chỉ số đường hướng trung bình để đánh giá và theo dõi xu hướng. Chiến lược này phù hợp với giao dịch đường ngắn, có thể nắm bắt phần tiếp tục xu hướng sau khi sắp xếp giữa, kiểm soát rút lui cũng được thực hiện tốt.
Chỉ số siêu xu hướng kết hợp điểm trung tâm và ATR dừng để xác định hướng giá phá vỡ đường dừng động để quyết định hướng đặt hàng. Trong khi đó, chỉ số ADX xác định cường độ xu hướng và chỉ phát tín hiệu giao dịch khi xu hướng đủ mạnh.
Cụ thể, các điểm trục được hỗ trợ bởi kháng cự mới nhất, sau đó tạo ra giá trung bình động với trung bình toán học hai ngày trước. ATR sau đó được tính toán và nhân ATR, sau đó cộng với giá trung bình động, để có được đường lên và đường xuống.
Đường dừng sẽ được điều chỉnh động theo giá mới nhất và giá trị ATR, giúp theo dõi xu hướng tốt.
Chiến lược này có những ưu điểm sau:
Sử dụng chỉ số siêu xu hướng để theo dõi xu hướng và tránh bị khóa lợi nhuận bởi thị trường lắc lư.
Sử dụng chỉ số ADX để đánh giá cường độ của xu hướng, tránh giao dịch sai khi kết hợp.
Đường dừng lỗ được điều chỉnh động để khóa lợi nhuận tối đa.
Kết hợp với RSI để tránh mua và bán.
Nhìn chung, các tham số chiến lược được thiết lập hợp lý, tính đến tính liên tục trong việc chọn dframe, và cài đặt Stop Loss cũng tốt.
Chiến lược này cũng có một số rủi ro:
Chỉ số siêu xu hướng và chỉ số MA có thể phát ra tín hiệu xung đột.
Chỉ số ADX được thiết lập với chu kỳ 14, không nhạy cảm với các sự kiện bất ngờ.
Các tham số RSI được đặt là mặc định và có thể không hoàn toàn tránh được giao dịch.
Không tính đến tác động của những sự kiện bất ngờ, chẳng hạn như lỗ hổng lợi nhuận lớn / tin tức tích cực.
Giải pháp tương ứng:
Điều chỉnh chu kỳ MA để phù hợp với chỉ số siêu xu hướng.
Cố gắng rút ngắn chu kỳ ADX và tăng độ nhạy đối với các sự kiện bất ngờ.
Tối ưu hóa tham số RSI, tìm giá trị tối ưu.
Tham gia bộ lọc tin tức để tránh các bản tin lớn.
Chiến lược này cũng có thể được tối ưu hóa theo các khía cạnh sau:
Thêm mô hình học máy để đánh giá xu hướng và quyết định giao dịch thông minh hơn.
Cố gắng giới thiệu các chỉ số thay thế ADX như chỉ số cảm xúc để đánh giá cường độ của xu hướng.
Thêm một mô-đun tự điều chỉnh để làm cho việc dừng lỗ động và chính xác hơn.
Sử dụng kỹ thuật học sâu để trích xuất nhiều tính năng hơn và tối ưu hóa chiến lược tổng thể.
Sử dụng ngôn ngữ cấp cao như Python để phát triển chiến lược, tăng khả năng mở rộng chiến lược.
Chiến lược này rất thực tế, trọng tâm của nó là theo dõi xu hướng và tham gia khi xu hướng đủ mạnh. Các thiết lập dừng lỗ và dừng lại cũng được thực hiện rất tốt, tối đa hóa lợi nhuận và tránh mở rộng tổn thất. Dĩ nhiên, vẫn còn rất nhiều không gian tối ưu hóa, nếu thêm công nghệ học máy và học sâu, sẽ làm cho chiến lược có hiệu quả tốt hơn, mở rộng và phổ biến hơn.
/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Bendre ADX STrend", overlay = true)
///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////
src = input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period")
AtrFactor=input(defval = 2, title = "ATR Factor")
AtrPd=input(defval = 21, title = "ATR Period")
StartDate = input(timestamp("1 Dec 2023"), title="Start Date")
EndDate = input(timestamp("12 Jan 2024"), title="End Date")
window() => true
var float ph = na
var float pl = na
ph := ta.pivothigh(PPprd, PPprd)
pl :=ta.pivotlow(PPprd, PPprd)
float center = na
center := center[1]
// float lastpp = ph ? ph : pl ? pl : 0.0
float lastpp = na(ph) ? na(pl) ? na : pl : ph
if lastpp > 0
if na(center)
center := lastpp
else
center := (center * 2 + lastpp) / 3
Up = center - (AtrFactor * ta.atr(AtrPd))
Dn = center + (AtrFactor * ta.atr(AtrPd))
var float TUp = na
var float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown
// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend")
bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl
///////
// ADX
//////
lenADX = 14
th = 14
TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = ta.sma(DX, lenADX)
//////
// MA
/////
lenMA = 21
srcMA = input(close, title="Source")
// offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
offsetMA = input(0, title="Offset")
outMA = ta.sma(srcMA, lenMA)
//
// RSI
//
length = input( 14 )
overSold = input( 30 )
overBought = input( 65 )
price = close
vrsi = ta.rsi(price, length)
//
// DMI - Direction Movement Index
//
[diplus1, diminus1, adx] = ta.dmi(14, 14)
// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP
if (buy and vrsi > overBought and adx > 19)
// .order // Tuned version
strategy.entry("Buy", strategy.long, when = window())
// strategy.close("Sell", "close Sell")
if (sell) and (strategy.position_size > 0)
// strategy.entry("Sell", strategy.short)
strategy.close("Buy", "Close Buy")
if(sell and vrsi < overSold and adx > 25)
strategy.entry("Sell", strategy.short, when = window())
if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) )
strategy.close("Sell", "close Sell")
// if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold)
// strategy.entry("Sell", strategy.short, when = window())
// if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0 and (buy))
// strategy.close("Sell", "close Sell")