O recurso está a ser carregado... Carregamento...

A ruptura do impulso identifica a estratégia

Autora:ChaoZhang, Data: 2023-11-02 14:39:22
Tags:

img

Resumo

Esta estratégia identifica ações em rápido crescimento e toma posições longas quando o preço quebra novas altas.

Princípio

A estratégia baseia-se principalmente em dois indicadores:

  1. RSI rápido: calcula a subida e queda de 3 barras recentes para julgar o ímpeto do preço.

  2. Filtro corporal: calcula o tamanho corporal médio dos últimos 20 bares.

Quando o RSI rápido estiver abaixo de 10 e o filtro corporal estiver válido, uma posição longa será aberta. Depois disso, um lucro fixo de 20% é definido. Quando o preço exceder o preço aberto * (1 + porcentagem de lucro), a posição será fechada.

A vantagem desta estratégia é que pode capturar as oportunidades de ruptura no início das tendências. O RSI rápido julga os níveis de sobrevenda e o filtro corporal evita falhas de ruptura.

Análise das vantagens

As vantagens desta estratégia:

  1. O RSI rápido identifica os níveis de sobrevenda e aumenta a precisão de entrada.

  2. O filtro corporal evita falhas causadas por flutuações.

  3. Os lucros fixos porcentual realizam lucros estáveis e capta tendências.

  4. A lógica é simples e clara, fácil de compreender e implementar.

  5. Estrutura de código elegante com grande extensão, fácil de otimizar.

  6. Retorno positivo estável e alta taxa de vitória em backtest.

Análise de riscos

Alguns riscos a ter em conta:

  1. Não há mecanismo de stop loss, riscos de expansão das perdas.

  2. Os níveis inadequados de lucro podem levar a uma saída prematura ou muito profunda.

  3. Podem ocorrer pequenas perdas consecutivas em mercados agitados.

  4. Os custos de financiamento não são tidos em conta, podendo os rendimentos reais ser inferiores.

  5. Optimização de parâmetros insuficiente em diferentes produtos.

Orientações de otimização

Alguns aspectos podem ser otimizados:

  1. Adicionar stop loss para controlar a perda de uma única transação.

  2. Otimizar a dinâmica de lucro para seguir as tendências.

  3. Melhorar a lógica de fuga para melhorar a precisão de entrada.

  4. Adicionar módulo de dimensionamento de posição para otimizar o uso de capital.

  5. Adicionar módulo de otimização de parâmetros para diferentes produtos.

  6. Adicionar filtros para evitar perdas em mercados agitados.

  7. Considere adicionar a gestão de custos médios.

Conclusão

Em resumo, esta é uma estratégia elegante e simples de seguir tendências. Ele usa RSI rápido para identificar níveis de sobrevenda, filtro corporal para confirmar breakout válido e porcentagem fixa de lucro para gerar retornos constantes. Embora haja espaço para otimização, a estratégia é receptiva e adequada para mercados em rápida mudança, tornando-se uma estratégia de negociação muito prática.


/*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")


Mais.