Estratégia de cruzamento do índice corporal relativo

Autora:ChaoZhang, Data: 2023-10-18 11:16:53
Tags:

img

Resumo

Esta estratégia usa principalmente os sinais de cruzamento da média móvel da relação relativa do corpo (RB) dos velas diárias para determinar a tendência, juntamente com stop loss e take profit para negociação automatizada.

Estratégia lógica

A estratégia baseia-se no indicador RBI da Vitelot, que calcula a média móvel da relação relativa do corpo (RB) dos candelabros diários.

A fórmula calcula a proporção do corpo real ao comprimento total do castiçal para velas de alta, tomando valores positivos; e valores negativos para velas de baixa.

O indicador do RBI usa a média móvel do RB para filtrar o ruído e capturar a essência das tendências do mercado.

Para evitar sinais falsos durante fases de alta incerta, a estratégia também verifica se o preço de fechamento está acima da EMA de 13 períodos antes de gerar um verdadeiro sinal de compra para a posição longa.

A estratégia também implementa stop loss e take profit para controlar riscos e bloquear lucros.

Análise das vantagens

  • O RBI filtra o ruído significativo e capta as características da tendência do mercado, evitando falsos sinais de mercados variados.

  • O uso de um filtro de média móvel evita sinais falsos efetivamente durante as fases de alta incertas, reduzindo as perdas dos shorts.

  • O sistema de stop loss e take profit ajuda a reduzir o risco de perdas em posições individuais e a bloquear os lucros, melhorando a rentabilidade global.

  • A estratégia tem poucos parâmetros e é fácil de entender, adequada para negociação automatizada.

Análise de riscos

  • A estratégia depende apenas do RBI, quaisquer sinais errados do indicador podem levar ao fracasso.

  • O mau ajuste dos parâmetros do indicador também pode piorar a qualidade dos sinais de negociação.

  • Nenhum indicador técnico pode evitar completamente as perdas em determinadas condições de mercado.

  • A definição de stop loss demasiado apertada pode resultar em stop outs demasiado frequentes; a definição de stop loss demasiado larga pode resultar em grandes perdas em posições únicas.

  • O controlo insuficiente da utilização das contas pode conduzir a riscos de eliminação das contas.

Orientações de otimização

  • Podem ser testadas diferentes combinações de parâmetros para otimizar os parâmetros do RBI.

  • Poderiam ser adicionados indicadores adicionais para a filtragem de sinais e melhorias de qualidade.

  • O aprendizado de máquina pode ser usado para treinar e otimizar os parâmetros de stop loss e take profit.

  • Podem ser adicionadas estratégias de gestão de riscos para controlar o dimensionamento geral das posições e a exposição ao risco.

  • Poderiam ser explorados diferentes períodos de detenção, como detenções overnight ou scalping a curto prazo.

Conclusão

No geral, esta é uma estratégia de tendência relativamente simples e direta. Ele usa o crossover do RBI para determinar a direção da tendência, com filtros adicionais e stop loss / take profit para controlar riscos, evitando efetivamente falsos sinais de mercados variados. Mas nenhum indicador técnico pode evitar completamente os riscos. Melhorias contínuas, como otimização de parâmetros, gerenciamento de riscos, ainda são necessárias para retornos excessivos estáveis a longo prazo. A lógica é clara e fácil de entender, adequada para negociação automatizada.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("RBI Backtest /w TSSL", shorttitle="RBI Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5)
// RBI:
//  The EMA of the relative body (RB) of Japanese candles is evaluated.
//  The RB of a candle (my definition) is simply the ratio of the body with respect to its full length
//  and taken positive for bull candles and negative for bear candles:
//      e.g. a bull "marubozo" has RB=1 a bear "marubozo" has RB=-1;
//      a "doji" has RB=0.
//  This simple indicator grasps the essence of the market by filtering out a great deal of noise.
//
//  A flag can be selected to calculate its very basic binary version, where a bull candle counts as a one
//  and a bear candle counts as a minus one.
//
//  Enter (or exit) the market when the signal line crosses the base line.
//  When the market is choppy we have a kind of alternating bear and bull candles so that
//  RBI is FLAT and usually close to zero. 
//  Therefore avoid entering the market when RBI is FLAT and INSIDE the Exclusion level.
//  The exclusion level is to be set by hand: go back in history and check when market was choppy; a good
//  way to set it is to frame the oscillations of RBI whe price was choppy.
//
//  RBI is more effective when an EMA of price is used as filtering. I found EMA(13) to be
//  a decent filter: go long when base crosses signal upwards AND closing price is above EMA(13);
//  same concept for going short.
//
//  As any other indicator, use it with responsibility: THERE CAN'T BE A SINGLE MAGIC INDICATOR winning
//  all trades.
//
//  Above all, have fun.
//
// Vitelot/Yanez/Vts March 31, 2019

par1 = input(5, title="MA1 Period")
par2 = input(5, title="Signal Period")
exclusion = input(0.2, title="Exclusion level")

useBin = input(false, title="Calculate the binary version")

treshold_long = input(0, title="Treshold Long")
treshold_short = input(0, title="Treshold Short")

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=120)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true

ynSimple(t) =>
    s = (close>open)? 1: -1
    ema(sum(s,t),t)

ynRel(t) =>
    s = (close-open)/(high-low)
    ema(sum(s,t),t)

yn = useBin? ynSimple(par1): ynRel(par1) 
sig = ema(yn,par2)


plot(yn, color=aqua, title="RBI", linewidth=3, transp=0)
plot(sig, color=orange, title="Signal", linewidth=2, transp=0)

hline(0, color=white, title="Zero level", editable=false)
hline(exclusion, color=yellow, title="Exclusion level +", editable=true, linestyle=line)
hline( 0-exclusion, color=yellow, title="Exclusion level -", editable=true, linestyle=line)

long = crossover(yn,sig) and yn < treshold_long
short = crossover(sig,yn)  and yn > treshold_short

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)


Mais.