Estratégia de negociação quantitativa baseada em múltiplos indicadores

Autora:ChaoZhang, Data: 2023-10-25 18:06:44
Tags:

img

Resumo

Esta estratégia combina múltiplos indicadores técnicos para tomar decisões de negociação longas e curtas.

Estratégia lógica

A estratégia usa principalmente Bandas de Bollinger para julgar a volatilidade dos preços. As bandas de estreitamento representam a diminuição da volatilidade que pode levar a um rompimento. O RSI é usado para identificar condições de sobrecompra e sobrevenda.

Além disso, o ADX é usado para avaliar a força da tendência. O ADX alto representa uma tendência forte, favorecendo a negociação de tendência. O ADX baixo não representa uma tendência clara, considerando a reversão média. Finalmente, as médias móveis definem a direção da tendência de longo prazo. A tendência ascendente favorece a longa, enquanto a tendência descendente favorece a curta.

Especificamente, quando as bandas se comprimem, o RSI se aproxima de seus limites, e os preços quebram abaixo da faixa inferior, espera-se um salto, vá longo. Quando as bandas se comprimem, o RSI se aproxima de seus limites, e os preços quebram acima da faixa superior, espera-se um declínio, vá curto. Além disso, com alto ADX, adicione longs em uptrend. Com baixo ADX, adicione shorts em downtrend. Combinar indicadores melhora a robustez do sistema.

Análise das vantagens

A estratégia multiindicador tem as seguintes vantagens:

  1. A combinação de indicadores melhora a precisão e a robustez.

  2. Considera a negociação de tendência e de intervalo, adaptável a diferentes condições de mercado.

  3. Longs e shorts reduzem os riscos direcionais e evitam movimentos extremos.

  4. Parar perdas e tomar lucro bloquear os lucros e limitar as perdas quando as negociações dão errado.

  5. A otimização de parâmetros melhora continuamente a estratégia adaptando-a aos mercados em mudança.

Análise de riscos

A estratégia apresenta também alguns riscos:

  1. Mais indicadores aumentam a complexidade. Configurações inadequadas podem degradar o desempenho. Extensivos testes e otimização são necessários.

  2. A dependência excessiva dos indicadores técnicos, ignorando os fundamentais, pode causar sinais imprecisos.

  3. Os mercados podem já ter se movido quando surgem sinais, representando um risco de perseguir.

  4. A negociação bidirecional aumenta a frequência, aumentando os custos e a pressão.

  5. A robustez deve ser testada em diversos mercados.

Os riscos podem ser geridos através de um rigoroso stop loss, de um dimensionamento prudente das posições, de uma alavancagem razoável, etc. No geral, a estratégia tem um forte valor prático.

Oportunidades de melhoria

Algumas maneiras de otimizar a estratégia:

  1. Teste diferentes conjuntos de parâmetros para encontrar valores ótimos utilizando algoritmos graduais, aleatórios ou genéticos.

  2. Adicione mais indicadores como KDJ, Williams para construir um conjunto de indicadores robusto.

  3. Otimizar os modelos de dimensionamento de posições para gerir o risco de forma dinâmica.

  4. Incorporar modelos de aprendizagem de máquina para prever tendências e movimentos de preços.

  5. Teste em diferentes produtos, prazos e mercados para melhorar a adaptabilidade.

  6. Refinar o tempo de entrada e saída para capturar tendências cedo e sair antes das reversões.

  7. Empregar a tomada de lucro, trailing paradas para bloquear os lucros e limitar as perdas.

  8. Adicionar fatores fundamentais e análise da estrutura do mercado para filtrar os sinais técnicos.

Resumo

Esta estratégia automatiza a negociação interpretando múltiplos indicadores. Ela se beneficia da validação cruzada de indicadores, negociação de direção dupla, stop loss / take profit, etc. O excesso de ajuste e os falsos sinais exigem cautela. A otimização e testes contínuos podem transformá-lo em um sistema robusto e prático, representando o futuro das estratégias de negociação quant.


/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © The_Bigger_Bull
//@version=5
strategy("Best TradingView Strategy", overlay=true, margin_long=0, margin_short=0)
//Bollinger Bands
source1 = close
length1 = input.int(15, minval=1)
mult1 = input.float(2.0, minval=0.001, maxval=50)
basis1 = ta.sma(source1, length1)
dev1 = mult1 * ta.stdev(source1, length1)
upper1 = basis1 + dev1
lower1 = basis1 - dev1
//buyEntry = ta.crossover(source1, lower1)
//sellEntry = ta.crossunder(source1, upper1)

//RSI
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

//plot(rsi, "RSI", color=#7E57C2)
//plot(rsiMA, "RSI-based MA", color=color.yellow)
rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")
bbUpperBand = plot(isBB ? rsiMA + ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Upper Bollinger Band", color=color.green)
bbLowerBand = plot(isBB ? rsiMA - ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Lower Bollinger Band", color=color.green)
fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title="Bollinger Bands Background Fill")

//ADX

adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up1 = ta.change(high)
	down1 = -ta.change(low)
	plusDM = na(up1) ? na : (up1 > down1 and up1 > 0 ? up1 : 0)
	minusDM = na(down1) ? na : (down1 > up1 and down1 > 0 ? down1 : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)




out = ta.sma(close, 14)

sma1=ta.sma(close,55)

ema200=ta.ema(close,200)



longCondition = (out>sma1) and ta.crossover(source1, lower1)

if (longCondition )
    strategy.entry("long", strategy.long)
    
shortCondition = (out<sma1) and ta.crossunder(source1, lower1)

if (shortCondition )
    strategy.entry("short", strategy.short)
    
    
stopl=strategy.position_avg_price-50
tptgt=strategy.position_avg_price+100
stopshort=strategy.position_avg_price+50
tptgtshort=strategy.position_avg_price-100

strategy.exit("longclose","long",trail_offset=5,trail_points=45,when=ta.crossover(sma1,out))
strategy.exit("shortclose","short",trail_offset=5,trail_points=45,when=ta.crossover(out,sma1))

    
//if strategy.position_avg_price<0
    
    
plot(sma1 , color=color.blue)
plot(out, color=color.green)
//plot(ema200,color=color.red)


    
    


Mais.