Estrategia optimizada de seguimiento de tendencias para rupturas de impulso


Fecha de creación: 2024-01-17 16:44:30 Última modificación: 2024-01-17 16:44:30
Copiar: 0 Número de Visitas: 622
1
Seguir
1617
Seguidores

Estrategia optimizada de seguimiento de tendencias para rupturas de impulso

Descripción general

La estrategia de optimización de la ruptura dinámica es una estrategia de seguimiento de tendencias basada en la generación de señales de negociación y la configuración de paradas de pérdidas basadas en indicadores dinámicos. La estrategia determina la dirección de la tendencia del mercado mediante el cálculo de la intersección del precio con la línea media móvil, en combinación con el ATR y el canal LinReg para construir un mecanismo de parada dinámica.

Principio de estrategia

  • 1. ZLEMA Moving Averages para calcular el precio como indicador técnico para determinar la dirección de la tendencia
  • 2. Calculación de los precios de parada larga y corta según el ATR
  • 3. Calcula el indicador CMO para determinar el intervalo de sobreventa y sobreventa, junto con la media móvil como señal de entrada
  • 4. Construir tres grupos de señales de negociación basadas en el ATR y la media móvil
    • La señal cruzada de la línea media móvil y el precio de parada
    • La señal cruzada entre el precio y el precio de parada
    • Las señales cruzadas de precios y medias móviles
  • 5. Control de la activación de diferentes tipos de señales mediante la configuración de parámetros
  • 6. Configurar los factores de riesgo y los controles de posición para la gestión de riesgos

La estrategia completa permite un seguimiento de tendencias estable y un alto automático de pérdidas a través de la aplicación de una combinación de varios indicadores, lo que garantiza suficientes oportunidades de negociación y controla el riesgo de negociación.

Análisis de las ventajas

Utilización de una combinación de indicadores

La estrategia utiliza una combinación de varios indicadores, como promedios móviles, ATR, CMO, entre otros, que se complementan de manera efectiva, identificando la dirección de la tendencia y el juicio de las zonas de sobreventa y sobreventa con mayor precisión.

Dinámica trailing stop

El mecanismo de stop loss dinámico basado en ATR permite ajustar las posiciones de stop loss de manera flexible en función de la volatilidad del mercado, lo que permite controlar eficazmente las pérdidas individuales.

Una buena gestión de riesgos

La estrategia ofrece un control de posición y una configuración de factor de riesgo que permite predefinir la proporción máxima de pérdidas para evitar grandes fluctuaciones de fondos.

Las señales de intercambio son abundantes

La estrategia ofrece un total de tres conjuntos de señales de negociación, que pueden obtener mejores resultados de retroalimentación al elegir activar una combinación de diferentes tipos de señales.

Análisis de riesgos

La frecuencia de las transacciones es demasiado alta.

Cuando se habilita toda la combinación de señales, es posible que se produzca una frecuencia de negociación excesiva. Se puede evitar mediante la selección de solo una parte de la combinación de señales.

Parámetros del indicador son sensibles

El uso de múltiples combinaciones de indicadores hace que la selección de parámetros sea más compleja y más sensible a la configuración de parámetros, lo que requiere una combinación óptima de parámetros cuidadosamente probados.

El retorno de la señal de ruptura es grande.

Las señales de negociación basadas únicamente en el cruce de precios y precios de parada tienen un gran alcance de paros, lo que puede conducir a grandes pérdidas y retrocesos individuales. Se puede elegir el uso de señales de línea media móviles con su combinación.

Dirección de optimización

Prueba diferentes combinaciones de parámetros

Optimización de los parámetros de tipo y longitud de las medias móviles; optimización de los parámetros de ciclo de ATR; optimización de los parámetros de CMO. Encontrar la mejor combinación de parámetros.

Estrategias para optimizar el uso de señales

Las pruebas se realizan utilizando solo la señal de media móvil, la señal de precio de parada y la señal combinada para analizar la mejor estrategia de uso.

Pruebas de rendimiento en diferentes variedades

Realizar retroalimentación en índices de acciones, divisas y variedades de productos, para analizar la adecuación de la estrategia al tipo de mercado.

Resumir

La estrategia utiliza una combinación de varios indicadores para identificar la dirección de la tendencia, construir mecanismos de stop loss y detectar oportunidades de sobreventa y sobreventa. Se puede obtener un mejor indicador de reversión mediante la optimización de parámetros y la selección de combinaciones de señales. En general, el sistema de estrategia es completo y de alta fiabilidad.

Código Fuente de la Estrategia
/*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()