Estrategia de la media móvil lenta

El autor:¿ Qué pasa?, Fecha: 2023-12-07 15:21:45
Las etiquetas:

img

Resumen general

Esta estrategia utiliza un canal de Donchian de 24 períodos combinado con un promedio móvil de 200 períodos como las principales señales de negociación.

Estrategia lógica

La lógica de la estrategia se basa principalmente en los siguientes puntos:

  1. Un canal de Donchian se construye utilizando el máximo más alto y el mínimo más bajo en los últimos 24 períodos.

  2. Si el precio rompe el canal de Donchian y está al otro lado del promedio móvil, una reversión puede ser probable.

  3. Las señales de entrada son:

  • Corto: el cierre de la barra anterior está por encima de la banda superior del Canal de Donchian y por debajo del MA de 200 períodos.
  • Largo: el cierre de la barra anterior está por debajo de la banda inferior del Canal de Donchian y por encima del MA de 200 períodos.
  1. El stop loss para posiciones cortas se establece en el máximo máximo durante las últimas 3 barras. El take profit se establece en el precio de entrada menos 3 veces la diferencia entre el stop loss y el precio de entrada. La lógica de stop loss y take profit de la posición larga es la opuesta.

  2. La ventaja de esta estrategia es que, al combinar el canal de Donchian y el filtro de media móvil, evita que las señales falsas se basen en un único indicador, mejorando significativamente la tasa de ganancia.

Análisis de ventajas

La estrategia tiene las siguientes ventajas:

  1. Alta tasa de ganancia: al combinar el canal de Donchian y el filtro de media móvil, se evitan pérdidas innecesarias debido a señales falsas de un solo indicador.

  2. Riesgo controlable: el uso de los niveles de alto y bajo más altos recientes como niveles de stop loss maneja efectivamente la desventaja en las operaciones perdedoras.

  3. Simple y fácil de implementar: La lógica utiliza indicadores simples e intuitivos que son fáciles de entender y ejecutar.

  4. Robustez a través de mercados y plazos: con relativamente pocos parámetros, la estrategia es estable a través de diferentes productos y plazos.

Análisis de riesgos

Los principales riesgos a los que se enfrenta esta estrategia son:

  1. Movimientos extremos del mercado: las tendencias unidireccionales muy fuertes pueden desencadenar pérdidas de parada causando pérdidas amplificadas.

  2. Riesgo de señales de salida prematura: salir de nuevas señales opuestas puede causar sobre-negociación en mercados agitados debido a la entrada y salida repetidas.

  3. Riesgo de optimización de parámetros: el mal ajuste de parámetros del período de retroceso del canal de Donchian o la media móvil puede conducir a señales retrasadas o frecuentes.

Oportunidades de mejora

La estrategia puede mejorarse de las siguientes maneras:

  1. Optimizar el canal de Donchian y los períodos de revisión de promedio móvil para encontrar la mejor combinación de parámetros.

  2. Prueba diferentes pérdidas de parada para tomar ratios de ganancia para equilibrar la tasa de ganancia frente a la recompensa / riesgo.

  3. Incorporar filtros adicionales en las señales de entrada utilizando indicadores como MACD, RSI, etc. para mejorar la robustez.

  4. Optimice la lógica de salida para evitar salidas innecesarias en mercados agitados.

  5. Desarrollar nuevas combinaciones utilizando este marco estratégico, por ejemplo con otros canales, indicadores de banda, etc.

Conclusión

La estrategia de promedio móvil lento tiene una lógica clara y fácil de entender utilizando una combinación de canal de Donchian y promedio móvil para la generación de señales. Este enfoque híbrido mejora significativamente la estabilidad y la tasa de ganancia.


