Esta estratégia combina múltiplos indicadores técnicos para julgar a tendência dos preços e gerar sinais de compra e venda.
A estratégia utiliza principalmente os seguintes indicadores para determinar a tendência dos preços:
SuperTrend: Compre quando o preço quebra acima da faixa superior, venda quando quebra abaixo da faixa inferior.
SMA: Comprar quando o preço cruza acima da SMA, vender quando cruza abaixo da SMA.
Impulso: vá longo quando o impulso é positivo, vá curto quando é negativo.
MACD: Compre quando o DIFF cruza acima da DEA, venda quando cruza abaixo.
Touro e Urso: Vai longo quando o poder do touro > poder do urso, e vice-versa.
RSI: Compre quando o RSI cruza acima de 30, venda quando cruza abaixo de 70.
Candlesticks: vão longos após N barras de alta, vão curtos após N barras de baixa.
CCI: Comprar quando o CCI for superior a 100, vender quando o CCI for inferior a -100.
DMI: Vai longo quando DMI+ > DMI-, senão vai curto.
Ondas de mercado: vão longas em ondas ascendentes, vão curtas em ondas descendentes.
Estocástica: Comprar quando %K cruza acima de 20, vender quando cruza abaixo de 80.
Os sinais do indicador são quantificados como 1 ou -1 dependendo da direção para cima ou para baixo. Os pontos totais são somados. Compre quando os pontos totais cruzam acima de 0, venda quando cruzam abaixo de 0.
A maior vantagem desta estratégia multiindicador é a maior fiabilidade, combinando sinais de vários indicadores para filtrar sinais falsos.
Outra vantagem é a flexibilidade para personalizar indicadores e parâmetros para diferentes condições de mercado.
Alguns riscos a serem observados em tais estratégias combinadas:
A alta correlação entre os indicadores pode gerar sinais duplicados.
Há uma troca entre a quantidade de indicadores e a puntualidade.
Os parâmetros inadequados dos indicadores afectam o desempenho da estratégia.
A eficiência dos indicadores varia de acordo com os regimes de mercado.
Esta estratégia pode ser melhorada de várias formas:
Otimizar a selecção e o número de indicadores para encontrar a melhor combinação.
Otimizar os parâmetros para cada indicador.
Ajustar os pesos dos indicadores para enfatizar os indicadores-chave.
Adicione filtros como pico de volume para evitar falhas.
Usar modelos de aprendizagem de máquina para encontrar automaticamente combinações ideais.
Em resumo, esta estratégia multi-indicador combina os pontos fortes de vários indicadores para melhorar a confiabilidade do sinal e reduzir os falsos sinais.
/*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)