Estratégia de negociação de linha de tendência de inclinação dinâmica

Autora:ChaoZhang, Data: 2024-02-06 11:51:14
Tags:

img

Resumo

A ideia central desta estratégia é usar a inclinação dinâmica para determinar a direção da tendência do preço e gerar sinais de negociação em combinação com o julgamento de ruptura. Especificamente, ele rastreia altas e baixas de preços em tempo real com base nas mudanças de preço em diferentes períodos de tempo para calcular a inclinação dinâmica e, em seguida, determina sinais longos e curtos de acordo com a ruptura do preço contra as linhas de tendência.

Princípio da estratégia

As principais etapas desta estratégia são:

  1. Julgar o preço mais alto e o mais baixo: acompanhar os preços mais altos e mais baixos durante um determinado ciclo (por exemplo, 20 bares) para determinar se uma nova alta ou baixa foi atingida.

  2. Calcular a inclinação dinâmica: Registre o número de barras quando se alcança um novo ponto alto ou baixo e calcule a inclinação dinâmica do novo ponto alto/baixo para o ponto alto/baixo após um determinado ciclo (por exemplo, 9 barras).

  3. Gravação de linhas de tendência: Gravação de linhas de tendência ascendentes e descendentes com base em inclinações dinâmicas.

  4. Estender e atualizar as linhas de tendência: quando o preço atravessa as linhas de tendência, estender e atualizar as linhas de tendência.

  5. Sinais de negociação: Determinação de sinais longos e curtos com base nas variações de preços em relação às linhas de tendência.

Vantagens da estratégia

As vantagens desta estratégia incluem:

  1. Determinar dinamicamente a direção da tendência para flexibilidade em resposta às alterações do mercado.

  2. Controlar de forma razoável as paradas e minimizar as reduções.

  3. Sinais comerciais claros e fáceis de implementar.

  4. Parâmetros personalizáveis para uma forte adaptabilidade.

  5. Estrutura de código limpa que seja fácil de entender e desenvolver.

Riscos e soluções

Há também alguns riscos com esta estratégia:

  1. Longs e shorts frequentes quando a tendência está limitada ao intervalo.

  2. Potencialmente mais sinais falsos em fuga, ajuste parâmetros ou adicione filtros.

  3. Riscos de stop loss quando o mercado se move violentamente.

  4. Espaço de otimização limitado e potencial de lucro, adequado para negociação a curto prazo.

Orientações de otimização

As áreas para a otimização da estratégia incluem:

  1. Adicionar mais indicadores técnicos como sinais de filtro.

  2. Otimizar as combinações de parâmetros para obter os melhores parâmetros.

  3. Tente melhorar as estratégias de stop loss para reduzir os riscos.

  4. Adicionar funcionalidade para ajustar automaticamente a faixa de preços de entrada.

  5. Tente combinar com outras estratégias para descobrir mais oportunidades.

Resumo

No geral, esta é uma estratégia de curto prazo eficiente baseada no uso de inclinação dinâmica para determinar tendências e breakouts de negociação.


