Esta estratégia usa médias móveis de curto e longo prazo para gerar e filtrar sinais de negociação. A média móvel de curto prazo é usada para gerar sinais, enquanto a média móvel de longo prazo é usada para filtrar sinais. Os negócios são feitos apenas quando a média móvel de curto prazo muda de direção e a média móvel de longo prazo está se movendo na mesma direção geral.
A estratégia também utiliza o indicador ATR para definir de forma dinâmica o stop loss e os níveis de lucro ao entrar em negociações.
A média móvel de curto prazo de Hull capta tendências de preços e pontos de virada de curto prazo.
A média móvel de Hull a longo prazo determina a tendência geral dos preços.
Os negócios só são realizados quando a média móvel de curto prazo Hull vira direção, e sua nova direção se alinha com a direção da média móvel de longo prazo Hull.
Após a entrada de posições, os níveis de stop loss e take profit são definidos com base no valor do indicador ATR. O ATR reflete a volatilidade do mercado e os níveis de risco.
A combinação de sinais de curto prazo e filtros de longo prazo permite identificar de forma eficaz tendências e pontos de viragem de médio prazo, evitando falsos sinais provenientes do ruído do mercado.
A taxa dinâmica de stop loss e take profit baseada no ATR estabelece intervalos razoáveis com base na volatilidade atual, no equilíbrio da taxa de take profit e na prevenção de perdas.
A média móvel Hull tem vantagens de flexibilidade e precisão em relação às médias móveis padrão, com melhor rastreamento de tendências.
A estratégia baseia-se em cruzamentos entre as médias móveis de Hull para gerar sinais.
No intervalo, mercados agitados com oscilação de preços em uma faixa de negociação, erros de sinal e negociações desnecessárias podem se acumular.
A dependência de stop loss e take profit em ATR significa que leituras de volatilidade imprecisas resultarão em uma colocação ruim.
Indicadores adicionais de curto prazo, como o RSI, podem melhorar a precisão do sinal através da convergência.
A lógica de filtragem entre as médias móveis do Hull pode ser melhorada para ter requisitos de entrada mais rigorosos, evitando falsos sinais.
A pesquisa de ajuste de parâmetros pode revelar melhorias de estabilidade e rentabilidade de alterações nos comprimentos médios móveis, períodos ATR, etc.
Esta estratégia combina geração de sinal de curto prazo, filtragem de sinal de longo prazo e stop loss/take profit baseado em ATR em uma estrutura robusta de tendência de médio prazo.
/*backtest start: 2023-12-04 00:00:00 end: 2024-01-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0) // Parameters for Hull Moving Averages src = input(close, title="Source") signal_period = input(50, title="Period of signal HMA") filter_period = input(200, title="Period of filter HMA") strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"]) // Set allowed trading directions strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all strategy.risk.allow_entry_in(strat_dir_value) // stop loss and take profit sl_factor = input(2,title="Stop Loss Factor") tp_factor = input(3,title="Take Profit Factor") atr_period = input(14, title="ATR Period (SL/TP)") // Testing Start dates testStartYear = input(2010, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) //Stop date if you want to use a specific range of dates testStopYear = input(2030, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // ----------------------------------------------------------------------------- // Global variables // ----------------------------------------------------------------------------- var float tp = na var float sl = na var float position = na // ----------------------------------------------------------------------------- // Functions // ----------------------------------------------------------------------------- testWindow() => time >= testPeriodStart and time <= testPeriodStop ? true : false // ----------------------------------------------------------------------------- // The engine // ----------------------------------------------------------------------------- hma_signal = hma(src, signal_period) hma_filter = hma(src, filter_period) // Used to determine exits and stop losses atr_e = atr(atr_period) // if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0 trend = hma_filter > hma_filter[1] ? 1 : hma_filter < hma_filter[1] ? -1 : 0 signal = hma_signal > hma_signal[1] ? 1 : hma_signal < hma_signal[1] ? -1 : 0 // ----------------------------------------------------------------------------- // signals // ----------------------------------------------------------------------------- if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow() sl := close - sl_factor*atr_e tp := close + tp_factor*atr_e strategy.entry("HMA_LNG", strategy.long) strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e) if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow() sl := close + sl_factor*atr_e tp := close - tp_factor*atr_e strategy.entry("HMA_SHRT", strategy.short) strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e) if strategy.position_size != 0 sl := sl[1] tp := tp[1] // ----------------------------------------------------------------------------- // PLOT // ----------------------------------------------------------------------------- hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red) hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red) plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1) plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)