Estratégia abrangente de indicadores técnicos


Data de criação: 2023-10-07 15:34:33 última modificação: 2023-10-07 15:34:33
cópia: 0 Cliques: 779
1
focar em
1617
Seguidores

Visão geral

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.

Princípio da estratégia

A estratégia baseia-se principalmente nos seguintes indicadores técnicos para avaliar a tendência dos preços:

  1. 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.

  2. A média móvel simples (SMA): o preço sobe com a SMA e desce com a SMA.

  3. Indicador de Momentum: a dinâmica de preços é positiva e positiva, negativa e negativa;

  4. MACD: DIFF acima da linha de DEA, com ganho, abaixo da linha de DEA, com ganho;

  5. 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.

  6. RSI: O RSI está acima da linha 30 e abaixo da linha 70.

  7. Linha do Sol e Linha do Sol: N linhas do Sol e Linha do Sol em sequência;

  8. CCI: CCI maior do que 100 para fazer mais e menor do que 100 para fazer menos;

  9. DMI: DMI multi-cabeça é maior do que o cabeçalho vazio para fazer mais, em vez de vazio;

  10. 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.

  11. 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.

Análise de vantagens

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.

Análise de Riscos

A combinação de estratégias também apresenta alguns riscos:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Direção de otimização

A estratégia pode ser otimizada em vários aspectos:

  1. Otimizar a variedade e a quantidade de Indicatores para escolher a combinação ideal;

  2. Optimizar as configurações de parâmetros de cada Indicator;

  3. Ajustar o índice de ponderação dos indicadores para aumentar o peso dos indicadores-chave;

  4. Aumentar os filtros de condições, como por exemplo o aumento do volume de transações, para evitar falsas rupturas;

  5. 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.

Resumir

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.

Código-fonte 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)