
A estratégia usa o indicador RSI para determinar a sobrecompra e a sobrevenda do mercado, juntamente com a descida da faixa de Brin para determinar a amplitude da oscilação do preço. Além disso, a resistência de suporte dinâmica é gerada com base nos pontos altos e baixos, e a compra e venda são executadas quando o preço está perto da resistência de suporte. O usuário pode definir condições de filtragem de tendência por conta própria, como a linha de equilíbrio móvel simples, que determina o preço e a direção da tendência.
A estratégia é composta por três partes: RSI, Brinks e Resistência ao Suporte Dinâmico.
A parte do RSI é usada para julgar sobrecompra e sobrevenda. Quando o RSI está abaixo de 30, é uma zona de sobrevenda, e emite um sinal de compra. Quando o RSI está acima de 70, é uma zona de sobrevenda, e emite um sinal de venda.
A faixa de Brin é uma subida e descida de um preço com base na média e na diferença padrão, usada para determinar se o preço está fora da zona de choque normal. Os preços são vendidos quando estão perto da subida e comprados quando estão perto da descida.
A parte de resistência de suporte usa um método de cálculo dinâmico, com o preço mais baixo (ou preço de fechamento) de um determinado período como referência, limitando a faixa dentro de uma determinada porcentagem e registrando o ponto de reversão histórico de preços como um ponto de resistência de suporte crítico. Quando o preço sobe perto do ponto de resistência de suporte crítico, emite um sinal de venda; Quando o preço cai para o ponto de suporte crítico, emite um sinal de compra.
Em resumo, a estratégia só executa uma operação de compra e venda quando o RSI atende simultaneamente às três condições de sobrecompra e sobrevenda, a saída do preço do intervalo normal e a aproximação da resistência ao suporte dinâmico.
Os indicadores fundamentais são combinados com os indicadores técnicos. O RSI determina a forma técnica do preço usando as faixas de Brin para determinar a forma técnica do preço ao mesmo tempo em que o RSI determina a forma técnica do preço.
Calculação da resistência de suporte dinâmico, mais próxima da resistência de suporte real do movimento de preços.
Os usuários podem adicionar filtros de tendência, compatíveis com RSI e Brinks, que melhoram significativamente o julgamento e filtram a maior parte dos sinais de ruído.
A configuração inadequada dos parâmetros do RSI pode levar a erros de julgamento. O RSI é muito curto e aumenta o ruído. O RSI supera o limiar de compra e venda incorreta também pode causar erros.
Parâmetros como o comprimento da faixa de Bryn, o múltiplo de StdDev definido de forma inadequada também podem afetar a precisão do julgamento.
A resistência de suporte dinâmico está atrasada devido ao cálculo de altas e baixas históricas. O usuário deve otimizar adequadamente os parâmetros de resistência de suporte para que o nível de resistência de suporte esteja mais próximo do preço atual.
Esta estratégia é mais complexa e combinações de vários indicadores podem interferir entre si. O usuário deve testar os parâmetros do indicador para reduzir os conflitos de indicadores. Além disso, pode simplificar adequadamente as condições do conjunto para reduzir a probabilidade de erro de julgamento.
Teste as configurações dos parâmetros do RSI, otimize o comprimento do RSI, e ultrapasse os limiares de compra e venda.
Teste a configuração dos parâmetros da faixa de Brin, otimize o comprimento da faixa de Brin, o múltiplo de StdDev.
Optimizar os parâmetros de resistência de suporte dinâmico para que o nível de resistência de suporte esteja mais próximo do preço. Pode tentar um período mais curto, menos altas e baixas históricas e outras configurações.
Adicionar ou testar outros indicadores auxiliares, como KDJ, MACD e outros, em combinação com o RSI, para melhorar a precisão do julgamento.
Testar os parâmetros do filtro de tendência, otimizar o comprimento do filtro, aumentar o tempo de retenção e reduzir a inversão desnecessária.
Esta estratégia utiliza vários indicadores, como RSI, Brinband e Resistência de Apoio Dinâmico, para aproveitar ao máximo as vantagens de cada indicador, é mutuamente verificável e tem um bom discernimento. Ao mesmo tempo, um filtro de tendência pode ser adicionado para reduzir ainda mais o ruído. A configuração dos parâmetros da estratégia é flexível e o usuário pode ajustar o conjunto de parâmetros de acordo com suas necessidades.
/*backtest
start: 2023-01-17 00:00:00
end: 2024-01-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("RSI + BB + S/R Strategy with Trend Filter", shorttitle="RSI + BB + S/R + Trend Filter", overlay=true)
// RSI Settings
rsi_length = input.int(14, title="RSI Length")
overbought = input.int(70, title="Overbought Level")
oversold = input.int(30, title="Oversold Level")
// Bollinger Bands Settings
bb_length = input.int(20, title="BB Length")
bb_deviation = input.float(2.0, title="BB Deviation")
// Dynamic Support/Resistance Settings
pivot_period = input.int(10, title="Pivot Period")
pivot_source = input.string("High/Low", title="Pivot Source", options=["High/Low", "Close/Open"])
max_pivots = input.int(20, title="Maximum Number of Pivot", minval=5, maxval=100)
channel_width = input.int(10, title="Maximum Channel Width %", minval=1)
max_sr_levels = input.int(5, title="Maximum Number of S/R Levels", minval=1, maxval=10)
min_strength = input.int(2, title="Minimum Strength", minval=1, maxval=10)
// Trend Filter Settings
use_trend_filter = input.bool(false, title="Use Trend Filter")
trend_filter_length = input.int(50, title="Trend Filter Length")
// Calculate RSI and Bollinger Bands
rsi = ta.rsi(close, rsi_length)
basis = ta.sma(close, bb_length)
deviation = ta.stdev(close, bb_length)
upper_band = basis + bb_deviation * deviation
lower_band = basis - bb_deviation * deviation
// Plot Bollinger Bands on the chart
plot(upper_band, color=color.blue, title="Upper Bollinger Band")
plot(lower_band, color=color.red, title="Lower Bollinger Band")
// Dynamic Support/Resistance Calculation
float src1 = pivot_source == "High/Low" ? high : math.max(close, open)
float src2 = pivot_source == "High/Low" ? low : math.min(close, open)
float ph = ta.pivothigh(src1, pivot_period, pivot_period)
float pl = ta.pivotlow(src2, pivot_period, pivot_period)
// Calculate maximum S/R channel zone width
prdhighest = ta.highest(300)
prdlowest = ta.lowest(300)
cwidth = (prdhighest - prdlowest) * channel_width / 100
var pivotvals = array.new_float(0)
if ph or pl
array.unshift(pivotvals, ph ? ph : pl)
if array.size(pivotvals) > max_pivots
array.pop(pivotvals)
get_sr_vals(ind) =>
float lo = array.get(pivotvals, ind)
float hi = lo
int numpp = 0
for y = 0 to array.size(pivotvals) - 1 by 1
float cpp = array.get(pivotvals, y)
float wdth = cpp <= lo ? hi - cpp : cpp - lo
if wdth <= cwidth
if cpp <= hi
lo := math.min(lo, cpp)
else
hi := math.max(hi, cpp)
numpp += 1
[hi, lo, numpp]
var sr_up_level = array.new_float(0)
var sr_dn_level = array.new_float(0)
sr_strength = array.new_float(0)
find_loc(strength) =>
ret = array.size(sr_strength)
for i = ret > 0 ? array.size(sr_strength) - 1 : na to 0 by 1
if strength <= array.get(sr_strength, i)
break
ret := i
ret
check_sr(hi, lo, strength) =>
ret = true
for i = 0 to array.size(sr_up_level) > 0 ? array.size(sr_up_level) - 1 : na by 1
if array.get(sr_up_level, i) >= lo and array.get(sr_up_level, i) <= hi or array.get(sr_dn_level, i) >= lo and array.get(sr_dn_level, i) <= hi
if strength >= array.get(sr_strength, i)
array.remove(sr_strength, i)
array.remove(sr_up_level, i)
array.remove(sr_dn_level, i)
else
ret := false
break
ret
if ph or pl
array.clear(sr_up_level)
array.clear(sr_dn_level)
array.clear(sr_strength)
for x = 0 to array.size(pivotvals) - 1 by 1
[hi, lo, strength] = get_sr_vals(x)
if check_sr(hi, lo, strength)
loc = find_loc(strength)
if loc < max_sr_levels and strength >= min_strength
array.insert(sr_strength, loc, strength)
array.insert(sr_up_level, loc, hi)
array.insert(sr_dn_level, loc, lo)
if array.size(sr_strength) > max_sr_levels
array.pop(sr_strength)
array.pop(sr_up_level)
array.pop(sr_dn_level)
// Calculate the Trend Filter
trend_filter = use_trend_filter ? ta.sma(close, trend_filter_length) : close
// Buy Condition (RSI + Proximity to Support + Trend Filter)
buy_condition = ta.crossover(rsi, oversold) and close <= ta.highest(high, max_sr_levels) and close >= ta.lowest(low, max_sr_levels) and (not use_trend_filter or close > trend_filter)
// Sell Condition (RSI + Proximity to Resistance + Trend Filter)
sell_condition = ta.crossunder(rsi, overbought) and close >= ta.lowest(low, max_sr_levels) and close <= ta.highest(high, max_sr_levels) and (not use_trend_filter or close < trend_filter)
// Strategy Orders
strategy.entry("Buy", strategy.long, when = buy_condition)
strategy.entry("Sell", strategy.short, when = sell_condition)