Estratégia de indicador de abertura multidimensional e poderoso de especialistas quantitativos


Data de criação: 2024-01-19 14:55:03 última modificação: 2024-01-19 14:55:03
cópia: 0 Cliques: 699
1
focar em
1617
Seguidores

Estratégia de indicador de abertura multidimensional e poderoso de especialistas quantitativos

Visão geral

Esta estratégia combina vários indicadores de força, como Aroon, MA, BB, Williams, %R, ADX, entre outros, em vários períodos diferentes, formando um indicador de força multidimensional para abrir uma posição, capaz de abrir uma posição de alta eficiência quando a tendência é mais evidente.

Princípio da estratégia

A estratégia é baseada em uma combinação dos seguintes indicadores:

  1. Indicador de Aroon: calcula os preços mais altos e mais baixos de um determinado período, formando um indicador de choque, que determina a direção da tendência por meio de uma combinação de indicadores de Aroon de vários períodos de comprimento.

  2. A linha média de MA: calcula o cruzamento da linha média de MA de curto e longo períodos para determinar o ponto de reversão da tendência.

  3. BB Binary: é um sinal de venda quando o preço se aproxima do Binary.

  4. Indicador Williams %R: O indicador se desvia de uma zona de sobrevenda para uma zona de sobrevenda.

  5. Indicador de Movimento Direccional Média do ADX: para avaliar a intensidade da tendência, o ADX gera um sinal de abertura de posição quando está acima de uma posição.

Os vários indicadores acima, através de diferentes períodos de comprimento de parâmetros, formam um sistema de julgamento multidimensional, quando a tendência é mais evidente, vários indicadores podem formar um forte sinal de abertura de posição.

A compra, especificamente, é feita sob as seguintes condições:

  1. Aroon_1 abaixo de 85
  2. Quando a linha MA se forma em uma bifurcação
  3. Williams %R abaixo de -99
  4. ADX acima de 14
  5. Aroon_2 acima de 39

Quando três das cinco condições de compra acima são satisfeitas, um forte sinal de compra é gerado.

As condições de venda são semelhantes, existem cinco condições de venda, e quando três delas são satisfeitas, um sinal de venda é gerado.

Portanto, a estratégia utiliza uma combinação de vários indicadores diferentes para gerar um forte sinal de abertura de posição de alta certeza quando a tendência é visível.

Análise de vantagens

A maior vantagem desta estratégia reside na combinação multidimensional de sinais de indicadores, o que reduz significativamente a probabilidade de sinais errados causados por um único indicador, permitindo a produção de sinais de abertura de posição de alta qualidade quando as tendências são mais evidentes, o que é o maior destaque desta estratégia.

Outras vantagens:

  1. Adapta-se às características de diferentes mercados através de ajustes de parâmetros

  2. A configuração dos parâmetros do indicador é cientificamente razoável e os parâmetros são mais robustos

  3. Combinação de vários períodos de tempo, aumentando a precisão de julgamento

  4. Estrutura de código clara, fácil de entender e reutilizar

Análise de Riscos

A estratégia também apresenta alguns riscos:

  1. A combinação de vários indicadores pode melhorar a qualidade do julgamento, mas também aumenta a complexidade da estratégia e aumenta o risco de otimização excessiva

  2. A configuração dos parâmetros não é 100% perfeita e pode falhar em determinados mercados

  3. A combinação de indicadores ainda tem espaço para otimização e a lógica de combinação pode ser refinada ainda mais.

  4. Oportunidades de ajuste de curto prazo podem ser perdidas

Resolução:

  1. Aumentar a robustez dos parâmetros de teste

  2. Adaptação de alguns parâmetros para mais mercados

  3. Otimizar a integração dos indicadores para melhorar a qualidade dos julgamentos

  4. Reduzir adequadamente alguns parâmetros do indicador, aumentando a captura de ajustes de curto prazo

Direção de otimização

A principal direção de otimização desta estratégia é a otimização da forma como os indicadores são integrados, incluindo:

  1. Adicionar mais tipos diferentes de indicadores, formando uma floresta de indicadores, aumentando ainda mais a precisão de julgamento

  2. Optimizar a configuração dos parâmetros do indicador para que ele se adapte automaticamente às mudanças do mercado

  3. Usando métodos como aprendizado de máquina, busca automática de melhores soluções de integração de indicadores

  4. Aumentar as estratégias de stop loss para controlar os riscos

  5. Parâmetros de ajuste dinâmico, juntamente com indicadores de emoção, para avaliar o calor do mercado

Há muito espaço para melhorar a qualidade de julgamento e robustez da estratégia, integrando mais indicadores, parâmetros de otimização automática e soluções de integração.

Resumir

O maior destaque desta estratégia é a integração científica de vários indicadores, formando fortes sinais de abertura de posição, e o efeito é notável quando a tendência é evidente. Há muito espaço para otimização desta estratégia de integração, que pode se tornar uma estratégia de negociação quantitativa muito poderosa através da introdução de mais indicadores, bem como a otimização inteligente dos parâmetros e da integração.