/*backtest
start: 2023-11-06 00:00:00
end: 2023-12-06 00:00:00
period: 1h
basePeriod: 15m
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/
// © Mysteriown

//@version=4

strategy("Lagged Donchian Channel + EMA", overlay = true)

//tradePeriod = time(timeframe.period,"0000-0000:1234567")?true:false


// ------------------------------------------ //
// ----------------- Inputs ----------------- //
// ------------------------------------------ //

period = input(24, title="Channel's periods")
Pema = input(200, title="EMA's periods ?")
ratio = input(3, title="Ratio TP", type=input.float)
loss = input(20, title="Risk Loss ($)")
lev = input(5, title="Leverage *...")
chan = input(title="Plot channel ?", type=input.bool, defval=false)
Bpos = input(title="Plot Bull positions ?", type=input.bool, defval=false)
bpos = input(title="Plot Bear positions ?", type=input.bool, defval=false)
labels = input(title="Plot labels of bets ?", type=input.bool, defval=true)
supp = input(title="Delete last labels ?", type=input.bool, defval=true)


// ------------------------------------------ //
// ---------- Canal, EMA and arrow ---------- //
// ------------------------------------------ //

pema = ema(close,Pema)
plot(pema, title="EMA", color=color.blue)

canalhaut = highest(period)[1]
canalbas = lowest(period)[1]

bear = close[1] > canalhaut[1] and close < open and high > pema
bull = close[1] < canalbas[1] and open < close and low < pema

canalhautplot = plot(chan? canalhaut:na, color=color.yellow)
canalbasplot = plot(chan? canalbas:na, color=color.yellow)

plotshape(bear, title='Bear', style=shape.triangledown, location=location.abovebar, color=color.red, offset=0)
plotshape(bull, title='Bull', style=shape.triangleup, location=location.belowbar, color=color.green, offset=0)


// ------------------------------------------ //
// ------------- Position Short ------------- //
// ------------------------------------------ //

SlShort = highest(3)
BidShort = close[1]

TpShort = BidShort-((SlShort-BidShort)*ratio)
deltaShort = (SlShort-BidShort)/BidShort
betShort = round(loss/(lev*deltaShort)*100)/100
cryptShort = round(betShort*lev/BidShort*1000)/1000

// if bear[1] and labels //and low < low[1]
//     Lbear = label.new(bar_index, na, text="SHORT\n\nSL: " + tostring(SlShort) + "\n\nBid: " + tostring(BidShort) + "\n\nTP: " + tostring(TpShort) + "\n\nMise: " + tostring(betShort) + "\n\nCryptos: " + tostring(cryptShort), color=color.red, textcolor=color.white, style=label.style_labeldown, yloc=yloc.abovebar)
//     label.delete(supp ? Lbear[1] : na)

var bentry=0.0
var bsl=0.0
var btp=0.0

if bear[1] and low < low[1]
    bentry:=BidShort
    bsl:=SlShort
    btp:=TpShort
    
pbentry = plot(bpos? bentry:na, color=color.orange)
plot(bpos? (bentry+btp)/2:na, color=color.gray)
pbsl = plot(bpos? bsl:na, color=color.red)
pbtp = plot(bpos? btp:na, color=color.green)

fill(pbentry,pbsl, color.red, transp=70)
fill(pbentry,pbtp, color.green, transp=70)


// ------------------------------------------ //
// ------------- Position Long -------------- //
// ------------------------------------------ //

SlLong = lowest(3)
BidLong = close[1]

TpLong = BidLong + ((BidLong - SlLong) * ratio)
deltaBull = (BidLong - SlLong)/BidLong
betLong = round(loss/(lev*deltaBull)*100)/100
cryptLong = round(betLong*lev/BidLong*1000)/1000

// if bull[1] and labels //and high > high[1]
//     Lbull = label.new(bar_index, na, text="LONG\n\nSL: " + tostring(SlLong) + "\n\nBid: " + tostring(BidLong) + "\n\nTP: " + tostring(TpLong) + "\n\nMise: " + tostring(betLong) + "\n\nCryptos: " + tostring(cryptLong), color=color.green, textcolor=color.white, style=label.style_labelup, yloc=yloc.belowbar)
//     label.delete(supp ? Lbull[1] : na)

var Bentry=0.0
var Bsl=0.0
var Btp=0.0

if bull[1] and high > high[1]
    Bentry:=BidLong
    Bsl:=SlLong
    Btp:=TpLong
    
pBentry = plot(Bpos?Bentry:na, color=color.orange)
plot(Bpos?(Bentry+Btp)/2:na, color=color.gray)
pBsl = plot(Bpos?Bsl:na, color=color.red)
pBtp = plot(Bpos?Btp:na, color=color.green)

fill(pBentry,pBsl, color.red, transp=70)
fill(pBentry,pBtp, color.green, transp=70)


// ------------------------------------------ //
// --------------- Strategie ---------------- //
// ------------------------------------------ //

Bear = bear[1] and low < low[1]
Bull = bull[1] and high > high[1]

if (Bear and strategy.opentrades==0)
    strategy.order("short", false, 1, limit=BidShort)
    strategy.exit("exit", "short", limit = TpShort, stop = SlShort)

strategy.cancel("short", when = high > SlShort or low < (BidShort+TpShort)/2)
strategy.close("short", when=bull)

if (Bull and strategy.opentrades==0)
    strategy.order("long", true, 1, limit=BidLong)
    strategy.exit("exit", "long", limit = TpLong, stop = SlLong)
    
strategy.cancel("long", when = low < SlLong or high > (BidLong+TpLong)/2)
strategy.close("long", when=bear)


Más.