Estratégia de negociação de momento recorrente

Autora:ChaoZhang, Data: 2024-01-31 16:56:31
Tags:

img

Resumo

Esta estratégia é uma estratégia de seguimento de tendências e ruptura baseada no indicador de Bandas Recorrentes desenvolvido por Alexgrover.

Estratégia lógica

Cálculo do indicador de bandas recursivas

O indicador de bandas recursivas é constituído por uma banda superior, uma banda inferior e uma linha do meio.

Faixa superior = Max(Barra anteriora faixa superior, preço de fechamento + nVolatilidade) Faixa inferior = Min(Banda inferior da barra anterior, preço de fechamento - nVolatilidade) Linha média = (banda superior + banda inferior) / 2

Aqui n é um coeficiente de escala, e a volatilidade pode ser escolhida a partir de ATR, desvio padrão, faixa média verdadeira ou um método especial de RFV. O parâmetro de comprimento controla a sensibilidade, valores maiores fazem com que o indicador seja disparado com menos frequência.

Regras de negociação

A estratégia verifica primeiro se a faixa inferior e a faixa superior estão a evoluir na mesma direcção para evitar falsas rupturas.

Quando o preço cruzar abaixo da faixa inferior, vá longo. Quando o preço cruzar acima da faixa superior, vá curto.

Além disso, a lógica de stop loss é implementada.

Análise das vantagens

As vantagens desta estratégia são as seguintes:

  1. Cálculo eficiente de indicadores utilizando um quadro recursivo, evitando cálculos repetidos
  2. Ajuste flexível dos parâmetros para se adaptar aos diferentes regimes de mercado
  3. Combinar tendência e ruptura, evitando falsas rupturas
  4. Os filtros de condição de momento garantem a qualidade do sinal

Análise de riscos

Há também alguns riscos com esta estratégia:

  1. Ajustes de parâmetros inadequados podem levar a excesso de negociação ou má qualidade do sinal
  2. Pode enfrentar grandes perdas quando ocorrerem grandes mudanças de tendência
  3. Controle insuficiente do deslizamento em movimentos extremos pode amplificar as perdas

Estes riscos podem ser geridos através da otimização de parâmetros, da implementação de stop loss, do aumento do limiar de deslizamento, etc.

Orientações de otimização

Algumas orientações para otimizar ainda mais a estratégia:

  1. Incorporar indicadores em vários prazos para a robustez
  2. Adicionar módulo de aprendizado de máquina para otimização de parâmetros adaptativos
  3. Realizar uma análise quantitativa da correlação para encontrar combinações ideais de parâmetros
  4. Usar aprendizado profundo para prever caminhos de preços e melhorar a precisão do sinal

Conclusão

Em resumo, esta é uma estratégia muito prática e eficiente de acompanhamento de tendências. Combina a estrutura recursiva para eficiência computacional, usa suporte/resistência da tendência para determinar as principais tendências, adiciona condições de momento para filtrar falhas e garantir a qualidade do sinal. Com ajuste adequado de parâmetros e controle de risco, pode alcançar bons resultados. Merece mais pesquisa e otimização para se adaptar a regimes de mercado mais complexos.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=5
// Original indicator by alexgrover
strategy('Extended Recursive Bands Strategy', overlay=true, commission_type=strategy.commission.percent,commission_value=0.06,default_qty_type =strategy.percent_of_equity,default_qty_value = 100,initial_capital =1000)
length = input.int(260, step=10, title='Length')
src = input(close, title='Source')
method = input.string('Classic', options=['Classic', 'Atr', 'Stdev', 'Ahlr', 'Rfv'], title='Method')
bandDirectionCheck = input.bool(true, title='Bands Hold Direction')
lookback = input(3)
//----
atr = ta.atr(length)
stdev = ta.stdev(src, length)
ahlr = ta.sma(high - low, length)
rfv = 0.
rfv := ta.rising(src, length) or ta.falling(src, length) ? math.abs(ta.change(src)) : rfv[1]
//-----
f(a, b, c) =>
    method == a ? b : c
v(x) =>
    f('Atr', atr, f('Stdev', stdev, f('Ahlr', ahlr, f('Rfv', rfv, x))))
//----
sc = 2 / (length + 1)
a = 0.
a := math.max(nz(a[1], src), src) - sc * v(math.abs(src - nz(a[1], src)))
b = 0.
b := math.min(nz(b[1], src), src) + sc * v(math.abs(src - nz(b[1], src)))
c = (a+b)/2

// Colors
beColor = #675F76
buColor = #a472ff

// Plots
pA = plot(a, color=color.new(beColor, 0), linewidth=2, title='Upper Band')
pB = plot(b, color=color.new(buColor, 0), linewidth=2, title='Lower Band')
pC = plot(c, color=color.rgb(120,123,134,0), linewidth=2, title='Middle Band')
fill(pC, pA, color=color.new(beColor,90))
fill(pC, pB, color=color.new(buColor,90))

// Band keeping direction
// By Adulari
longc = 0
shortc = 0
for i = 0 to lookback-1
    if b[i] > b[i+1]
        longc:=longc+1
    if a[i] < a[i+1]
        shortc:=shortc+1
bhdLong = if bandDirectionCheck
    longc==lookback
else
    true
bhdShort = if bandDirectionCheck
    shortc==lookback
else
    true

// Strategy
if b>=low and bhdLong
    strategy.entry(id='Long',direction=strategy.long)
if high>=a and bhdShort
    strategy.entry(id='Short',direction=strategy.short)

// TP at middle line
//if low<=c and strategy.position_size<0 and strategy.position_avg_price>close
    //strategy.exit(id="Short",limit=close)
//if high>=c and strategy.position_size>0 and strategy.position_avg_price<close
    //strategy.exit(id="Long",limit=close)

Mais.