Strategi ini menggunakan berbagai indikator teknis untuk menilai tren harga dan memberikan sinyal beli dan jual.
Strategi ini menilai tren harga berdasarkan beberapa indikator teknis berikut:
Indikator Super Trend ((SuperTrend): Berdasarkan ATR dihitung naik dan turun, harga melakukan lebih banyak untuk menembus tren atas, dan melakukan shorting untuk menembus tren bawah;
Simple Moving Average (SMA): harga naik melalui SMA lebih tinggi, turun melalui SMA kosong;
Indikator Momentum: Momentum adalah positif, plus adalah negatif, minus adalah negatif;
MACD: DIFF naik melampaui garis DEA dan turun melampaui garis DEA dan melemahkan;
Kekuatan Bull and Bear: Kekuatan Bull and Bear lebih besar daripada kekuatan Bull yang lebih banyak, sebaliknya, lebih banyak.
RSI: RSI di atas 30 garis lebih banyak, di bawah 70 garis kosong;
Garis negatif: Garis negatif N secara berurutan kosong, Garis positif N secara berurutan lebih banyak;
CCI: CCI lebih besar dari 100 plus, kurang dari 100 minus;
DMI: DMI multihead lebih besar dari yang kosong, sebaliknya kosong;
Wave Market: menilai bahwa harga melakukan lebih banyak pada gelombang naik, dan tidak melakukan lebih banyak pada gelombang turun;
Indikator acak: 20 baris di atas indikator acak, 80 baris di bawah kosong.
Hasil dari perhitungan indikator ini memberikan nilai 1 atau -1 tergantung pada arah ke atas atau ke bawah. Tambahkan nilai dari semua indikator untuk mendapatkan nilai total. Ketika nilai total melewati garis 0 menghasilkan sinyal beli; Ketika nilai total melewati garis 0 menghasilkan sinyal jual.
Keuntungan terbesar dari strategi kombinasi multi-indikator ini adalah keandalan yang tinggi. Karena penggunaan komposit dari beberapa indikator untuk menentukan arah tren, sinyal palsu dapat dikurangi secara efektif, sehingga sinyal lebih dapat diandalkan. Keandalan dan stabilitas strategi kombinasi ini lebih baik dibandingkan dengan indikator tunggal.
Kelebihan lain adalah fleksibilitas dan kemampuan kustomisasi yang kuat. Jenis indikator, parameter pengaturan dapat disesuaikan sesuai dengan pasar yang berbeda, sehingga strategi lebih sesuai dengan situasi yang berbeda.
Ada beberapa risiko yang harus diperhatikan dalam strategi kombinasi ini:
Jika indikator yang dipilih memiliki hubungan yang terlalu tinggi, maka akan terjadi risiko pengulangan sinyal. Ini memerlukan kombinasi indikator dengan hubungan yang lebih rendah sesuai dengan kondisi pasar yang berbeda.
Jika jumlah indikator terlalu banyak dan waktu yang dihabiskan terlalu lama, maka akan mempengaruhi waktu yang tepat untuk mengirimkan sinyal. Hubungan antara jumlah indikator dan waktu yang tepat perlu ditimbang.
Penetapan parameter indikator yang tidak tepat juga dapat memengaruhi efektivitas strategi, dan perlu melakukan pengetatan yang memadai untuk menemukan parameter terbaik.
Efek Indikator juga akan berbeda pada berbagai tahap pasar. Efektifitasnya perlu terus diperiksa dengan rollback.
Strategi ini dapat dioptimalkan dalam beberapa hal:
Mengoptimalkan jenis dan jumlah indikator, memilih kombinasi yang optimal;
Mengoptimalkan pengaturan parameter untuk setiap indikator;
Menyesuaikan rasio bobot Indikator untuk meningkatkan bobot Indikator Utama;
Menambahkan filter kondisional, seperti lonjakan volume transaksi, untuk menghindari false breaks;
Metode ini menggunakan kombinasi model untuk menemukan kombinasi strategi optimal secara otomatis melalui algoritma pembelajaran mesin.
Secara keseluruhan, strategi kombinasi multi-indikator ini memanfaatkan keunggulan berbagai jenis indikator, kombinasi menentukan arah tren, dapat mengurangi sinyal palsu, meningkatkan keandalan sinyal. Dengan mengoptimalkan pemilihan indikator, pengaturan parameter, alokasi berat, dll., Anda dapat terus meningkatkan stabilitas strategi. Strategi kombinasi semacam ini cocok untuk pedagang strategi yang memiliki persyaratan tinggi untuk stabilitas sinyal indikator.
/*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)