Estratégia de negociação de pirâmide dinâmica de supertendência multiperíodo

ATR ST SL
Data de criação: 2025-01-06 17:02:35 última modificação: 2025-01-06 17:02:35
cópia: 0 Cliques: 460
1
focar em
1617
Seguidores

Estratégia de negociação de pirâmide dinâmica de supertendência multiperíodo

Visão geral

Esta é uma estratégia de negociação em pirâmide baseada em vários indicadores Supertrend. Ele identifica oportunidades de negociação de alta probabilidade definindo o indicador Supertrend com três períodos e multiplicadores diferentes. A estratégia adota um método dinâmico de adição de posições em pirâmide, permite até três entradas e combina stop loss dinâmico e condições de saída flexíveis para atingir a maximização do lucro e o controle de risco.

Princípio da estratégia

A estratégia usa o indicador Supertrend com três configurações de parâmetros diferentes: rápido, médio e lento. O sinal de entrada é baseado na intersecção desses três indicadores e na direção da tendência, usando um estilo de pirâmide de três camadas para adicionar posições: a primeira camada entra no mercado quando o indicador rápido está para baixo, o indicador médio está para cima e o lento indicador está para baixo; a segunda camada entra no mercado quando o indicador rápido está para cima. Entre no mercado por meio de um rompimento quando o indicador de velocidade média e o indicador de velocidade média estão se movendo para baixo juntos; o terceiro nível é entrar no mercado por meio de um rompimento quando o mercado atinge uma nova máxima. A saída adota múltiplos mecanismos, como stop loss dinâmico, stop loss de preço médio e reversão geral de tendência.

Vantagens estratégicas

  1. Mecanismo de confirmação múltipla melhora a precisão da transação
  2. A pirâmide pode aumentar significativamente os lucros em mercados de tendência
  3. O mecanismo dinâmico de stop loss protege os lucros ao mesmo tempo que dá às tendências amplo espaço para se desenvolverem
  4. Mecanismo de saída flexível pode lidar melhor com diferentes ambientes de mercado
  5. Use o controle de posição percentual para se adaptar a diferentes tamanhos de fundos

Risco estratégico

  1. Sinais falsos frequentes podem ocorrer em mercados voláteis
  2. A pirâmide pode levar a reduções maiores quando a tendência se inverte repentinamente
  3. Vários indicadores podem causar atraso no sinal
  4. A otimização de parâmetros tem o risco de overfitting É recomendável usar uma gestão financeira rigorosa e testes retrospectivos para controlar esses riscos.

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

  1. Adicionar mecanismo de filtragem de ambiente de mercado para ajustar dinamicamente os parâmetros em diferentes ambientes de volatilidade
  2. Otimizar o intervalo entre a adição de posições e a proporção de alocação de posições
  3. Introduzir mais indicadores técnicos para filtrar sinais falsos
  4. Desenvolver mecanismos de parâmetros adaptativos para se adaptar às mudanças do mercado
  5. Melhore o mecanismo de saída, você pode considerar adicionar metas de lucro e parar perdas de tempo

Resumir

Essa estratégia captura oportunidades de tendências por meio de vários indicadores Supertrend e métodos de adição de pirâmide, e controla riscos com stop-loss dinâmico e mecanismos de saída flexíveis. Embora existam certas limitações, por meio da otimização contínua e do controle rigoroso de riscos, essa estratégia tem bom valor de aplicação prática.

Código-fonte da estratégia
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy('4Vietnamese 3x Supertrend', overlay=true, max_bars_back=1000, initial_capital = 10000000000, slippage = 2, commission_type = strategy.commission.percent, commission_value = 0.013, default_qty_type=strategy.percent_of_equity, default_qty_value = 33.33, pyramiding = 3, margin_long = 0, margin_short = 0)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Inputs