Código-fonte da estratégia
/*backtest
start: 2023-12-19 00:00:00
end: 2024-01-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Aroon+Williams+MA2+ADX+Aroon Str.", shorttitle="Aroon+Williams+MA2+ADX+Aroon Str.", overlay=true)
//https://cafe.naver.com/watchbot/1945
//<<빙썸 매각 기념>> 바이낸스 이오스 복합지표	

//Aroon_1
length_1 = input(264, minval=1, title="Length Aroon_1")
upper_1 = 100 * (highestbars(high, length_1+1) + length_1)/length_1
lower_1 = 100 * (lowestbars(low, length_1+1) + length_1)/length_1
midp_1 = 0
oscillator_1 = upper_1 - lower_1
//osc_1 = plot(oscillator_1, color=red)

//Aroon_2
length_2 = input(72, minval=1, title="Length Aroon_2")
upper_2 = 100 * (highestbars(high, length_2+1) + length_2)/length_2
lower_2 = 100 * (lowestbars(low, length_2+1) + length_2)/length_2
midp_2 = 0
oscillator_2 = upper_2 - lower_2
//osc_2 = plot(oscillator_2, color=red)

//Aroon_3
length_3 = input(137, minval=1, title="Length Aroon_3")
upper_3 = 100 * (highestbars(high, length_3+1) + length_3)/length_3
lower_3 = 100 * (lowestbars(low, length_3+1) + length_3)/length_3
midp_3 = 0
oscillator_3 = upper_3 - lower_3
//osc_3 = plot(oscillator_3, color=red)

//Aroon_4
length_4 = input(62, minval=1, title="Length Aroon_4")
upper_4 = 100 * (highestbars(high, length_4+1) + length_4)/length_4
lower_4 = 100 * (lowestbars(low, length_4+1) + length_4)/length_4
midp_4 = 0
oscillator_4 = upper_4 - lower_4
//osc_4 = plot(oscillator_4, color=red)

//Ma double
short_ma_1 = sma(close, 9)
long_ma_1 = sma(close, 21)
// plot(short_ma_1, color = red)
// plot(long_ma_1, color = green)
// plot(cross(short_ma_1, long_ma_1) ? short_ma_1 : na, style = cross, linewidth = 4)

short_ma_2 = sma(close, 9)
long_ma_2 = sma(close, 21)
// plot(short_ma_2, color = red)
// plot(long_ma_2, color = green)
plot(cross(short_ma_2, long_ma_2) ? short_ma_2 : na, transp= 100, title = "ma cross_2", style = cross, linewidth = 4)

//BB
length_bb = input(270, minval=1, title="BB length")
src_bb = input(close, title="Source")
mult_bb = input(2.0, minval=0.001, maxval=50, title="BB mult")
basis_bb = sma(src_bb, length_bb)
dev_bb = mult_bb * stdev(src_bb, length_bb)
upper_bb = basis_bb + dev_bb
lower_bb = basis_bb - dev_bb
// plot(basis_bb, color=red)
// p1 = plot(upper_bb, color=blue)
// p2 = plot(lower_bb, color=blue)
// fill(p1, p2)

//Williams
length_wil = input(130, minval=1, title="Length Williams %R")
upper_wil = highest(length_wil)
lower_wil = lowest(length_wil)
out_wil = 100 * (close - upper_wil) / (upper_wil - lower_wil)
// plot(out_wil)
// band1 = hline(-20)
// band0 = hline(-80)
// fill(band1, band0)



//ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(145, title="DI Length")
dirmov(len) =>
	up_adx = change(high)
	down_adx = -change(low)
	plusDM = na(up_adx) ? na : (up_adx > down_adx and up_adx > 0 ? up_adx : 0)
    minusDM = na(down_adx) ? na : (down_adx > up_adx and down_adx > 0 ? down_adx : 0)
	truerange = rma(tr, len)
	plus_adx = fixnan(100 * rma(plusDM, len) / truerange)
	minus_adx = fixnan(100 * rma(minusDM, len) / truerange)
	[plus_adx, minus_adx]

adx(dilen, adxlen) =>
	[plus_adx, minus_adx] = dirmov(dilen)
	sum_adx = plus_adx + minus_adx
	adx = 100 * rma(abs(plus_adx - minus_adx) / (sum_adx == 0 ? 1 : sum_adx), adxlen)

sig_adx = adx(dilen, adxlen)

// plot(sig_adx, color=red, title="ADX")


//ADX 2
adxlen_2 = input(14, title="ADX Smoothing")
dilen_2 = input(150, title="DI Length")
dirmov_2(len) =>
	up_adx_2 = change(high)
	down_adx_2 = -change(low)
	plusDM_2 = na(up_adx_2) ? na : (up_adx_2 > down_adx_2 and up_adx_2 > 0 ? up_adx_2 : 0)
    minusDM_2 = na(down_adx_2) ? na : (down_adx_2 > up_adx_2 and down_adx_2 > 0 ? down_adx_2 : 0)
	truerange_2 = rma(tr, len)
	plus_adx_2 = fixnan(100 * rma(plusDM_2, len) / truerange_2)
	minus_adx_2 = fixnan(100 * rma(minusDM_2, len) / truerange_2)
	[plus_adx_2, minus_adx_2]

adx_2(dilen_2, adxlen_2) =>
	[plus_adx_2, minus_adx_2] = dirmov_2(dilen_2)
	sum_adx_2 = plus_adx_2 + minus_adx_2
	adx_2 = 100 * rma(abs(plus_adx_2 - minus_adx_2) / (sum_adx_2 == 0 ? 1 : sum_adx_2), adxlen_2)

sig_adx_2 = adx(dilen_2, adxlen_2)

// plot(sig_adx_2, color=red, title="ADX_2")

//Input Position
//buy position
pos_aroon1 = input(-85, title="Aroon_1 Position Index_Down")
pos_madouble1_short = input(117, title="ma double_1 wma_Short")
pos_madouble1_long =  input(86, title="ma double_1 sma_Long")
pos_wil = input(-99, title="Williams Position Index_Down")
pos_adx= input(14, title="ADX Position Index_Up")
pos_aroon2 = input(-39, title="Aroon_2 Position Index_Up")

//sell position
pos_bb = input(120, title="BB Position Index_Up")
pos_aroon_3 = input(99, title="Aroon_3 Position Index_Up")
pos_madouble2_short= input(88, title="ma double_2 ema_Short")
pos_madouble2_long= input(96, title="ma double_2 sma_Long")
pos_adx_2= input(9, title="ADX_2 Position Index_Up")
pos_aroon_4 = input(35, title="Aroon_4 Position Index_Down")

//Condition
longCondition_aroon_1 = (oscillator_1 <= pos_aroon1)
longCondition_ma2 = (pos_madouble1_short > pos_madouble1_long)
longCondition_wil = (out_wil <= pos_wil)
longCondition_adx = (sig_adx >= pos_adx)
longCondition_aroon_2 = (oscillator_2 >= pos_aroon2)

shortCondition_bb = (close > basis_bb)
shortCondition_aroon_3 = (oscillator_3 >= pos_aroon_3)
shortCondition_ma2 = (pos_madouble2_short < pos_madouble2_long)
shortCondition_adx = (sig_adx_2 >= pos_adx_2)
shortCondition_aroon_4 = (oscillator_4 <= pos_aroon_4)

vl_aroon_1 = 0
vl_ma2 = 0
vl_wil = 0
vl_adx = 0
vl_aroon_2 = 0

if longCondition_aroon_1
    vl_aroon_1 := 1
    
if longCondition_ma2
    vl_ma2 := 3

if longCondition_wil
    vl_wil := 1
    
if longCondition_adx
    vl_adx := -1

if longCondition_aroon_2
    vl_aroon_2 := -1
	

vs_bb = 0
vs_aroon_3 = 0
vs_ma2 = 0
vs_adx = 0
vs_aroon_4 = 0

if shortCondition_bb
    vs_bb := 1

if shortCondition_aroon_3
    vs_aroon_3 := 1
    
if shortCondition_ma2
    vs_ma2 := 3

if shortCondition_adx
    vs_adx := -2

if shortCondition_aroon_4
    vs_aroon_4 := -1

// plotshape(vl_aroon_1, title= "vl_aroon_1", location=location.belowbar, color=green, text="vl_aroon_1")
// plotshape(vl_ma2, title= "vl_ma2", location=location.belowbar, color=green, text="\nvl_ma2")
// plotshape(vl_wil, title= "vl_wil", location=location.belowbar, color=green, text="\n\nvl_wil")
// plotshape(vl_adx, title= "vl_adx", location=location.belowbar, color=green, text="\n\n\nvl_adx")
// plotshape(vl_aroon_2, title= "vl_aroon_2", location=location.belowbar, color=green, text="\n\n\n\nvl_aroon_2")

// plotshape(vs_bb, title= "vs_bb", location=location.abovebar, color=orange, text="vs_bb")
// plotshape(vs_aroon_3, title= "vs_aroon_3", location=location.abovebar, color=orange, text="vs_aroon_3\n")
// plotshape(vs_ma2, title= "vs_ma2", location=location.abovebar, color=orange, text="vs_ma2\n\n")
// plotshape(vs_adx, title= "vs_adx", location=location.abovebar, color=orange, text="vs_adx\n\n\n")
// plotshape(vs_aroon_4, title= "vs_aroon_4", location=location.abovebar, color=orange, text="vs_aroon_4\n\n\n\n")

longCondition = (vl_aroon_1 + vl_ma2 + vl_wil + vl_adx + vl_aroon_2) >= 3 ? true : na
shortCondition = (vs_bb + vs_aroon_3 + vs_ma2 + vs_adx + vs_aroon_4) >= 3 ? true : na

buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na

// plotshape(buy, title= "buy", location=location.bottom, color=green, text="buy")
// plotshape(sell, title= "sell", location=location.top, color=orange, text="sell")


// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

strategy.entry("L", strategy.long, when=(buy))
strategy.close("L", when=(sell))
// strategy.entry("S", strategy.short, when=(sell and (time >= timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59))))
// strategy.close("S", when=(buy and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59))))