/*backtest
start: 2024-01-06 00:00:00
end: 2024-01-19 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © pune3tghai

//Originally posted by matsu_bitmex

//tried adding alerts on plots and cleared the chart for a cleaner view.
//Publishing the script in hope of getting it improved by someone else.

//Added strategy code for easier calculations

//Needs work on TP and SL part.

//P.S - THE ORIGINAL CODE IS MUCH BETTER BUT I have tried to be more usable and understandable.

//@version=4
strategy("TrendLines with Alerts", overlay=true)     //study("TrendLines with Alerts", overlay=true)
//update

length1 = input(20)
check = input(9)
//length2 = input(200)


u=0.0
u := u[1]

l=0.0
l := l[1]

y=0.0
y := y[1]

yl=0.0
yl := yl[1]

angle = 0.0
angle := angle[1]

anglel = 0.0
anglel := anglel[1]

if (highest(length1) == high[check] and highest(length1) == highest(length1)[check] and barssince(barstate.isfirst) > check)
    u := high[check]

    
if (lowest(length1) == low[check] and lowest(length1) == lowest(length1)[check] and barssince(barstate.isfirst) > check)
    l := low[check]
    

    
p = round(barssince(u == high[check]))

pl = round(barssince(l == low[check]))

if p == 0 and barssince(barstate.isfirst) > check
    y := high[abs(p[1]+1+check)]
    
if pl == 0 and barssince(barstate.isfirst) > check
    yl := low[abs(pl[1]+1+check)]    
    

if p == 0
    angle := (u-y)/p[1]

if pl == 0
    anglel := (l-yl)/pl[1]

uppertrend = u+ (p * angle)

lowertrend = l+ (pl * anglel)

extendup = if barssince(barstate.isfirst) > check
    uppertrend[check] + angle[check] * check*2

extenddown = if barssince(barstate.isfirst) > check
    lowertrend[check] + anglel[check] * check*2




//plot(l[offset]-u,color=red)
//plot(u[offset]-l,color = green )
plot(lowertrend, color = color.green, transp=30,offset = -check)
plot(extenddown, color = color.green, transp=100)
plot(uppertrend, color = color.red, transp=30, offset = -check)
plot(extendup, color = color.red, transp=100)
//plot(l[offset], color = red)

l1 = lowertrend
l2 = extenddown
u1 = uppertrend
u2 = extendup



l2sell = crossunder(high, l2)
u2buy = crossover(low, u2)
buy1 = (low<=lowertrend) and open>lowertrend and high>lowertrend and close>lowertrend
buy2 = (low<=extenddown) and open>extenddown and high>extenddown and close>extenddown
buy = buy1 or buy2 or u2buy
plotshape(series=buy, title="Buy", style=shape.triangleup, size=size.tiny, color=color.lime, location=location.belowbar)
sell1 = (high>=uppertrend) and open<uppertrend and low<uppertrend and close<uppertrend
sell2 = (high>=extendup) and open<extendup and low<extendup and close<extendup
sell = sell1 or sell2 or l2sell
plotshape(series=sell, title="Sell", style=shape.triangledown, size=size.tiny, color=color.red, location=location.abovebar)

longCond = buy
shortCond = sell

tp = input(0.2, title="Take Profit")

tpbuyval = valuewhen(buy, close, 1) + (tp/100)*(valuewhen(buy, close, 1))
tpsellval = valuewhen(sell, close, 1) - (tp/100)*(valuewhen(sell, close, 1))


sl = input(0.2, title="Stop Loss")
slbuyval = valuewhen(buy, close, 0) - (sl/100)*(valuewhen(buy, close, 0))
slsellval = valuewhen(sell, close, 0) + (sl/100)*(valuewhen(sell, close, 0))
// === STRATEGY ===
tradeType = input("BOTH", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])

// stop loss
slPoints = input(defval=0, title="Initial Stop Loss Points (zero to disable)", minval=0)
tpPoints = input(defval=0, title="Initial Target Profit Points (zero for disable)", minval=0)

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//

testStartYear = input(2019, "Backtest Start Year", minval=1980)
testStartMonth = input(1, "Backtest Start Month", minval=1, maxval=12)
testStartDay = input(1, "Backtest Start Day", minval=1, maxval=31)
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, "Backtest Stop Year", minval=1980)
testStopMonth = input(12, "Backtest Stop Month", minval=1, maxval=12)
testStopDay = input(31, "Backtest Stop Day", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//

//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if testPeriod() and tradeType != "NONE"
    strategy.entry("long", strategy.long, when=longCond == true and tradeType != "SHORT")
    strategy.entry("short", strategy.short, when=shortCond == true and tradeType != "LONG")
    strategy.close("long", when=shortCond == true and tradeType == "LONG")
    strategy.close("short", when=longCond == true and tradeType == "SHORT")
    strategy.exit("XL", from_entry="long", profit=tpbuyval, loss=slbuyval)
    strategy.exit("XS", from_entry="short", profit=tpsellval, loss=slsellval)

// === /STRATEGY ===
//EOF


////ALERT SYNTEX
//alertcondition(longCond, title="Long", message="Killer Market")
//alertcondition(shortCond, title="Short", message="Poopy Market")

Mais.