A ideia central desta estratégia é determinar a faixa de preços atual combinando indicadores de RSI de diferentes ciclos e tomar ações de compra ou venda correspondentes em ciclos menores quando há uma ruptura no RSI de ciclo maior.
Os principais passos desta estratégia para determinar a faixa de preços e encontrar oportunidades comerciais são:
Por exemplo, quando o RSI diário quebra sua alta anterior, julgamos que é atualmente um mercado de touros. E quando o RSI diário quebra abaixo de sua baixa anterior, julgamos como um mercado de ursos. Em ambos os casos, tomamos ações longas e curtas, respectivamente, no gráfico de 5 minutos.
Em comparação com as estratégias tradicionais que se concentram apenas num período, esta estratégia tem as seguintes vantagens:
Uma avaliação mais precisa do valor relativo dos preços atuais. Ciclos maiores, como o diário, podem filtrar o ruído do mercado a curto prazo e determinar a tendência geral e a área de valor.
A combinação de indicadores entre períodos melhora a confiabilidade do sinal. Confiando apenas em um único indicador de período pode gerar sinais falsos mais facilmente, enquanto sinais simultâneos de vários períodos é mais confiável.
Uma grande ruptura de ciclo aponta a direção geral, enquanto só precisamos localizar oportunidades em ciclos pequenos como 5 minutos para lucro.
A combinação de períodos cruzados ajuda a evitar ficarmos presos, podemos sair rapidamente quando os grandes indicadores do ciclo começarem a reverter.
Os principais riscos desta estratégia consistem em:
Julgamento incorreto em indicadores de ciclos grandes. Determinação ineficaz da área de valor no RSI diário, etc., pode levar a sinais defeituosos. Ajuste de parâmetros do RSI é necessário para melhorar a precisão.
Divergência entre movimentos de preços de ciclos pequenos e determinação de ciclos grandes. Às vezes, os movimentos de curto prazo contrariam as tendências de grande escala. Precisamos definir o stop loss adequado para controlar a perda.
A gestão inadequada do risco. Perdas excessivas no comércio único devido a uma classificação de posição inadequada podem conduzir a uma redução irrecuperavel.
Ainda há muito espaço para melhorar esta estratégia, principalmente no que diz respeito aos seguintes aspectos:
Teste mais combinações de períodos para encontrar parâmetros ideais.
Ajuste de parâmetros RSI lookback etc parâmetros para melhorar a precisão do julgamento.
Adicione mais indicadores. Traga mais indicadores como MA para ajudar a julgar a direção da tendência.
Melhorar o mecanismo de stop loss. Ajustar dinamicamente os pontos de stop loss com base nas condições de drawdown.
Otimizar as regras de dimensionamento das posições e gerenciar os tamanhos de posições específicas para cada negócio de forma mais científica.
Esta estratégia realiza arbitragem de período cruzado entre diferentes dimensões de tempo, avaliando a condição de alta nos RSI de período cruzado. Essa ideia de julgamento de período cruzado merece mais exploração. Podemos continuar melhorando através de ajuste de parâmetros, otimização de stop loss, combinações de indicadores para torná-lo mais vantajoso.
/*backtest start: 2022-12-05 00:00:00 end: 2023-12-11 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Swing MTF", shorttitle="Swing MTF", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5) // otf_period = input(defval=2, title="Look Back Period (2nd Timeframe)") otf = input(defval="180", title="Second Momentum Timeframe") // Function to dectect a new bar is_newbar(res) => t = time(res) change(t) != 0 ? true : false // Check how many bars are in our upper timeframe since_new_bar = barssince(is_newbar(otf)) otf_total_bars = na otf_total_bars := since_new_bar == 0 ? since_new_bar[1] : otf_total_bars[1] //Calculate RSI Values ctf_rsi = rsi(open, otf_period) breakline=input(title="Breaks in lines", defval = true, type=bool) so = request.security(syminfo.tickerid, otf, rsi(open, otf_period)) sc = request.security(syminfo.tickerid, otf, rsi(close, otf_period)) final_otf_so = na final_otf_so := barstate.isrealtime ? since_new_bar == otf_total_bars ? so : final_otf_so[1] : so final_otf_sc = na final_otf_sc := barstate.isrealtime ? since_new_bar == otf_total_bars ? sc : final_otf_sc[1] : sc barsback = input(11, title='Bars back to check for a swing') // showsig = input(false, title='Show Signal Markers') swing_detection(index)=> swing_high = false swing_low = false start = (index*2) - 1 // -1 so we have an even number of swing_point_high = final_otf_so[index] swing_point_low = final_otf_sc[index] //Swing Highs for i = 0 to start swing_high := true if i < index if final_otf_so[i] > swing_point_high swing_high := false break // Have to do checks before pivot and after seperately because we can get // two highs of the same value in a row. Notice the > and >= difference if i > index if final_otf_so[i] >= swing_point_high swing_high := false break //Swing lows for i = 0 to start swing_low := true if i < index if final_otf_sc[i] < swing_point_low swing_low := false break // Have to do checks before pivot and after seperately because we can get // two lows of the same value in a row. Notice the > and >= difference if i > index if final_otf_sc[i] <= swing_point_low swing_low := false break [swing_high, swing_low] // Check for a swing [swing_high, swing_low] = swing_detection(barsback) long = final_otf_so > final_otf_sc short = final_otf_so < final_otf_sc if swing_low and long strategy.entry("My Long Entry Id", strategy.long) if swing_high and short strategy.entry("My Short Entry Id", strategy.short)