Chiến lược này sử dụng nhiều chỉ số kỹ thuật để đánh giá xu hướng giá để phát ra tín hiệu mua và bán.
Chiến lược này chủ yếu đánh giá xu hướng giá dựa trên một số chỉ số kỹ thuật sau:
Chỉ số siêu xu hướng ((SuperTrend): Theo ATR tính trên đường và dưới đường, giá phá vỡ đường lên làm nhiều, phá vỡ đường xuống làm trống;
Đường trung bình di chuyển đơn giản (SMA): giá tăng trên SMA và giảm trên SMA.
Chỉ số động lực (Momentum): Động lực giá là tích cực và tiêu cực.
MACD: DIFF tăng vượt DEA, giảm vượt DEA;
Trong khi đó, các nhà nghiên cứu khác cũng cho rằng, việc tăng cường sức mạnh của các nhà đầu tư là một trong những yếu tố quan trọng nhất trong việc tăng cường sức mạnh của các nhà đầu tư.
RSI: RSI trên đường 30 làm nhiều, dưới đường 70 làm trống;
Dòng âm dương: N dòng âm liên tiếp làm trống, N dòng dương liên tiếp làm nhiều;
CCI: CCI lớn hơn 100 làm nhiều, nhỏ hơn 100 làm rỗng;
DMI: DMI đa đầu lớn hơn đầu trống, ngược lại là trống;
Thị trường có xu hướng biến động theo chiều cao và có xu hướng biến động theo chiều thấp.
Chỉ số ngẫu nhiên: trên chỉ số ngẫu nhiên đi 20 đường, dưới 80 đường trống.
Kết quả tính toán của các chỉ số này cung cấp điểm 1 hoặc -1, tùy thuộc vào hướng lên hoặc xuống. Ghi tất cả các điểm của tất cả các chỉ số, bạn sẽ có tổng số điểm. Khi tổng số điểm vượt qua đường 0 sẽ tạo ra tín hiệu mua; Khi tổng số điểm vượt qua đường 0 sẽ tạo ra tín hiệu bán.
Lợi thế lớn nhất của chiến lược kết hợp nhiều chỉ báo này là độ tin cậy cao, do sử dụng tổng hợp nhiều chỉ báo để xác định hướng xu hướng, có thể làm giảm hiệu quả tín hiệu giả và làm cho tín hiệu đáng tin cậy hơn. So với chỉ báo đơn, chiến lược kết hợp này có độ tin cậy và ổn định tốt hơn.
Một lợi thế khác là tính linh hoạt và khả năng tùy chỉnh của chiến lược. Các loại và tham số của chỉ số có thể được điều chỉnh theo các thị trường khác nhau, làm cho chiến lược phù hợp hơn với các môi trường kinh tế khác nhau.
Những chiến lược kết hợp này cũng có một số rủi ro cần lưu ý:
Nếu các chỉ số được chọn có liên quan quá cao, sẽ có nguy cơ lặp lại tín hiệu. Điều này đòi hỏi sự kết hợp các chỉ số có liên quan thấp hơn theo các môi trường thị trường khác nhau.
Nếu số lượng Indicator quá nhiều, thời gian tính toán quá dài, sẽ ảnh hưởng đến thời gian phát tín hiệu. Cần cân bằng mối quan hệ giữa số lượng Indicator và thời gian.
Thiết lập các tham số Indicator không đúng cũng có thể ảnh hưởng đến hiệu quả của chiến lược, cần phải đánh giá đầy đủ để tìm các tham số tốt nhất.
Hiệu quả của Indicator cũng có thể khác nhau trong các giai đoạn thị trường khác nhau.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Tối ưu hóa các loại và số lượng chỉ số, chọn kết hợp tốt nhất;
Tối ưu hóa các thiết lập tham số cho mỗi chỉ số;
Điều chỉnh tỷ lệ trọng lượng của các chỉ số để tăng trọng lượng cho các chỉ số quan trọng;
Thêm các bộ lọc điều kiện, chẳng hạn như khối lượng giao dịch tăng vọt, để tránh phá vỡ giả;
Sử dụng phương pháp kết hợp mô hình để tự động tìm kiếm kết hợp chiến lược tối ưu nhất thông qua thuật toán học máy.
Tóm lại, chiến lược kết hợp đa chỉ số này sử dụng lợi thế của các loại chỉ số, kết hợp định hướng xu hướng, có thể làm giảm tín hiệu giả, tăng độ tin cậy của tín hiệu. Bằng cách tối ưu hóa lựa chọn chỉ số, thiết lập tham số, phân bổ trọng lượng, v.v., có thể nâng cao sự ổn định của chiến lược.
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Super indicator ", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// Time Frame ///////////////
_0 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() =>true
hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol1 = (volume / hilow)
spreadvol = (openclose * vol1)
VPT = spreadvol + cum(spreadvol)
window_len = 28
v_len = 14
price_spread = stdev(high-low, window_len)
vp = spreadvol + cum(spreadvol)
smooth = sma(vp, v_len)
v_spread = stdev(vp - smooth, window_len)
shadow = (vp - smooth) / v_spread * price_spread
out1 = shadow > 0 ? high + shadow : low + shadow
//plot(out, style=line,linewidth=3, color=color)
len=5
vpt=ema(out1,len)
// INPUTS //
st_mult =3
st_period = 7
// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))
up_trend = 0.0
up_trend := close[1] > up_trend[1] ? max(up_lev, up_trend[1]) : up_lev
down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev
// Calculate trend var
trend10 = 0
trend10 := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend10[1], 1)
// Calculate SuperTrend Line
st_line = trend10 ==1 ? up_trend : down_trend
//
src = input(close, title="Source")
//sma
sma20 = sma(src, 20)
smapoint = 0
smapoint := src > sma20 ? smapoint + 1 : smapoint - 1
//AO
ao = sma(hl2,5) - sma(hl2,34)
aopoint = ao > 0 ? 1 : ao < 0 ? -1 : 0
//momentum
mom = src - src[14]
mompoint = mom > 0 ? 1 : mom < 0 ? -1 : 0
//MACD
fast_ma = ema(src, 12)
slow_ma = ema(src, 26)
macd = fast_ma - slow_ma
signal = ema(macd, 9)
hist = macd - signal
histpoint = hist > hist[1] ? 3 : -3
//Bull bear
Length = 30
r1=iff(close[1]<open,max(open-close[1],high-low),high-low)
r2=iff(close[1]>open,max(close[1]-open,high-low),high-low)
bull=iff(close==open,iff(high-close==close-low,iff(close[1]>open,max(high-open,close-low),r1),iff(high-close>close-low,iff(close[1]<open, max(high-close[1],close-low), high-open),r1)),iff(close<open,iff(close[1]<open,max(high-close[1],close-low), max(high-open,close-low)),r1))
bear=iff(close==open,iff(high-close==close-low,iff(close[1]<open,max(open-low,high-close),r2),iff(high-close>close-low,r2,iff(close[1]>open,max(close[1]-low,high-close), open-low))),iff(close<open,r2,iff(close[1]>open,max(close[1]-low,high-close),max(open-low,high-close))))
colors=iff(sma(bull-bear,Length)>0, color.green, color.red)
// barcolor(colors)
bbpoint = sma(bull-bear,Length)>0 ? 1 : -1
//UO
length7 = 7,
length14 = 14,
length28 = 28
average(bp, tr_, length) => sum(bp, length) / sum(tr_, length)
high_ = max(high, src[1])
low_ = min(low, src[1])
bp = src - low_
tr_ = high_ - low_
avg7 = average(bp, tr_, length7)
avg14 = average(bp, tr_, length14)
avg28 = average(bp, tr_, length28)
uoout = 100 * (4*avg7 + 2*avg14 + avg28)/7
uopoint = uoout > 70 ? 1 : uoout < 30 ? -1 : 0
//IC
conversionPeriods = 9
basePeriods = 26
laggingSpan2Periods = 52
displacement = 26
donchian(len) => avg(lowest(len), highest(len))
baseLine = donchian(basePeriods)
icpoint = src > baseLine ? 1 : -1
//HMA
hullma = wma(2*wma(src, 9/2)-wma(src, 21), round(sqrt(21)))
hmapoint = src > hullma ? 2 : -2
//
//
trendDetectionLength =4
float trend = na
float wave = na
float vol = na
mov = close>close[1] ? 1 : close<close[1] ? -1 : 0
trend := (mov != 0) and (mov != mov[1]) ? mov : nz(trend[1])
isTrending = rising(close, trendDetectionLength) or falling(close, trendDetectionLength)
wave := (trend != nz(wave[1])) and isTrending ? trend : nz(wave[1])
vol := wave == wave[1] ? (nz(vol[1])+volume) : volume
up1 = wave == 1 ? vol : 0
dn1 = wave == 1 ? 0 : vol
Weis= up1 > dn1 ? 2 : -2
//
roclen =20
ccilen =21
dilen = 5
dirmov(len) =>
up = change(high)
down = -change(low)
truerange = rma(tr, len)
plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
[plus, minus]
f_draw_infopanel(_x, _y, _line, _text, _color)=>
_rep_text = ""
for _l = 0 to _line
_rep_text := _rep_text + "\n"
_rep_text := _rep_text + _text
var label _la = na
label.delete(_la)
_la := label.new(
x=_x, y=_y,
text=_rep_text, xloc=xloc.bar_time, yloc=yloc.price,
color=color.black, style=label.style_labelup, textcolor=_color, size=size.normal)
TD = 0
TS = 0
TD := close > close[4] ? nz(TD[1]) + 1 : 0
TS := close < close[4] ? nz(TS[1]) + 1 : 0
TDUp = TD - valuewhen(TD < TD[1], TD , 1 )
TDDn = TS - valuewhen(TS < TS[1], TS , 1 )
td = TDUp > 0 ? 2 : TDDn > 0 ? -2 : 0
roc = roc(close, roclen)
Roc=roc > 0 ? 1 : -1
cci = cci(close, ccilen)
CCI=cci > 0? 2 : -2
[plus, minus] = dirmov(dilen)
dmi = plus - minus
DMI= dmi >= 0? 2 : -2
//
STT=trend10 == 1 ? 1 : -1
//
periods = 2
smooth1 = 14
price = close
fn(src, length) =>
MA_s= 0.0
MA_s:=(src + nz(MA_s[1] * (length-1)))/length
MA_s
r11 = ema( price, periods )
r22 = iff( price > r11, price - r11, 0 )
r3 = iff( price < r11, r11 - price, 0 )
r4 = fn( r22, smooth1 )
r5 = fn( r3, smooth1 )
rr = iff( r5 == 0, 100, 100 - ( 100 / ( 1 + ( r4 / r5 ) ) ) )
length = 20,fast = 7,slow = 13
//
src10 = rr
er = abs(change(src,length))/sum(abs(change(src10)),length)
dev = er*stdev(src10*2,fast) + (1-er)*stdev(src10*2,slow)
a = 0.
a := bar_index < 9 ? src10 : src10 > a[1] + dev ? src10 : src10 < a[1] - dev ? src10 : a[1]
//
rsi=fixnan(a > a[1] ? 3 : a < a[1] ?-3 : na)
//
totalpoints =rsi+td+STT+Roc+DMI+ CCI+Weis+smapoint + aopoint + mompoint + histpoint + bbpoint + icpoint + hmapoint
//
piz=input(1)
tt=sma(totalpoints,piz)
//
zero=0
down = crossunder(tt, 0)
up = crossover(tt, -0)
//Alerts
/////// Alerts /////
alertcondition(down,title="sell")
alertcondition(up,title="buy")
//
/////////////// Strategy ///////////////
long = up
short = down
strategy.entry("Long", strategy.long, when = long)
strategy.entry("Short", strategy.short, when = short)