Chiến lược này kết hợp nhiều chỉ số kỹ thuật để đánh giá xu hướng giá và tạo ra tín hiệu mua và bán.
Chiến lược chủ yếu sử dụng các chỉ số sau đây để xác định xu hướng giá:
SuperTrend: Mua khi giá phá vỡ trên dải trên, bán khi phá vỡ dưới dải dưới.
SMA: Mua khi giá vượt trên SMA, bán khi vượt dưới SMA.
Động lực: Đi dài khi động lực là tích cực, đi ngắn khi âm.
MACD: Mua khi DIFF vượt trên DEA, bán khi vượt dưới.
Bò và gấu: Đi dài khi sức mạnh bò > sức mạnh gấu, và ngược lại.
RSI: Mua khi RSI vượt trên 30, bán khi vượt dưới 70.
Candela: Đi dài sau N thanh tăng, đi ngắn sau N thanh giảm.
CCI: Mua khi CCI > 100, bán khi CCI < -100.
DMI: Đi dài khi DMI + > DMI-, nếu không đi ngắn.
Sóng thị trường: Đi dài trong sóng lên, đi ngắn trong sóng xuống.
Stochastics: Mua khi %K vượt trên 20, bán khi vượt dưới 80.
Các tín hiệu chỉ số được định lượng là 1 hoặc -1 tùy thuộc vào hướng lên hoặc xuống. Tổng số điểm được tổng hợp. Mua khi tổng số điểm vượt trên 0, bán khi vượt dưới 0.
Ưu điểm lớn nhất của chiến lược đa chỉ số này là độ tin cậy cao hơn bằng cách kết hợp các tín hiệu từ các chỉ số khác nhau để lọc các tín hiệu sai.
Một lợi thế khác là tính linh hoạt để tùy chỉnh các chỉ số và tham số cho các điều kiện thị trường khác nhau.
Một số rủi ro cần lưu ý trong các chiến lược kết hợp như vậy:
Sự tương quan cao giữa các chỉ số có thể tạo ra các tín hiệu trùng lặp.
Quá nhiều chỉ số dẫn đến tín hiệu chậm trễ. Có một sự đánh đổi giữa số lượng chỉ số và tính kịp thời.
Các thông số chỉ số không phù hợp ảnh hưởng đến hiệu suất chiến lược. Các thông số tối ưu cần được tìm thấy thông qua kiểm tra hậu quả kỹ lưỡng.
Hiệu quả của chỉ số khác nhau giữa các chế độ thị trường.
Chiến lược này có thể được cải thiện theo nhiều cách:
Tối ưu hóa lựa chọn chỉ số và số lượng để tìm kết hợp tốt nhất.
Tối ưu hóa các thông số cho mỗi chỉ số.
Điều chỉnh trọng lượng chỉ số để nhấn mạnh các chỉ số chính.
Thêm các bộ lọc như âm lượng tăng để tránh các sự đột phá giả.
Sử dụng các mô hình máy học để tự động tìm kết hợp tối ưu.
Tóm lại, chiến lược đa chỉ số này kết hợp các điểm mạnh của các chỉ số khác nhau để cải thiện độ tin cậy tín hiệu và giảm các tín hiệu sai.
/*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)