
A estratégia utiliza duas médias móveis de Hall, a curta e a longa, para a geração e filtragem de sinais de negociação. A média móvel de Hall de curta duração é usada para a geração de sinais, enquanto a média móvel de Hall de longa duração é usada para filtrar os sinais, gerando apenas sinais de negociação quando a média de Hall de curta duração e a média de Hall de longa duração mudam de direção.
A estratégia usa simultaneamente o indicador ATR para configurar o stop loss e o stop loss. Cada vez que a posição é aberta, o stop loss e o stop loss da posição atual são configurados dinamicamente de acordo com o valor do ATR.
As médias móveis de Hall de curto prazo são usadas para capturar tendências e turnos de curto prazo nos preços. Quando a direção da média móvel de Hall de curto prazo muda, indica que a tendência de curto prazo dos preços mudou.
As médias móveis de Hall de longo prazo são usadas para determinar o movimento geral dos preços. Por exemplo, quando a direção da média móvel de Hall de longo prazo é ascendente, indica que os preços estão em uma tendência geral ascendente.
Um sinal de negociação só é gerado quando a média móvel de Hall curta-prazo se inverte e sua direção de inverter coincide com a direção geral da média móvel de Hall de longo prazo. Ou seja, apenas quando a tendência de curto prazo do preço muda ao mesmo tempo que a tendência geral muda na mesma direção. Isso pode filtrar efetivamente os sinais errôneos causados pelo ruído do mercado de curto prazo.
Após a abertura de uma posição, o stop loss e o stop loss são definidos de acordo com o tamanho do indicador ATR. O indicador ATR pode refletir a volatilidade e o nível de risco do mercado. A posição de stop loss é colocada abaixo do ponto baixo do preço e a posição de stop loss é colocada acima do ponto alto do preço e está vinculada ao valor do ATR, ajustando o alcance do stop loss de acordo com a volatilidade do mercado.
A estratégia combina sinais de curto prazo e filtragem de longo prazo, permitindo identificar de forma eficaz as tendências de preços a médio prazo e capturar os pontos de inflexão em tempo hábil. Comparado com indicadores como a média móvel única, é possível reduzir a possibilidade de ser enganado pelo ruído do mercado.
Ajuste dinâmico da posição de parada de perda, você pode configurar uma parada de perda razoável de acordo com a volatilidade do mercado, evitando ser muito radical e minimizar o risco de perdas, enquanto garante o lucro.
Com os benefícios das médias móveis de Hall, é possível avaliar os movimentos de preços com maior flexibilidade e precisão, e tem um melhor desempenho de rastreamento do que as médias móveis comuns.
A estratégia depende do cruzamento de duas médias móveis de Hall para o curto e o longo prazo como sinal, e se um falso cruzamento ocorrer entre duas médias móveis, isso pode causar uma entrada errada. Nesse caso, é necessário decidir se o sinal deve ser filtrado de acordo com a estrutura do mercado de longo prazo.
Em situações de turbulência, os preços podem se mover em torno de uma pequena faixa de negociação, o que aumenta a taxa de erro do sinal e aumenta a possibilidade de negociações sem sentido. Isso pode ser evitado por meio da expansão das condições de filtragem do sinal de negociação.
A configuração do stop loss depende do indicador ATR. Se a volatilidade do mercado refletida pelo indicador ATR for imprecisa, a posição de stop loss também será invalidada. Nesse caso, pode-se considerar a correção do valor do ATR em combinação com outros indicadores de volatilidade.
Pode-se considerar a combinação de outros indicadores de curto prazo para auxiliar o julgamento de sinais, como indicadores de sobrevenda e sobrevenda, como o RSI, para aumentar a eficácia do filtro.
Pode-se aumentar ou otimizar a relação lógica de filtragem entre as médias móveis de Hall de curto e longo prazo, tornando as regras de filtragem mais rigorosas e evitando sinais errados.
É possível estudar a influência de diferentes configurações de parâmetros na estabilidade da estratégia e na lucratividade. Diferentes combinações de parâmetros de média móvel, parâmetros ATR, etc. podem produzir diferentes resultados de negociação.
Esta estratégia combina a captura de sinais de média móvel de Hall no curto prazo, a filtragem de sinais de média móvel de Hall no longo prazo e a configuração de stop loss do indicador ATR, formando um sistema de estratégia de acompanhamento de tendência de médio prazo mais completo. A estratégia pode detectar efetivamente os pontos de reversão de preços no médio prazo e evitar a interferência do ruído do mercado no curto prazo, e é uma ferramenta de seleção importante para a criação de sistemas de negociação de tendências.
/*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)