Estratégia de identificação de rompimento de momentum


Data de criação: 2023-11-02 14:39:22 última modificação: 2023-11-02 14:39:22
cópia: 0 Cliques: 554
1
focar em
1617
Seguidores

Estratégia de identificação de rompimento de momentum

Visão geral

Esta estratégia é uma estratégia de acompanhamento de tendências, que se beneficia ao identificar ações que estão subindo rapidamente e fazer mais posições quando a alta é atingida, usando uma parada de percentual fixo.

Princípios

A estratégia baseia-se em dois indicadores:

  1. RSI rápido: para determinar a dinâmica de preços, calcule as mudanças de alta e baixa das últimas 3 linhas K. Quando o RSI rápido é inferior a 10, o estoque é considerado ultrapassado.

  2. Filtragem de entidades: calcula o tamanho médio das entidades das 20 linhas K mais recentes, quando uma entidade de preço é 2,5 vezes maior que a média, sendo considerada uma ruptura efetiva.

Quando o RSI rápido é inferior a 10 e a filtragem de ativos é efetiva, a abertura de mais uma posição é feita. Depois, configure um ponto de parada fixo de 20% quando o preço for superior ao preço de abertura*(1 + proporção de suspensão) quando a posição está parada.

A vantagem da estratégia é que pode capturar oportunidades de ruptura na fase inicial da tendência, julgar a região inferior através do RSI rápido, filtrar a entidade para evitar falsas rupturas. Adotar um método de parada fixa para bloquear cada ganho único, pode manter a tendência.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. Usando o RSI rápido para determinar a área de superação do fundo, pode-se melhorar a precisão de entrada.

  2. O mecanismo de filtragem principal pode evitar a falsa ruptura causada pela vibração.

  3. O que é que você está fazendo? O que você está fazendo?

  4. A lógica da estratégia é simples, clara e fácil de entender.

  5. A estrutura do código é elegante, extensivo e fácil de usar para otimização de estratégias.

  6. Durante o período de avaliação, a estratégia obteve um retorno positivo estável, com uma alta taxa de vitória.

Análise de Riscos

A estratégia também apresenta alguns riscos que devem ser lembrados:

  1. A estratégia não possui um mecanismo de stop loss e existe o risco de expansão de uma única perda.

  2. A configuração inadequada do ponto de parada fixo pode causar parada prematura ou parada profunda.

  3. Quando a situação é turbulenta, é fácil produzir perdas pequenas e contínuas.

  4. O lucro em tempo real será menor, sem levar em conta os custos de financiamento e liquidação.

  5. Os parâmetros da estratégia não foram otimizados adequadamente, sendo necessário ajustar os parâmetros para diferentes variedades.

Direção de otimização

A estratégia pode ser otimizada em:

  1. Aumentar o mecanismo de suspensão de prejuízos para controlar as perdas individuais.

  2. Otimizar o ponto de paragem para que ele possa acompanhar dinamicamente a tendência.

  3. Otimizar os indicadores de julgamento de brechas e aumentar a precisão de admissão.

  4. Adicionar módulos de gerenciamento de posições e otimizar a ocupação de posições.

  5. Adicionar o módulo de otimização de parâmetros de variedades para otimizar automaticamente os parâmetros de diferentes variedades.

  6. Aumentar as condições de filtragem para evitar prejuízos em situações de alta volatilidade.

  7. Considere adicionar um módulo de gestão de custos médios de posição.

Resumir

Esta estratégia é, em geral, uma estratégia de acompanhamento de tendências muito simples e elegante. Utiliza o rápido RSI para julgar os excessos e quedas, a filtragem de entidades para determinar a quebra efetiva e a obtenção de ganhos estáveis com o uso de pontos de parada fixos. Embora haja algum espaço para otimização, a estratégia responde de forma ágil e é adequada para capturar cenários de mudanças rápidas de comportamento.

Código-fonte da estratégia
/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// this is based on https://www.tradingview.com/v/PbQW4mRn/
strategy(title = "ONLY LONG V4 v1", overlay = true, initial_capital = 1000, pyramiding = 1000,
   calc_on_order_fills = false, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 50, commission_value = 0.075)

//study(title = "ONLY LONG V4 v1", overlay = true)

//Fast RSI
src = close
fastup = rma(max(change(src), 0), 3)
fastdown = rma(-min(change(src), 0), 3)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body Filter
body = abs(close - open)
abody = sma(body, 20)

mac = sma(close, 20)
len = abs(close - mac)
sma = sma(len, 100)
max = max(open, close)
min = min(open, close)
up = close < open and len > sma * 2 and min < min[1] and fastrsi < 10 and body > abody * 2.5

// Strategy
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

var bool longCondition = na

longCondition := up == 1 ? 1 : na

// Get the price of the last opened long

var float last_open_longCondition = na

last_open_longCondition := longCondition ? close : nz(last_open_longCondition[1])

// Get the bar time of the last opened long

var int last_longCondition = 0

last_longCondition := longCondition ? time : nz(last_longCondition[1])

// Take profit
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

tp = input(20, "TAKE PROFIT %", type = input.float, minval = 0, step = 0.5)

long_tp = crossover(high, (1+(tp/100))*last_open_longCondition) and not longCondition

// Get the time of the last tp close

var int last_long_tp = na

last_long_tp := long_tp ? time : nz(last_long_tp[1])

Final_Long_tp = long_tp and last_longCondition > nz(last_long_tp[1])

// Count your long conditions

var int sectionLongs = 0

sectionLongs := nz(sectionLongs[1])

var int sectionTPs = 0

sectionTPs := nz(sectionTPs[1])

// Longs Counter

if longCondition
    sectionLongs := sectionLongs + 1
    sectionTPs := 0

if Final_Long_tp
    sectionLongs := 0
    sectionTPs := sectionTPs + 1
    
// Signals
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

// Long

// label.new(
//    x = longCondition[1] ? time : na, 
//    y = na, 
//    text = 'LONG'+tostring(sectionLongs), 
//    color=color.lime, 
//    textcolor=color.black,  
//    style = label.style_labelup, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.belowbar,
//    size = size.tiny)
   
// Tp

// label.new(
//    x = Final_Long_tp ? time : na, 
//    y = na, 
//    text = 'PROFIT '+tostring(tp)+'%', 
//    color=color.orange, 
//    textcolor=color.black,  
//    style = label.style_labeldown, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.abovebar,
//    size = size.tiny) 

ltp = iff(Final_Long_tp, (last_open_longCondition*(1+(tp/100))), na), plot(ltp, style=plot.style_cross, linewidth=3, color = color.white, editable = false)

// Backtesting
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

testStartYear = input(2019, "BACKTEST START YEAR", minval = 1, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

strategy.entry("long", strategy.long, when = longCondition and (time >= testPeriodStart))
strategy.exit("TP", "long", limit = (last_open_longCondition*(1+(tp/100))))

// Alerts
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

alertcondition(longCondition[1], title="Long Alert", message = "LONG")
alertcondition(Final_Long_tp, title="Long TP Alert", message = "LONG TP")