Este artigo descreve principalmente uma estratégia de negociação que combina o Índice de Força Relativa (RSI) e os níveis de retração de Fibonacci. A estratégia primeiro calcula os principais níveis de retração de Fibonacci com base na dinâmica histórica dos preços durante um determinado período e, em seguida, usa o indicador RSI para julgar se o mercado está sobrecomprado ou sobrevendido perto dos níveis de retração para gerar sinais de negociação.
Os principais princípios subjacentes a esta estratégia são os seguintes:
Usar dados de preços durante um determinado período (por exemplo, 200 bares) para calcular a mediana do preço, o desvio padrão e os níveis principais de retracement de Fibonacci (por exemplo, 0,764) para esse período;
Quando o preço se aproxima dos níveis de retração superior ou inferior, utilizar o indicador RSI para determinar se existe uma situação de sobrecompra ou sobrevenda em torno desses níveis;
Se o indicador RSI mostrar sinais de sobrecompra ou sobrevenda, serão gerados sinais longos ou curtos em torno dos níveis de retração;
Configurar stop loss e take profit para fechar posições quando o preço exceder os níveis pré-definidos ou quando for acionado o stop loss.
O que precede é o fluxo de trabalho básico para identificar oportunidades de negociação nesta estratégia.
Em comparação com o uso de RSI ou Fibonacci sozinho, esta estratégia combinada tem as seguintes vantagens:
A filtragem de indicadores duplos pode reduzir os falsos sinais e melhorar a qualidade do sinal;
A negociação a níveis de retracementos de Fibonacci é uma técnica clássica de análise técnica;
Com stop loss e take profit em ritmo, a perda máxima por negociação pode ser efetivamente controlada;
Os parâmetros podem ser otimizados para diferentes períodos e produtos.
Há também alguns riscos a considerar para esta estratégia:
A probabilidade de uma reversão nos níveis-chave não é de 100%, deve ser combinada com a ação dos preços;
RSI de período único pode gerar falsos sinais de rebotes de gato morto, considere a validação de múltiplos prazos;
A definição de stop loss flexível pode aumentar as perdas;
As paradas podem ser executadas durante oscilações voláteis de preços.
Estes riscos podem ser geridos através da regulação dos parâmetros, da otimização das combinações de indicadores, etc.
As áreas para melhorias adicionais incluem:
Adicionar um indicador de volume para evitar falhas com baixo volume;
Considere Bandas de Bollinger para sinais de rupturas de bandas;
Construir modelos de aprendizagem de máquina para detectar automaticamente oportunidades de negociação de alta qualidade;
Usar algoritmos genéticos para ajustar os parâmetros automáticos e ajustar os níveis de stop loss/profit.
Este artigo descreve em detalhes uma estratégia de negociação quantitativa que combina RSI e análise de retração de Fibonacci. Ao misturar análise de indicadores duplos e estratégias técnicas clássicas, a estratégia melhora a qualidade do sinal sob riscos gerenciados.
/*backtest start: 2023-11-26 00:00:00 end: 2023-12-26 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Gab Fib + RSI", overlay=true, default_qty_type=strategy.cash, default_qty_value=100000, initial_capital=1000, currency=currency.USD, commission_type=strategy.commission.cash_per_order, commission_value=4) // Inputs timeFilter = year >= 2000 // Stop Loss stop_loss = input(title="SL in % of Instrum. i.e 1.5%=150pips", minval=0, step=0.1, defval=1.5) /100 // RSI Inputs len = input(title="[RSI] Length", minval=0, step=1, defval=14) overSold = input(title="[RSI] Over Sold %", defval=30) overBought = input(title="[RSI] Over Bought %", defval=70) // Fibonacci Levels length = input(title="[Fibonacci] Length", defval=200, minval=1) src = input(hlc3, title="[Fibonacci] Source") mult = input(title="[Fibonacci] Multiplier", defval=3.0, minval=0.001, maxval=50) level = input(title="[Fibonacci] Level", defval=764) // Calculate Fibonacci basis = vwma(src, length) dev = mult * stdev(src, length) fu764= basis + (0.001*level*dev) fu1= basis + (1*dev) fd764= basis - (0.001*level*dev) fd1= basis - (1*dev) // Calculate RSI vrsi = rsi(close, len) // Calculate the Targets targetUp = fd764 targetDown = fu764 // Actual Targets bought = strategy.position_size[0] > strategy.position_size[1] exit_long = valuewhen(bought, targetUp, 0) sold = strategy.position_size[0] < strategy.position_size[1] exit_short = valuewhen(sold, targetDown, 0) // Calculate Stop Losses sl_long = close * (1-stop_loss) sl_short = close * (1+stop_loss) // Conditions to Open Trades openLong = low < fd1 and crossover(vrsi[1], overSold) openShort = high > fu1 and crossunder(vrsi[1], overBought) // Conditions to Close Trades closeLong = high > exit_long or sl_long closeShort = low < exit_short or sl_short //Rounding to MinTick value roundtargetUp = round_to_mintick(targetUp) roundtargetDown = round_to_mintick(targetDown) roundsllong = round_to_mintick(sl_long) roundslshort = round_to_mintick(sl_short) // Plots plot(basis, color=color.blue, linewidth=2, title="[Fibonacci Level] Basis") plot(fu764, color=color.white, linewidth=1, title="[Fibonacci Level] Short Target") plot(fu1, color=color.red, linewidth=2, title="[Fibonacci Level] Top") plot(fd764, color=color.white, linewidth=1, title="[Fibonacci Level] Long Target") plot(fd1, color=color.green, linewidth=2, title="[Fibonacci Level] Bottom") // Strategy Orders if timeFilter // Entry Orders strategy.entry(id="buy", long=true, when=openLong and high < targetUp, limit=close, alert_message="buy,"+tostring(syminfo.ticker)+",tp="+tostring(roundtargetUp)+",sl="+tostring(roundsllong)) strategy.entry(id="sell", long=false, when=openShort and low > targetDown, limit=close, alert_message="sell,"+tostring(syminfo.ticker)+",tp="+tostring(roundtargetDown)+",sl="+tostring(roundslshort)) // Exit Orders strategy.exit(id="closelong", when=closeLong and strategy.position_size > 0, limit=exit_long, stop=sl_long, alert_message="closelong,"+tostring(syminfo.ticker)) strategy.exit(id="closeshort", when=closeShort and strategy.position_size < 0, limit=exit_short, stop=sl_short, alert_message="closeshort,"+tostring(syminfo.ticker))