Estrategia cuantitativa de trailing stop loss basada en la distancia


Fecha de creación: 2023-11-15 11:24:16 Última modificación: 2023-11-15 11:24:16
Copiar: 0 Número de Visitas: 682
1
Seguir
1617
Seguidores

Estrategia cuantitativa de trailing stop loss basada en la distancia

Descripción general

La estrategia se basa en la idea de los paros móviles, utilizando el indicador de Distancia Close Bars (DCB) para determinar el movimiento de los precios, en combinación con el indicador RSI rápido para filtrar, para lograr paros móviles y paros de seguimiento. La estrategia también utiliza el principio de aumento de posición de Martingale, adecuado para el comercio de tendencias de línea media-larga.

El principio

  1. Calcular lastg y lastr representando el precio de cierre de la última línea K de alza y el precio de cierre de la última línea K de baja, respectivamente.

  2. Calcule dist como la diferencia de precio entre lastg y lastr.

  3. Calcule el promedio móvil simple de 30 períodos de adist como dist.

  4. Genera una señal de transacción cuando dist es el doble de grande que adist.

  5. La combinación de un RSI rápido con una señal de filtración para evitar falsas rupturas.

  6. Si hay una señal y no tiene posiciones, abra posiciones a un porcentaje fijo.

  7. Utilizando el principio de Martingale, el riesgo se incrementa después de la pérdida.

  8. El precio dispara la posición de parada o de liquidación después de la parada.

Las ventajas

  1. Utilizando el indicador DCB para determinar la dirección de la tendencia, se puede capturar eficazmente la tendencia de la línea media y larga.

  2. La filtración rápida del RSI puede evitar pérdidas por brechas falsas.

  3. El mecanismo móvil de detención de pérdidas bloquea los beneficios y controla el riesgo de manera efectiva.

  4. El principio de Martingale permite aumentar la posición después de una pérdida para obtener mayores ganancias.

  5. La configuración de los parámetros de la estrategia es razonable y se adapta a diferentes entornos de mercado.

El riesgo

  1. El indicador DCB puede emitir una señal errónea y necesita ser filtrado en combinación con otros indicadores.

  2. El aumento de las pérdidas de Martingale requiere una gestión estricta de los fondos.

  3. La configuración de los puntos de parada no razonables puede causar más pérdidas de las esperadas.

  4. El número de posiciones debe ser controlado estrictamente para evitar el exceso de capacidad de financiación.

  5. La configuración incorrecta de los contratos de negociación puede causar grandes pérdidas en situaciones extremas.

Optimización de las ideas

  1. Optimización de los parámetros DCB para encontrar la combinación óptima de parámetros.

  2. Trate de filtrar el RSI rápido por otros indicadores.

  3. Optimización de parámetros de stop loss para mejorar la tasa de éxito de las estrategias.

  4. Optimización de los parámetros de Martingale para reducir el riesgo de hipoteca.

  5. Prueba las diferentes variedades de comercio para elegir el mejor tipo de arbitraje.

  6. Parámetros estratégicos para la optimización dinámica de la tecnología en combinación con el aprendizaje automático.

Resumir

La estrategia Overall es una estrategia de seguimiento de tendencias más madura. La adopción de DCB determina la dirección de la tendencia, las señales de filtración RSI rápidas evitan la apertura errónea de posiciones. Al mismo tiempo, el mecanismo de parada de pérdidas puede controlar eficazmente las pérdidas individuales.

Código Fuente de la Estrategia
/*backtest
start: 2023-11-07 00:00:00
end: 2023-11-14 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Distance Strategy v1.0", shorttitle = "Distance str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(true, defval = true, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usersi = input(true, defval = true, title = "Use RSI-Filter")
periodrsi = input(7, defval = 7, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(30, defval = 30, minval = 1, maxval = 50, title = "RSI Limit")
fromyear = input(2018, defval = 2018, 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")

//Fast RSI
fastup = rma(max(change(close), 0), periodrsi)
fastdown = rma(-min(change(close), 0), periodrsi)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Distance
bar = close > open ? 1 : close < open ? -1 : 0
lastg = bar == 1 ? close : lastg[1]
lastr = bar == -1 ? close : lastr[1]
dist = lastg - lastr
adist = sma(dist, 30)
plot(lastg, linewidth = 3, color = lime)
plot(lastr, linewidth = 3, color = red)
up = bar == -1 and dist > adist * 2
dn = bar == 1 and dist > adist * 2

//RSI Filter
rsidn = fastrsi < limitrsi or usersi == false
rsiup = fastrsi > 100 - limitrsi or usersi == false

//Signals
up1 = up and rsidn
dn1 = dn and rsiup
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open))

//Arrows
plotarrow(up1 ? 1 : na, colorup = blue, colordown = blue)
plotarrow(dn1 ? -1 : na, colorup = blue, colordown = blue)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

signalup = up1
if signalup
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

signaldn = dn1
if signaldn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()