A estratégia de negociação de decisão do indicador de momento é uma estratégia de seguimento de tendências. Ela constrói um indicador de momento usando média móvel exponencial dupla e o combina com o indicador de taxa de mudança de preço para gerar sinais de negociação. Quando o indicador de momento sobe, ele gera sinais longos. Quando o indicador de momento desce, ele gera sinais curtos. Esta estratégia é adequada para os traders que querem rastrear tendências de médio prazo no mercado.
A estratégia usa um oscilador de ponto de decisão baseado em média móvel exponencial dupla para medir o impulso. Primeiro, ele calcula a taxa de mudança diária de preço, em seguida, usa médias móveis exponenciais duplas de 31 dias e 20 dias para suavizar a taxa de mudança de preço separadamente. Finalmente, ele usa uma média móvel suavizada de 9 dias para emitir sinais de negociação. Quando a linha rápida está acima da linha lenta, indica um mercado de touros. Quando a linha rápida está abaixo da linha lenta, indica um mercado de ursos.
A estratégia também introduz um indicador de taxa de mudança de preço para evitar sinais errados em mercados laterais. Especificamente, ele calcula a mudança percentual de preço nos últimos 30 dias e julga se o mercado está ativo através de sua média móvel.
A estratégia combina indicador de momento e indicador de taxa de mudança de preço, que pode identificar efetivamente tendências de médio prazo e evitar negociações frequentes em mercados voláteis.
A estratégia depende principalmente da negociação de tendência de médio e longo prazo, incapaz de capturar flutuações de preços de curto prazo. Quando há um movimento acentuado do mercado, o ponto de stop loss pode ser quebrado, levando a perdas maiores. Além disso, configurações de parâmetros inadequadas também podem afetar a estratégia.
Para evitar riscos, os pontos de stop loss podem ser ajustados adequadamente para expandir o intervalo de stop loss. Quando ocorre um movimento acentuado do mercado, a estratégia pode ser temporariamente desligada para evitar a probabilidade de quebra de stop loss. Para ajuste de parâmetros, o backtesting detalhado deve ser realizado para selecionar os parâmetros ideais.
A estratégia pode ser otimizada nos seguintes aspectos:
Adicionar outros indicadores de filtragem como o indicador de volatilidade para evitar a negociação durante períodos de fortes flutuações do mercado.
Adicionar modelos de aprendizado de máquina para ajudar a julgar a direção e a força da tendência, o que pode melhorar a precisão do sinal.
Tente diferentes indicadores de impulso como Índice de Força Relativa, oscilador estocástico para otimizar o tempo de entrada e saída.
Em negociações ao vivo, ajustar dinamicamente os parâmetros combinados com as condições recentes do mercado para buscar uma combinação ideal de parâmetros.
A estratégia de negociação de decisão do indicador de momento é geralmente uma estratégia de tendência constante de médio e longo prazo. Ela identifica efetivamente as tendências e evita negócios errados combinando o indicador de média de momento móvel exponencial duplo e o indicador de taxa de mudança de preço. Enquanto isso, controla o risco definindo pontos de stop loss. Se os parâmetros forem ajustados corretamente e os resultados do backtest forem bons, é adequado para investidores de médio e longo prazo que buscam retornos excessivos.
/*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)