Estratégia da média móvel do filtro do casco

Autora:ChaoZhang, Data: 2024-01-04 15:16:34
Tags:

img

Resumo

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.

Estratégia lógica

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.

Análise das vantagens

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.

Análise de riscos

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.

Optimização

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.

Resumo

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)


Mais.