Estrategia de seguimiento de tendencias bidireccional basada en la ruptura del rango

El autor:¿ Qué pasa?, Fecha: 2024-02-01 14:22:26
Las etiquetas:

img

Resumen general

Esta estrategia calcula el último precio más alto (lastbull) y el último precio más bajo (lastbear). Luego compara el precio actual con lastbull y lastbear para determinar si el precio ha entrado en un cierto rango y, por lo tanto, genera señales comerciales.

Estrategia lógica

La estrategia calcula primero el último precio más alto lastbull y el último precio más bajo lastbear, luego calcula el porcentaje de cambio ddl del precio actual cerrado en relación con lastbull y el porcentaje de cambio dds en relación con lastbear.

Cuando ddl es inferior al límite de señal larga configurado, se genera una señal larga. Cuando dds es superior al límite de señal corta configurado, se genera una señal corta dn.

Al recibir la señal larga, abre una posición larga si el parámetro needlong es verdadero. Al recibir la señal corta, abre una posición corta si el parámetro needshort es verdadero.

Cierra una posición larga cuando el precio aumenta después de abrir una posición larga, y cierra una posición corta cuando el precio cae después de abrir una posición corta.

Análisis de ventajas

Esta estrategia combina el análisis de tendencia y rango. Puede capturar tendencias y generar señales comerciales de rupturas de rango. En comparación con las estrategias simples de seguimiento de tendencias, puede capturar rápidamente una nueva dirección de tendencia después de la ruptura de rango.

Los parámetros son altamente configurables para diferentes productos.

Análisis de riesgos

No hay un mecanismo de stop loss en esta estrategia para limitar la pérdida por operación.

El algoritmo de dimensionamiento de posición se puede personalizar en función de los productos para estabilizar el tamaño de la posición.

Direcciones de optimización

  1. Se añadirá el stop loss móvil al control por riesgo de pérdida por operación.
  2. Mejorar el algoritmo de dimensionamiento de la posición, por ejemplo, utilizar ATR, para estabilizar el tamaño de la posición
  3. Añadir filtrado para señales de entrada, por ejemplo, sólo ingresar cuando ocurre cruz dorada
  4. Comercio de múltiples productos con correlación con un menor riesgo sistémico

Resumen de las actividades

Esta estrategia combina el análisis de tendencias y la ruptura de rango para generar señales comerciales, que pueden capturar nuevas tendencias y aprovechar las características de rango.


/*backtest
start: 2023-01-25 00:00:00
end: 2024-01-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Noro's DDL Strategy", shorttitle = "DDL str", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
needlong = input(true, title = "Long")
needshort = input(true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
signalshort = input(3.0, title = "Short, %")
signallong = input(-3.0, title = "Long, %")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Levels
bull = close > close[1] ? 1 : 0
bear = close < close[1] ? 1 : 0
lastbull = 0.0
lastbull := bull ? close : lastbull[1]
lastbear = 0.0
lastbear := bear ? close : lastbear[1]

//Signals
ddl = ((close / lastbull) - 1) * 100
up = ddl < signallong
dds = ((close / lastbear) - 1) * 100
dn = dds > signalshort

//Lines
plot(dds, style = plot.style_area, color = color.red, transp = 0)
plot(ddl, style = plot.style_area, color = color.lime, transp = 0)
plot(0, color = color.black, linewidth = 2, transp = 0)

//Background
col = (up and needlong) or (dn and needshort) ? color.yellow : na
bgcolor(col, transp = 20)

//Orders
lot = 0.0
lot := strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]
truetime = true
if up
    strategy.entry("Long", strategy.long, lot, when = needlong and truetime)
if dn
    strategy.entry("Short", strategy.short, lot, when = needshort and truetime)
if strategy.position_size > 0 and close > open
    strategy.entry("Close", strategy.short, 0)
if strategy.position_size < 0 and close < open
    strategy.entry("Close", strategy.long, 0)

Más.