Esta estratégia é uma estratégia de negociação de reversão de curto prazo baseada no indicador Bollinger Band.
Calcule a média móvel e o desvio padrão. Use a função sma ((() para calcular a média móvel sma e a função stdev (()) para calcular o desvio padrão.
Calcule o trilho superior e inferior da faixa de Bollinger de acordo com a média móvel e o desvio padrão.1 e o trilho inferior é o desvio-padrão do preço1.
Quando o preço atravessa o trilho superior ou inferior, indica que o preço é anormal.
Especificamente, se o preço for menor do que o trilho inferior, vamos longo; se o preço for maior do que o trilho superior, vamos curto.
Usar o canal de bandas de Bollinger para julgar preços anormais, o que fornece base para negociação reversa.
Combinado com o fator média móvel, algumas negociações ruidosas podem ser efetivamente filtradas.
A introdução do fator de desvio-padrão torna o canal da banda de Bollinger mais dinâmico para melhor julgar preços anormais.
Esta estratégia tem baixas taxas de utilização e uma certa estabilidade.
O indicador da banda de Bollinger não pode determinar completamente a situação anormal dos preços.
A frequência de negociação pode ser demasiado elevada, sendo recomendado ajustar os parâmetros adequadamente para controlar a frequência de negociação.
Os sinais de ruptura das bandas de Bollinger superiores e inferiores podem durar muito tempo. É necessário um ajustamento adequado dos parâmetros para obter melhores efeitos de reversão.
Introduzir um stop loss adequado para controlar os riscos.
Otimizar o ciclo da média móvel e os parâmetros do desvio-padrão para obter um canal de banda de Bollinger mais razoável.
Aumentar os fatores auxiliares, tais como EMA e MACD, para filtrar alguns sinais.
Introduzir mecanismos de controle de perda e posição.
Otimizar o tamanho da posição e as medidas de controlo da posição.
Esta estratégia julga preços anormais através do indicador Bollinger Band e faz negociações de reversão com médias móveis e parâmetros de desvio padrão. Tem certa estabilidade. Precisamos reduzir ainda mais o drawdown máximo da estratégia e melhorar a estabilidade através de meios como otimização de parâmetros, introdução de fatores auxiliares, gerenciamento de stop loss e controle de posição.
/*backtest start: 2022-12-12 00:00:00 end: 2023-12-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("BCE Version of EMA, SMA Mean Reversion", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // Inputs st_yr_inp = input(defval=2017, title='Backtest Start Year') st_mn_inp = input(defval=01, title='Backtest Start Month') st_dy_inp = input(defval=01, title='Backtest Start Day') en_yr_inp = input(defval=2025, title='Backtest End Year') en_mn_inp = input(defval=01, title='Backtest End Month') en_dy_inp = input(defval=01, title='Backtest End Day') sma_lookback = input(defval=100, title="Lookback Period For SMA") ema_lookback = input(defval=10, title="Lookback Period For EMA") long_diff_perc = input(defval=6, title="Percentage Deviation From SMA to go Long")/100 short_diff_perc = input(defval=20, title="Percentage Deviation From SMA to go Short")/100 ema_filter_bars = input(defval=4, title="The number of bars the EMA must rise/fall") lng_allwd = input(defval=true, title="Allow Longs?") srt_allwd = input(defval=true, title="Allow Shorts?") use_stop = input(defval=true, title="Use Stoploss?") stop_perc = input(defval=30, title="Stop Loss Percentage")/100 // Dates start = timestamp(st_yr_inp, st_mn_inp, st_dy_inp,00,00) end = timestamp(en_yr_inp, en_mn_inp, en_dy_inp,00,00) can_trade = time >= start and time <= end // Indicators Setup sma = sma(close, sma_lookback) ema = ema(close, ema_lookback) // Strategy Calcuations close_stdev = stdev(close, sma_lookback) sd1_upper = close + (close_stdev * 1) sd1_lower = close - (close_stdev * 1) close_diff = (close - sma) / sma // Entries and Exits longCondition = close > sma and open > sma if (time >= start and time <= end) if (longCondition) strategy.entry("Long", strategy.long) if use_stop stop_price = close * (1 - stop_perc) strategy.order("Long Stoploss", false, stop=stop_price) shortCondition = close < sma and open < sma if (shortCondition) // strategy.entry("Short", strategy.short) // if use_stop // stop_price = close * (1 + stop_perc) // strategy.order("Short Stoploss", true, stop=stop_price) //if (time >= start) strategy.close("Long", when=close < sma and open < sma) //strategy.cancel("Long Stoploss", when=sma < sma[1]) // strategy.close("Short", when=close > sma and open > sma) //strategy.cancel("Short Stoploss", when=close_diff<=0) // Plotting sma_col = sma > sma[1] ? green : red ema_fill = close_diff <= -long_diff_perc ? lime : close_diff >= short_diff_perc ? maroon : aqua p_sma = plot(sma, color=sma_col, linewidth=3) p_ema = plot(ema, color=black, linewidth=2) p_sd1 = plot(sd1_upper, color=black, linewidth=1, transp=85) p_sd2 = plot(sd1_lower, color=black, linewidth=1, transp=85) fill(p_sd1, p_sd2, title='STDEV Fill', color=silver, transp=80) fill(p_sma, p_ema, title='EMA > Mean Percentage', color=ema_fill, transp=80)