A estratégia utiliza um conjunto de indicadores técnicos para avaliar as tendências de preços e emitir sinais de compra e venda.
A estratégia baseia-se principalmente nos seguintes indicadores técnicos para avaliar a tendência dos preços:
Indicador de Super Tendência ((SuperTrend): De acordo com o ATR, o preço supera a trajetória superior e a trajetória inferior, e o preço supera a trajetória inferior e a trajetória inferior.
A média móvel simples (SMA): o preço sobe com a SMA e desce com a SMA.
Indicador de Momentum: a dinâmica de preços é positiva e positiva, negativa e negativa;
MACD: DIFF acima da linha de DEA, com ganho, abaixo da linha de DEA, com ganho;
A força do Bull and Bear: a força do Bull e do Bear é maior do que a força do Bull e do Bear.
RSI: O RSI está acima da linha 30 e abaixo da linha 70.
Linha do Sol e Linha do Sol: N linhas do Sol e Linha do Sol em sequência;
CCI: CCI maior do que 100 para fazer mais e menor do que 100 para fazer menos;
DMI: DMI multi-cabeça é maior do que o cabeçalho vazio para fazer mais, em vez de vazio;
O mercado de ações está em uma onda de crescimento e queda, e os preços estão em uma onda de queda e queda.
Indicador aleatório: 20 linhas acima do indicador aleatório e 80 linhas abaixo.
Os indicadores são calculados de acordo com a direção para cima ou para baixo, dando um número de pontos de 1 ou -1. Somando os pontos de todos os indicadores, obtém-se o número total de pontos. Quando o número total de pontos atravessa a linha 0 gera um sinal de compra; Quando o número total de pontos atravessa a linha 0 gera um sinal de venda.
A maior vantagem desta estratégia de combinação de vários indicadores é a alta confiabilidade, pois o uso integrado de vários indicadores para determinar a direção da tendência pode efetivamente reduzir os falsos sinais e tornar o sinal mais confiável. Em comparação com um único indicador, a confiabilidade e a estabilidade desta estratégia de combinação são melhores.
Outra vantagem é a flexibilidade e a personalização das estratégias. Os tipos de indicadores e as configurações de parâmetros podem ser ajustados de acordo com diferentes mercados, para que a estratégia seja mais adaptada a diferentes circunstâncias.
A combinação de estratégias também apresenta alguns riscos:
Se a correlação entre os indicadores selecionados for muito alta, haverá risco de duplicação de sinais. Isso requer combinação de indicadores com menor correlação de acordo com diferentes condições de mercado.
Se o número de indicadores é muito grande, o tempo de cálculo é muito longo, o que afeta a pontualidade do sinal emitido. É necessário ponderar a relação entre o número de indicadores e a pontualidade.
A configuração incorreta dos parâmetros do indicador também pode afetar a eficácia da estratégia, e é necessário um bom retrospecto para encontrar os melhores parâmetros.
Os indicadores também podem variar de acordo com a fase do mercado. A sua eficácia deve ser constantemente verificada através de um teste de retorno.
A estratégia pode ser otimizada em vários aspectos:
Otimizar a variedade e a quantidade de Indicatores para escolher a combinação ideal;
Optimizar as configurações de parâmetros de cada Indicator;
Ajustar o índice de ponderação dos indicadores para aumentar o peso dos indicadores-chave;
Aumentar os filtros de condições, como por exemplo o aumento do volume de transações, para evitar falsas rupturas;
O método de combinação de modelos é usado para encontrar automaticamente a combinação de estratégias mais ótima por meio de algoritmos de aprendizado de máquina.
Em resumo, esta estratégia de combinação multi-indicador utiliza as vantagens de vários tipos de indicadores, combinação de determinar a direção da tendência, pode reduzir os falsos sinais, aumentar a confiabilidade do sinal. Através da otimização da seleção de indicadores, configuração de parâmetros, distribuição de peso, etc., pode melhorar a estabilidade da estratégia.
/*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)