Canal de precios dinámico con estrategia de seguimiento de pérdidas

El autor:¿ Qué pasa?, Fecha: 2024-02-01 10:52:33
Las etiquetas:

img

Resumen general

Esta estrategia se desarrolla sobre la base del indicador del canal de precios Donchian. El indicador forma un canal de precios calculando los precios más altos y más bajos durante un cierto período. La estrategia utiliza el canal de precios para implementar operaciones bidireccionales y establece precios de stop loss y take profit. El precio de stop loss se fija a la línea media del canal de precios, y el precio de take profit se establece a un cierto porcentaje más allá de los límites superior e inferior del canal de precios. La estrategia también implementa el seguimiento de stop loss y take profit.

Principio de la estrategia

Primero, la estrategia calcula el límite superior h y el límite inferior l del canal de precios basándose en el parámetro pclen. El centro de la línea media es el promedio de los límites superior e inferior del canal de precios. Luego, los precios de take profit tpl y tps se calculan de acuerdo con los parámetros de take profit tp para posiciones largas y cortas. El precio de stop loss se fija en el centro de la línea media del canal de precios. Cuando el precio atraviesa el canal de precios, las posiciones de negociación de diferentes direcciones se calculan de acuerdo con los tamaños de riesgo posiciones risklong y riskshort. La estrategia cerrará cuando el precio vuelva a entrar en el canal. Además, el filtrado de tiempo está configurado para operar solo dentro del rango de fecha especificado.

La lógica de negociación específica es:

Signales de entrada larga: abre larga cuando el precio es mayor que el límite superior del canal h y cae de nuevo en el canal

Signales de salida larga: cierre largo cuando el precio es inferior al centro de la línea media del canal (stop loss) o superior al precio de toma de ganancias (take profit)

Signales de entrada corta: abre corto cuando el precio es inferior al límite inferior del canal l y cae de nuevo en el canal

Señales de salida corta: cierre corto cuando el precio es superior al centro de la línea media del canal (stop loss) o inferior al precio de toma de ganancias (take profit)

Análisis de ventajas

Las ventajas de esta estrategia son:

  1. El comercio bidireccional puede capturar las reversiones de las tendencias de los precios
  2. Utilizar el canal de precios para determinar la dirección de la tendencia y evitar fallas
  3. Establecer un stop loss y obtener beneficios para controlar los riesgos
  4. Calcular el tamaño de la posición asociado al tamaño del riesgo para lograr riesgos controlables
  5. Implementar el seguimiento de stop loss y tomar ganancias para obtener más ganancias

Análisis de riesgos

Esta estrategia también presenta algunos riesgos:

  1. La configuración incorrecta de los parámetros del canal de precios puede dar lugar a una frecuencia de negociación demasiado alta o a oportunidades de negociación perdidas
  2. Precio de stop loss demasiado amplio puede aumentar la exposición al riesgo
  3. El seguimiento de las ganancias puede desencadenarse prematuramente en períodos de alta volatilidad

Estos riesgos pueden reducirse y controlarse mediante el ajuste de los parámetros y el seguimiento manual.

Direcciones de optimización

Esta estrategia también puede optimizarse en los siguientes aspectos:

  1. Añadir más filtros de indicadores para evitar la apertura y el cierre frecuentes en los mercados de rango
  2. Se pueden probar diferentes algoritmos de stop loss y take profit, tales como ATR stop loss
  3. Extensión a un sistema de negociación de intervalo de tiempo que utilice un intervalo de tiempo más largo para determinar la dirección de la tendencia
  4. Añadir módulo de dimensionamiento de posiciones para ajustar posiciones basadas en el índice de utilización de capital
  5. Incorporar modelos de aprendizaje automático para juzgar la tasa de éxito de las roturas de precios para evitar roturas falsas

Conclusión

En conclusión, esta es una estrategia efectiva para implementar el comercio bidireccional utilizando indicadores de canal de precios. Con los módulos de control de stop loss, take profit y tamaño de posición adecuados, los riesgos se pueden controlar bien. Con algunas optimizaciones y ajustes, puede convertirse en una poderosa estrategia de comercio cuantitativa.


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

//Noro
//2020

//@version=4
strategy(title = "Noro's RiskDonchian Strategy", shorttitle = "RiskDonchian str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
tp = input(defval = 20.0, minval = 1, title = "Take-profit, %")
tptype = input(defval = "2. Fix", options = ["1. None", "2. Fix", "3. Trailing"], title = "Take-profit type")
sltype = input(defval = "2. Center", options = ["1. None", "2. Center"], title = "Take-profit type")
risklong  = input(5.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(5.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
pclen = input(50, minval = 1, title = "Price Channel Length")
showll = input(true, defval = true, title = "Show lines")
showbg = input(false, defval = false, title = "Show Background")
showof = input(true, defval = true, title = "Show Offset")
showlabel = input(true, defval = true, title = "Show label")
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")

//Price Channel
h = highest(high, pclen)
l = lowest(low, pclen)
center = (h + l) / 2

//Take-profit
tpl = 0.0
tpl := tptype == "2. Fix" and strategy.position_size > 0 ? tpl[1] : h * (100 + tp) / 100

//Stop-loss
tps = 0.0
tps := tptype == "2. Fix" and strategy.position_size < 0 ? tps[1] : l * (100 - tp) / 100

//Lines
tplcol = showll and needlong and tptype != "1. None" ? color.lime : na
pclcol = showll and needlong ? color.blue : na
sllcol = showll and needlong and sltype != "1. None" ? color.red : na
tpscol = showll and needshort and tptype != "1. None" ? color.lime : na
pcscol = showll and needshort ? color.blue : na
slscol = showll and needshort and sltype != "1. None" ? color.red : na
offset = showof ? 1 : 0
plot(tpl, offset = offset, color = tplcol, title = "TP Long")
plot(h, offset = offset, color = pclcol, title = "Channel High")
plot(center, offset = offset, color = sllcol, title = "SL Long")
plot(center, offset = offset, color = slscol, title = "SL Short")
plot(l, offset = offset, color = pcscol, title = "Channel Low")
plot(tps, offset = offset, color = tpscol, title = "TP Short")

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(bgcol, transp = 70)

//Lot size
risksizelong = -1 * risklong
risklonga = ((center / h) - 1) * 100
coeflong = abs(risksizelong / risklonga)
lotlong = (strategy.equity / close) * coeflong
risksizeshort = -1 * riskshort
riskshorta = ((center / l) - 1) * 100
coefshort = abs(risksizeshort / riskshorta)
lotshort = (strategy.equity / close) * coefshort

//Trading
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)
mo = 0
mo := strategy.position_size != 0 ? 0 : high >= center[1] and low <= center[1] ? 1 : mo[1]

if h > 0
    longlimit = tptype == "1. None" ? na : tpl
    longstop = sltype == "1. None" ? na : center
    strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime and mo)
    strategy.exit("TP Long", "Long", limit = longlimit, stop = longstop)
    shortlimit = tptype == "1. None" ? na : tps
    shortstop = sltype == "1. None" ? na : center
    strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime and mo)
    strategy.exit("Exit Short", "Short", limit = shortlimit, stop = shortstop)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showlabel

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Label
    min := round(min * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)

Más.