Estratégia de ruptura da área de valor de período transversal

Autora:ChaoZhang, Data: 2023-12-12 10:58:22
Tags:

img

Resumo

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.

Estratégia lógica

Os principais passos desta estratégia para determinar a faixa de preços e encontrar oportunidades comerciais são:

  1. Calcular o RSI Swing High e Swing Low com base num ciclo maior (por exemplo, diário).
  2. Determinar se o RSI do ciclo mais longo atingiu uma nova alta ou baixa no período de observação.
  3. Se houver uma ruptura, julgue a tendência do preço (bullish ou bearish) em um ciclo menor (por exemplo, 5 min) e tome as ações de compra ou venda correspondentes.

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.

Análise das vantagens

Em comparação com as estratégias tradicionais que se concentram apenas num período, esta estratégia tem as seguintes vantagens:

  1. 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.

  2. 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.

  3. Uma grande ruptura de ciclo aponta a direção geral, enquanto só precisamos localizar oportunidades em ciclos pequenos como 5 minutos para lucro.

  4. 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.

Análise de riscos

Os principais riscos desta estratégia consistem em:

  1. 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.

  2. 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.

  3. 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.

Orientações de otimização

Ainda há muito espaço para melhorar esta estratégia, principalmente no que diz respeito aos seguintes aspectos:

  1. Teste mais combinações de períodos para encontrar parâmetros ideais.

  2. Ajuste de parâmetros RSI lookback etc parâmetros para melhorar a precisão do julgamento.

  3. Adicione mais indicadores. Traga mais indicadores como MA para ajudar a julgar a direção da tendência.

  4. Melhorar o mecanismo de stop loss. Ajustar dinamicamente os pontos de stop loss com base nas condições de drawdown.

  5. 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.

Conclusão

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)

Mais.