Estratégia de negociação de decisão do indicador de momentum


Data de criação: 2023-12-15 15:31:52 última modificação: 2023-12-15 15:31:52
cópia: 0 Cliques: 594
1
focar em
1621
Seguidores

Estratégia de negociação de decisão do indicador de momentum

Visão geral

A estratégia de negociação de tomada de decisão de indicadores dinâmicos é uma estratégia de acompanhamento de tendências. Ela utiliza uma média móvel de dois indicadores para construir um indicador dinâmico e, em seguida, combina um indicador de taxa de mudança de preço para produzir um sinal de negociação. Quando o indicador de movimento sobe, produz um sinal de multiplicação; Quando o indicador de movimento desce, produz um sinal de desativação.

Princípio da estratégia

A estratégia usa o indicador de média móvel de dois indicadores, o Decision Point oscillator, para medir a dinâmica. Primeiro, calcula-se a taxa de variação diária dos preços, em seguida, a taxa de variação de preço é suavizada com uma média móvel de dois indicadores de 31 dias e 20 dias, respectivamente, e, finalmente, um sinal de negociação é emitido com uma média móvel de 9 dias.

A estratégia também introduziu um indicador de taxa de variação de preços para evitar sinais errôneos na liquidação do mercado. Concretamente, é o cálculo da taxa de variação percentual de preços nos últimos 30 dias, para determinar se o mercado está em estado ativo através de sua média móvel.

Análise de vantagens

A estratégia combina o indicador de volume dinâmico com o indicador de taxa de variação de preços, o que permite identificar de forma eficaz as tendências a médio prazo e evitar a negociação frequente em situações de turbulência. Em comparação com estratégias de tendências simples, como o acompanhamento de médias móveis, pode reduzir significativamente a probabilidade de negociações erradas. Além disso, o controle de risco configura um ponto de parada para o controle de perda em tempo hábil e eficaz.

Análise de Riscos

A estratégia é baseada na negociação de tendências de linha média e longa, e não consegue capturar oscilações de preços de curto prazo. Em situações extremas, o ponto de parada pode ser ultrapassado, resultando em grandes perdas. Além disso, a configuração inadequada dos parâmetros também pode afetar a estratégia.

Para evitar riscos, pode-se ajustar adequadamente o ponto de parada e ampliar a amplitude de parada. Também pode-se fechar temporariamente a estratégia em situações extremas, para evitar a probabilidade de a parada ser ultrapassada.

Direção de otimização

A estratégia pode ser otimizada em várias direções:

  1. A adição de outros indicadores de filtragem, como os indicadores de volatilidade, pode evitar a negociação durante períodos de alta volatilidade.

  2. A adição de modelos de aprendizagem de máquina, que ajudam a determinar a direção e a intensidade da tendência, pode melhorar a precisão do sinal.

  3. Tente diferentes indicadores de dinâmica, como indicadores de força relativa, oscilador estocástico, etc., para otimizar o tempo de compra e venda.

  4. Durante a operação em disco rígido, combinando características de tendências recentes, ajuste dinâmico de parâmetros, busca o melhor conjunto de parâmetros.

Resumir

A estratégia de negociação de tomada de decisão de indicadores dinâmicos é, em geral, uma estratégia robusta de acompanhamento de tendências a médio e longo prazo. Combina um indicador de volume de média móvel de dois índices e um indicador de taxa de variação de preços para identificar a tendência e evitar erros de negociação. Ao mesmo tempo, configure um ponto de parada para controlar o risco. Se os parâmetros forem ajustados de forma razoável e o efeito de retorno for bom, é adequado para investidores que buscam lucros excessivos a médio e longo prazo.

Código-fonte da estratégia
/*backtest
start: 2022-12-08 00:00:00
end: 2023-11-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Decision BF", overlay=false, 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 ///////////////
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

/////////////// Decision ///////////////
src = input(ohlc4, title="Source")
length1 = input(31, title="First Smoothing")
length2 = input(20, title="Second Smoothing")
siglength = input(9, title="Signal Smoothing")
fr = input(true, title="Fill Region")

calc_csf(src, length) => 
	sm = 2.0 / length
	csf = 0.0
	csf := (src - nz(csf[1])) * sm + nz(csf[1])
	csf
i = (src / nz(src[1], src)) * 100
pmol2 = calc_csf(i - 100, length1)
pmol = calc_csf(10 * pmol2, length2)
pmols = ema(pmol, siglength)
d = pmol - pmols
duml = plot(fr ? (d > 0 ? pmol : pmols) : na, style=plot.style_circles, color=color.yellow, linewidth=0, title="DummyL")

hc = d > 0 ? d > d[1] ? color.lime : color.green : d < d[1] ? color.red : color.orange

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = d > 0 and isMoving() 
short = d < 0 and isMoving() 

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("L Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("S Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
sigl = plot(false ? na : pmols, title="PMO Signal", color=color.gray, linewidth=2, title="Signal")
mdl = plot(false ? na : pmol, title="PMO", color=color.black, linewidth=2, title="PMO")
fill(duml, sigl, color.green, transp=20, title="PosFill")
fill(duml, mdl, color.red, transp=20, title="NegFill")
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)