// Supertrend Settings
STATRLENGTH1 = input.int(10, title='Fast Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT1 = input.float(1, title='Fast Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH2 = input.int(11, title='Medium Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT2 = input.float(2, title='Medium Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH3 = input.int(12, title='Slow Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT3 = input.float(3, title='Slow Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')

isUseHighestOf2RedCandleSetup = input.bool(false, group = "Setup Filters")


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculations 
[superTrend1, dir1] = ta.supertrend(STATRMULT1, STATRLENGTH1)
[superTrend2, dir2] = ta.supertrend(STATRMULT2, STATRLENGTH2)
[superTrend3, dir3] = ta.supertrend(STATRMULT3, STATRLENGTH3)

// directionST1 = dir1 == 1 and dir1[1] == 1 ? false : dir1 == -1 and dir1[1] == -1 ? true : false
// directionST2 = dir2 == 1 and dir2[1] == 1 ? false : dir2 == -1 and dir2[1] == -1 ? true : false
// directionST3 = dir3 == 1 and dir3[1] == 1 ? false : dir3 == -1 and dir3[1] == -1 ? true : false


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculate highest from supertrend1 uptrend
var float highestGreen = 0
if dir1 < 0 and highestGreen == 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
    highestGreen := high
if highestGreen > 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
    if high > highestGreen
        highestGreen := high
if dir1 >= 0
    highestGreen := 0


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry SL
var entrySL4Long1 = false
var entrySL4Long2 = false
var entrySL4Long3 = false

isUseEntrySL = input.bool(true, group = "Entry SL Option")
dataToCalculate = input.source(low, group = "Entry SL Option")

if isUseEntrySL and (dir1 > 0 and dir2 < 0 and dir3 < 0)
    if strategy.opentrades >= 1
        if dataToCalculate > strategy.opentrades.entry_price(0)
            entrySL4Long1 := true
        else 
            entrySL4Long1 := false

        if entrySL4Long1 and close > strategy.opentrades.entry_price(0)
            strategy.exit('exit1', from_entry = 'long1', stop = strategy.opentrades.entry_price(0))

    if strategy.opentrades >= 2 
        if dataToCalculate > strategy.opentrades.entry_price(1)
            entrySL4Long2 := true
        else 
            entrySL4Long2 := false
    
        if entrySL4Long2 and close > strategy.opentrades.entry_price(1)
            strategy.exit('exit2', from_entry = 'long2', stop = strategy.opentrades.entry_price(1))   

    if strategy.opentrades >= 3 
        if dataToCalculate > strategy.opentrades.entry_price(2) 
            entrySL4Long3 := true
        else 
            entrySL4Long3 := false
    
        if entrySL4Long3 and close >  strategy.opentrades.entry_price(2)
            strategy.exit('exit3', from_entry = 'long3', stop = strategy.opentrades.entry_price(2))

if strategy.closedtrades > strategy.closedtrades[1]
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit3'
        entrySL4Long3 := false
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit2'
        entrySL4Long2 := false
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit1'
        entrySL4Long1 := false

    
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry
if dir3 < 0
    if dir2 > 0 and dir1 < 0
        strategy.entry('long1', strategy.long)
    else if dir2 < 0
        strategy.entry('long2', strategy.long, stop=superTrend1)
else
    if dir1 < 0 and highestGreen > 0
        strategy.entry('long3', strategy.long, stop=highestGreen)


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Exit
isUseAllDowntrendExit = input.bool(true, group = "Exit Type")
if isUseAllDowntrendExit and dir3 > 0 and dir2 > 0 and dir1 > 0 and close < open
    strategy.close_all()

isUseAvgPriceInLoss = input.bool(true, group = "Exit Type")
if isUseAvgPriceInLoss and strategy.position_avg_price > close //and strategy.position_avg_price <= close[1]
    //  and (dir1 > 0 or dir2 > 0 or dir3 > 0)
    //  and strategy.opentrades >= 1  
    //  and strategy.opentrades >= 3  
    strategy.close_all()

isUseAllPositionsInLoss = input.bool(false, group = "Exit Type")
if isUseAllPositionsInLoss
      and (
       false
         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close))

         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
             and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close))

         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
             and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close)
             and ((not na(strategy.opentrades.entry_price(2))) and strategy.opentrades.entry_price(2) > close))
         )
    strategy.close_all()


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Plot
plot(superTrend1, title='Fast Supertrend',      color=dir1 == 1 and dir1[1] == 1 ? color.red : dir1 == -1 and dir1[1] == -1 ? color.green : na)
plot(superTrend2, title='Medium Supertrend',    color=dir2 == 1 and dir2[1] == 1 ? color.red : dir2 == -1 and dir2[1] == -1 ? color.green : na)
plot(superTrend3, title='Slow Supertrend',      color=dir3 == 1 and dir3[1] == 1 ? color.red : dir3 == -1 and dir3[1] == -1 ? color.green : na)