Estrategia de trading bidireccional con media móvil multiplicativa


Fecha de creación: 2024-01-15 14:50:32 Última modificación: 2024-01-15 14:50:32
Copiar: 1 Número de Visitas: 607
1
Seguir
1617
Seguidores

Estrategia de trading bidireccional con media móvil multiplicativa

Descripción general

La estrategia determina la dirección de la tendencia mediante el cálculo de la multiplicación de las medias móviles, en combinación con el cruce de los indicadores de precios y PMax, y utiliza un método de negociación bidireccional en el largo plazo, haciendo más cuando la tendencia es alta y haciendo menos cuando la tendencia es baja, evaluando el riesgo de la posición en tiempo real para obtener una salida con ganancias.

Principio de estrategia

El indicador central de la estrategia es el promedio móvil multiplicado. Los parámetros del indicador incluyen: la longitud del ciclo ATR, el multiplicador de ATR, el tipo y la duración del promedio móvil. El valor de ATR representa la amplitud de fluctuación durante el período.

El indicador PMax representa el precio de parada o parada. El indicador se calcula combinando el valor de ATR y la dirección de la tendencia. En un mercado bajista, el PMax es igual a la media móvil multiplicada por el ATR menos el multiplicador de ATR y el multiplicador, como línea de parada.

Cuando el precio se cruza con el indicador de PMax hacia arriba, se hace una señal de más; cuando el precio se cruza con el indicador de PMax hacia abajo, se hace una señal de corto. La estrategia se utiliza para entrar en juego, hacer más en la tendencia hacia arriba, hacer un espacio en la tendencia hacia abajo, y rastrear dinámicamente el stop loss.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. El sistema de intercambio binario de largo plazo permite el intercambio en todo el mercado y es muy inclusivo.

  2. La aplicación de la multiplicación de los indicadores de medias móviles, la señal de negociación es estable y confiable.

  3. La combinación de los indicadores de PMax para el control de los riesgos de manera efectiva.

  4. El ciclo de cálculo y los parámetros de multiplicación son ajustables y de gran adaptabilidad.

Análisis de riesgos

La estrategia también tiene ciertos riesgos:

  1. La configuración incorrecta de los parámetros puede causar pérdidas en las transacciones de whipsaw.

  2. Las operaciones en blanco deben tener en cuenta el riesgo de limitación de la palanca.

  3. El riesgo de que un evento inesperado provoque una fuerte fluctuación en el mercado es inevitable.

Resolución de las mismas:

  1. Optimización de parámetros para reducir la probabilidad de que se produzca la whipsaw.

  2. Controlar adecuadamente el límite de apalancamiento y dispersar el riesgo de la posición.

  3. Aumentar el multiplicador ATR y ampliar el rango de pérdidas.

Dirección de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Prueba la estabilidad de los diferentes parámetros del mercado y del ciclo.

  2. Aplicación de algoritmos de aprendizaje automático para optimizar los parámetros.

  3. La estructura del mercado es juzgada por técnicas como el aprendizaje profundo.

  4. Integrar más fuentes de datos para mejorar la eficacia de las decisiones.

Resumir

La estrategia en general es robusta y tiene una gran inclusión. La adopción de operaciones bidireccionales a largo plazo y el stop loss dinámico permite controlar el riesgo de manera efectiva. Se espera obtener una mejor adecuación y eficacia comercial a través de la optimización de parámetros y la repetición de modelos. En general, la estrategia merece atención y aplicación a largo plazo.

Código Fuente de la Estrategia
/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

strategy("Profit Maximizer Strategy Long-Short", shorttitle="PMax-Strategy", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0, commission_type=strategy.commission.percent)

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="EMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
condition = input(title="Signal Type", defval="Only Crossing Signals", options=["Only Crossing Signals", "Only Price/Pmax Crossing Signals"])
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)
long_short = input(defval = false, title = "Long-Short", type=input.bool)
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!")
buySignalk = crossover(MAvg, PMax)
//plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
sellSignallk = crossunder(MAvg, PMax)
//plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
buySignalc = crossover(src, PMax)
//plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
sellSignallc = crossunder(src, PMax)
//plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
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)

if(condition=="Only Crossing Signals")
    strategy.entry("BUY", strategy.long, when = buySignalk)
else
    strategy.entry("BUY", strategy.long, when = buySignalc)

if(long_short)
    if(condition=="Only Crossing Signals")
        strategy.entry("SELL", strategy.short, when = sellSignallk)
    else
        strategy.entry("SELL", strategy.short, when = sellSignallc)
else
    if(condition=="Only Crossing Signals")
        strategy.close("BUY", when = sellSignallk)
    else
        strategy.close("BUY", when = sellSignallc)