Optimización de la ruptura de impulso

El autor:¿ Qué pasa?, Fecha: 2024-01-17 16:44:30
Las etiquetas:

img

Resumen general

La estrategia de optimización de ruptura de impulso es una estrategia de seguimiento de tendencias que genera señales comerciales y establece stop loss / take profit basadas en indicadores de impulso. Juzga la dirección de la tendencia del mercado calculando los cruces entre el precio y la media móvil, y construye un mecanismo de stop loss dinámico utilizando ATR y LinReg Channel. Mientras tanto, la estrategia también identifica los niveles de sobrecompra / sobreventa utilizando el indicador CMO para mejores precios de entrada.

Estrategia lógica

    1. Calcular la media móvil del precio ZLEMA como indicador técnico de la dirección de la tendencia
    1. Calcular la pérdida de parada larga y la pérdida de parada corta basándose en el ATR
    1. Calcular el indicador de OCM para identificar zonas de sobrecompra/sobreventa, combinado con la media móvil como señales de entrada
    1. Generar 3 conjuntos de señales de negociación basadas en ATR, promedio móvil y breakouts de precios
    • Los niveles de cruce entre la media móvil y los niveles de stop loss
    • Crossovers entre los niveles de precio y de stop loss
    • Crossovers entre precio y media móvil
    1. Habilitar/desactivar diferentes combinaciones de señales mediante la configuración de parámetros
    1. Establecer el porcentaje de riesgo y el tamaño de las posiciones para la gestión del riesgo

La estrategia general combina múltiples indicadores para el seguimiento de tendencias constantes y el stop loss automatizado, garantizando oportunidades comerciales adecuadas y controlando los riesgos comerciales.

Análisis de ventajas

Combinación de múltiples indicadores

La estrategia utiliza una combinación de indicadores que incluyen promedio móvil, ATR, OCM, etc. Los indicadores se complementan entre sí y proporcionan juicios más confiables sobre la dirección de la tendencia y las zonas de sobrecompra / sobreventa.

Detención dinámica de arrastramiento

El stop loss dinámico basado en el ATR puede ajustar de forma flexible los niveles de stop loss en función de la volatilidad del mercado, controlando efectivamente las pérdidas de operaciones individuales.

Gestión integral del riesgo

La estrategia incluye el tamaño de las posiciones y el porcentaje de riesgo, que define el porcentaje máximo de capital en riesgo para evitar fluctuaciones severas de los fondos.

Muchas señales comerciales

La estrategia ofrece 3 conjuntos de señales comerciales. Al habilitar diferentes combinaciones de señales, se pueden obtener mejores resultados de backtest.

Análisis de riesgos

Frecuencia alta de las operaciones

Puede haber una negociación demasiado frecuente cuando todas las combinaciones de señales están habilitadas.

Sensible a las configuraciones de parámetros

El modelo multiparámetro hace que la optimización de parámetros sea más compleja y sensible.

Se trata de una medida de la rentabilidad de los activos.

Para las señales puras de ruptura de precio/stop loss, el rango de stop loss es más amplio, lo que puede conducir a una mayor pérdida y caída de operaciones individuales.

Direcciones de optimización

Prueba de diferentes combinaciones de parámetros

Optimizar los parámetros como el tipo/largura promedio móvil, el período ATR, el período CMO para encontrar la coincidencia óptima.

Optimizar las estrategias de uso de señales

Pruebe el rendimiento utilizando solo señales de promedio móvil, señales de stop loss o señales de combinación para encontrar la mejor estrategia de uso.

Rendimiento de las pruebas en diferentes productos

Pruebe la estrategia a través de productos de índices, divisas y materias primas para analizar la adaptabilidad a través de diferentes tipos de mercado.

Conclusión

Esta estrategia integra múltiples indicadores para la identificación de tendencias, la construcción de stop loss, la detección de sobrecompra/sobreventa. Al ajustar los parámetros y las combinaciones de señales, se pueden lograr métricas de riesgo satisfactorias.


/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//developer: @KivancOzbilgic
//author: @KivancOzbilgic

strategy(title="Profit Maximizer PMax", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=0.025, slippage=2)


src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="ZLEMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
longStop = MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
PMax = dir==1 ? longStop: shortStop
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)

alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")


// Calculate position size
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Long
buySignalk = crossover(MAvg, PMax)
plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="BuyL", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)


if(buySignalk and showsignalsk and inDateRange)
    strategy.entry(id="buySignalk", long=true, qty=posSize)
    
sellSignallk = crossunder(MAvg, PMax)
plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="SellL", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

if(sellSignallk and showsignalsk and inDateRange)
    strategy.order(id="sellSignallk", long=false, qty=strategy.position_size)
    
//Short
buySignalc = crossover(src, PMax)
plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="BuyS", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(buySignalc and showsignalsc and inDateRange)
    strategy.entry(id="BuyS", long=false, qty=posSize)

sellSignallc = crossunder(src, PMax)
plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="SellS", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(sellSignallc and showsignalsc and inDateRange)
    strategy.order(id="SellS", long=true, qty=abs(strategy.position_size))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)

longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na

fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

// Exit open market position when date range ends
if (not inDateRange)
    strategy.close_all()
  

Más.