Estratégia de dimensionamento de hedge de momentum RSI-EMA múltiplo

RSI EMA TP SL
Data de criação: 2024-12-04 15:41:10 última modificação: 2024-12-04 15:41:10
cópia: 0 Cliques: 514
1
focar em
1617
Seguidores

Estratégia de dimensionamento de hedge de momentum RSI-EMA múltiplo

Visão geral

Trata-se de uma estratégia de negociação de cobertura dinâmica baseada no indicador RSI e na linha média EMA. A estratégia usa o período de tempo duplo RSI ((RSI-14 e RSI-2) em combinação com a linha média tripla EMA ((50 , 100 , 200) para capturar oportunidades de reversão de tendência de mercado e obter um efeito de contra-balanço através da gestão dinâmica da posição.

Princípio da estratégia

A estratégia usa índices relativamente fortes de RSI-14 e RSI-2 de dois períodos diferentes, em conjunto com três linhas de equilíbrio EMA-50, EMA-100 e EMA-200, para determinar o sinal de negociação. Para fazer condições múltiplas, o RSI-14 é inferior a 31 e o RSI-2 é superior a 10, exigindo que as três linhas de equilíbrio apresentem um alinhamento em branco (EMA-50 < EMA-100 < EMA-200).

Vantagens estratégicas

  1. Verificação cruzada de indicadores tecnológicos multicamadas para aumentar a confiabilidade do sinal
  2. Gerenciamento de posições dinâmico, com flexibilidade para ajustar as posições de acordo com as condições do mercado
  3. Mecanismo de negociação bidirecional, que permite lucrar em ambas as direções
  4. Adaptar-se às condições de parada para evitar a saída prematura
  5. A interface gráfica mostra claramente os sinais de negociação e o estado do mercado
  6. Os mecanismos de cobertura podem reduzir a exposição a riscos unilaterais
  7. Calculação de posições dinâmicas com base em direitos e interesses, controle de risco mais racional

Risco estratégico

  1. Os múltiplos de alta alavancagem (de 20 vezes) podem levar a um maior risco de ruptura de posição
  2. Posições em ascensão podem causar grandes perdas em momentos de forte volatilidade do mercado
  3. Sem condições de parada, o risco de queda pode continuar.
  4. O indicador RSI pode gerar sinais falsos em um mercado lateral
  5. A combinação de vários indicadores técnicos pode reduzir as oportunidades de negociação
  6. A administração de posições pode acumular grandes riscos em transações simultâneas

Direção de otimização da estratégia

  1. Introdução de mecanismos de suspensão adaptativos, como suspensão dinâmica baseada no ATR ou na volatilidade
  2. Optimizar o coeficiente de alavancagem, podendo ser considerado um ajuste de acordo com a dinâmica de volatilidade do mercado
  3. Adição de filtros de tempo para evitar negociações em períodos de baixa volatilidade
  4. Introdução de indicadores de tráfego para melhorar a confiabilidade do sinal
  5. Optimizar o multiplicador de aumento de posição, considerando a definição de limite máximo de posição
  6. Adicionado filtro de força de tendência para evitar negociação em tendências fracas
  7. Melhorar os mecanismos de gestão de riscos, como a fixação de limites de perdas máximas diárias

Resumir

Trata-se de uma estratégia integrada que combina dinâmica e tendências para melhorar a precisão das negociações através da combinação de vários indicadores técnicos. A inovação da estratégia consiste na adoção de uma gestão de posição dinâmica e um mecanismo de cobertura, mas também traz um risco maior.

Código-fonte da estratégia
/*backtest
start: 2024-11-26 00:00:00
end: 2024-12-03 00:00:00
period: 10m
basePeriod: 10m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Custom RSI EMA Strategy Hedge", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)

// Definování vstupních podmínek
rsi_14 = ta.rsi(close, 14)
rsi_2 = ta.rsi(close, 2)
ema_50 = ta.ema(close, 50)
ema_100 = ta.ema(close, 100)
ema_200 = ta.ema(close, 200)

// Pákový efekt
leverage = 20

// Podmínky pro long pozici
longCondition = (rsi_14[1] < 31) and ta.crossover(rsi_2, 10) and (ema_50 < ema_100) and (ema_100 < ema_200)

// Podmínky pro short pozici
shortCondition = (rsi_14[1] > 69) and ta.crossunder(rsi_2, 90) and (ema_50 > ema_100) and (ema_100 > ema_200)

// Identifikátory pozic
long_id = "Long"
short_id = "Short"

// Definování průměrné ceny pozice pro long a short
var float long_avg_price = na
var float short_avg_price = na

// Sledujeme, zda se velikost pozice změnila
var float last_long_position_size = na
var float last_short_position_size = na

// Přerušení průměrné ceny pozice při změně pozice
if (last_long_position_size != strategy.position_size and strategy.position_size > 0)
    long_avg_price := na
if (last_short_position_size != strategy.position_size and strategy.position_size < 0)
    short_avg_price := na

// Aktualizace průměrné ceny pozice
if (strategy.position_size > 0)
    long_avg_price := strategy.position_avg_price
else
    long_avg_price := na

if (strategy.position_size < 0)
    short_avg_price := strategy.position_avg_price
else
    short_avg_price := na

// Uložení aktuální velikosti pozice pro příští bar
if (strategy.position_size > 0)
    last_long_position_size := strategy.position_size
else if (strategy.position_size < 0)
    last_short_position_size := strategy.position_size

// Podmínky pro take profit
takeProfitLongCondition = (rsi_14 > 69) and (rsi_2 > 90) and (long_avg_price < close)
takeProfitShortCondition = (rsi_14 < 31) and (rsi_2 < 10) and (short_avg_price > close)

// Velikost pozice
new_long_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2
new_short_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2

// Úprava velikosti pozice s ohledem na pákový efekt
position_value = strategy.equity * leverage
trade_qty_long = position_value / close
trade_qty_short = position_value / close

// Vstup do long pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici
if (longCondition)
    strategy.entry(long_id, strategy.long, qty=new_long_position_size == na ? trade_qty_long : new_long_position_size)

// Vstup do short pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici
if (shortCondition)
    strategy.entry(short_id, strategy.short, qty=new_short_position_size == na ? trade_qty_short : new_short_position_size)

// Výstup z long pozice při splnění podmínek pro take profit
if (takeProfitLongCondition)
    strategy.close(long_id)

// Výstup z short pozice při splnění podmínek pro take profit
if (takeProfitShortCondition)
    strategy.close(short_id)

// Zvýraznění části grafu, kde platí podmínky pro long
highlightLongCondition = (ema_50 < ema_100) and (ema_100 < ema_200)
bgcolor(highlightLongCondition ? color.new(color.green, 90) : na)

// Zvýraznění části grafu, kde platí podmínky pro short
highlightShortCondition = (ema_50 > ema_100) and (ema_100 > ema_200)
bgcolor(highlightShortCondition ? color.new(color.red, 90) : na)

// Přidání bodů pozic do grafu
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="L")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="S")

// Vykreslení průměrné ceny pozice pro long a short pouze pokud pozice existuje
plot(strategy.position_size > 0 ? long_avg_price : na, title="Long Avg Price", color=color.blue, linewidth=2)
plot(strategy.position_size < 0 ? short_avg_price : na, title="Short Avg Price", color=color.orange, linewidth=2)

// Zvýraznění čtverců pro RSI14 > 70 (červeně) a RSI14 < 30 (zeleně)
var int rsi_above_70_start = na
var int rsi_below_30_start = na

var float top_value_above_70 = na
var float bottom_value_above_70 = na

var float top_value_below_30 = na
var float bottom_value_below_30 = na

// Identifikace začátku a konce období pro RSI14 > 70
if (rsi_14[1] > 70 and rsi_14[2] > 70)
    if na(rsi_above_70_start)
        rsi_above_70_start := bar_index
        top_value_above_70 := high
        bottom_value_above_70 := low
    else
        top_value_above_70 := math.max(top_value_above_70, high)
        bottom_value_above_70 := math.min(bottom_value_above_70, low)
else
    if not na(rsi_above_70_start)
        // box.new(left = rsi_above_70_start, right = bar_index - 1, top = top_value_above_70, bottom = bottom_value_above_70, border_color = color.red, border_width = 2, bgcolor=color.new(color.red, 90))
        rsi_above_70_start := na
        top_value_above_70 := na
        bottom_value_above_70 := na

// Identifikace začátku a konce období pro RSI14 < 30
if (rsi_14[1] < 30 and rsi_14[2] < 30)
    if na(rsi_below_30_start)
        rsi_below_30_start := bar_index
        top_value_below_30 := high
        bottom_value_below_30 := low
    else
        top_value_below_30 := math.max(top_value_below_30, high)
        bottom_value_below_30 := math.min(bottom_value_below_30, low)
else
    if not na(rsi_below_30_start)
        // box.new(left = rsi_below_30_start, right = bar_index - 1, top = top_value_below_30, bottom = bottom_value_below_30, border_color = color.green, border_width = 2, bgcolor=color.new(color.green, 90))
        rsi_below_30_start := na
        top_value_below_30 := na
        bottom_value_below_30 := na