Estrategia de negociación de la línea de tendencia de pendiente dinámica

El autor:¿ Qué pasa?, Fecha: 2024-02-06 11:51:14
Las etiquetas:

img

Resumen general

La idea central de esta estrategia es utilizar la pendiente dinámica para determinar la dirección de la tendencia del precio y generar señales comerciales en combinación con el juicio de ruptura.

Principio de la estrategia

Las principales etapas de esta estrategia son:

  1. Juzgar el precio más alto y el más bajo: realizar un seguimiento de los precios más altos y más bajos durante un determinado ciclo (por ejemplo, 20 bares) para determinar si se ha alcanzado un nuevo máximo o mínimo.

  2. Calcular la pendiente dinámica: registrar el número de barras cuando se alcanza un nuevo máximo o mínimo, y calcular la pendiente dinámica desde el nuevo punto alto/bajo hasta el punto alto/bajo después de un cierto ciclo (por ejemplo, 9 barras).

  3. Líneas de tendencia gráficas: Líneas de tendencia gráficas ascendentes y descendentes basadas en pendientes dinámicas.

  4. Extender y actualizar las líneas de tendencia: Cuando el precio rompe las líneas de tendencia, extender y actualizar las líneas de tendencia.

  5. Las señales comerciales: Determinar señales largas y cortas basadas en las rupturas de precios frente a las líneas de tendencia.

Ventajas de la estrategia

Las ventajas de esta estrategia incluyen:

  1. Determinar dinámicamente la dirección de la tendencia de flexibilidad en respuesta a los cambios del mercado.

  2. Controlar razonablemente las paradas y minimizar las reducciones.

  3. Señales comerciales claras y fáciles de implementar.

  4. Parámetros personalizables para una gran adaptabilidad.

  5. Estructura de código limpia que sea fácil de entender y desarrollar más.

Riesgos y soluciones

También hay algunos riesgos con esta estrategia:

  1. Las tendencias de tendencias de tendencias de tendencias de tendencias de tendencias de tendencias de tendencias.

  2. Potencialmente más señales falsas en las fugas, ajustar parámetros o añadir filtros.

  3. Ampliar el rango de stop loss.

  4. Espacio de optimización limitado y potencial de ganancias, adecuado para operaciones a corto plazo.

Direcciones de optimización

Las áreas para optimizar la estrategia incluyen:

  1. Añadir más indicadores técnicos como señales de filtro.

  2. Optimizar las combinaciones de parámetros para obtener los mejores parámetros.

  3. Trate de mejorar las estrategias de stop loss para reducir los riesgos.

  4. Añadir funcionalidad para ajustar automáticamente el rango de precios de entrada.

  5. Trate de combinar con otras estrategias para descubrir más oportunidades.

Resumen de las actividades

En general, esta es una estrategia eficiente a corto plazo basada en el uso de pendiente dinámica para determinar tendencias y breakouts comerciales. Tiene juicios precisos, riesgos controlables y es adecuado para capturar oportunidades a corto plazo en el mercado.


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

Más.