Estrategia de cruce de dos medias móviles con medias móviles de varios tipos

El autor:¿ Qué pasa?, Fecha: 2023-09-19 21: 27:31
Las etiquetas:

Resumen general

Esta estrategia genera señales de negociación mediante el cálculo del cruce de múltiples tipos de medias móviles, implementando un cruce doble de MA largo y corto.

Estrategia lógica

  1. Calcular dos MAs: MA1 y MA2, que pueden elegir entre SMA, EMA, VWMA, etc. Las longitudes son personalizables.

  2. Determinar el cruce de MA: pasar a largo cuando MA1 cruza sobre MA2, posición cerrada cuando MA1 cruza por debajo de MA2.

  3. (Opcional) Calcular un tercer MA - MA3, generalmente con un período más largo como 50. Por encima de MA3 es tendencia alcista, por debajo es tendencia bajista. Sólo negocie cuando el precio rompe MA3.

  4. Combine las reglas con el marco de tiempo de backtest para generar señales comerciales.

  5. Rellene con color las áreas cruzadas para ayuda visual.

La estrategia combina el seguimiento de la tendencia de los MA y el cruce largo/cortos, con un tercer MA para el control de riesgos.

Análisis de ventajas

  1. El cruce de doble MA sigue efectivamente la tendencia.

  2. Apoya múltiples combinaciones de tipos de MA, se puede optimizar para diferentes períodos.

  3. El tercer MA controla los riesgos y reduce las pérdidas innecesarias.

  4. La ayuda visual mejora la experiencia de negociación de gráficos.

  5. Los parámetros ajustables se pueden optimizar para diferentes ciclos.

  6. Lógica simple y clara, fácil de entender y seguir.

Análisis de riesgos

  1. La doble MA tiene problemas con escenarios de rango y reversión de tendencia.

  2. El doble MA puede generar señales falsas o reacciones excesivas a veces.

  3. El tercer MA puede perder oportunidades de tendencia fuerte. Puede probar acortando su período para capturar más ganancias.

  4. No puedo garantizar ganancias para cada operación, necesito una gestión adecuada de stop loss.

Direcciones de optimización

  1. Prueba diferentes tipos y períodos de MA para el mejor par de parámetros.

  2. Optimizar el tercer período de gestión para equilibrar el control de riesgos y la captura de beneficios.

  3. Añadir una estrategia de stop loss para controlar el importe de la pérdida de una sola operación.

  4. Considere algoritmos de aprendizaje automático para encontrar parámetros óptimos basados en grandes volúmenes de datos.

  5. Combinar con otros indicadores como KD, MACD para filtrar y confirmar la señal.

Resumen de las actividades

Esta doble estrategia de cruce de promedios móviles con MAs de múltiples tipos incorpora seguimiento de tendencias, control de riesgos, optimización de parámetros, ayuda visual y más. Con pruebas y optimización continuas, introducción de otros indicadores o aprendizaje automático, etc., puede adaptarse mejor al mercado y tiene un gran valor práctico. En resumen, esta es una estrategia simple, práctica y fácilmente optimizable, lo que la convierte en un gran punto de partida para el comercio algorítmico.


/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-12 22:00:00
period: 1m
basePeriod: 1m
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/
// © HAMIDBOX

//@version=4
strategy("Multi-X by HAMID-BOX", overlay=true)

maType(source , length, type)   =>
    type    == "SMA"            ? sma(source , length)  :
     type   == "EMA"            ? ema(source , length)  :
     type   == "RMA"            ? rma(source, length)   : 
     type   == "WMA"            ? wma(source, length)   :
     type   == "VWMA"           ? vwma(source, length)  :
     na
     
////////////////////////////////////////////////////////////////////////////////
colorup             = #11ff00
colordn             = #e91e63

/////////////////////////// MOVING AVERAGE №1 INPUTS ///////////////////////////
ma1_show            = input(title="MA №1", defval=true, type=input.bool, inline="ma1")
ma1type             = input(title="", defval="EMA", options=["SMA","EMA","RMA","WMA","VWMA"], inline="ma1")
ma1src              = input(title="", defval=close, type=input.source, inline="ma1")
ma1Len              = input(title="", defval=9, type=input.integer, inline="ma1")
ma1col              = input(colorup, "", type=input.color, inline="ma1")

ma1                 = maType(ma1src, ma1Len, ma1type)

ma1p = plot(ma1_show ? ma1 : na, linewidth=1, color=color.new(ma1col , 50))

/////////////////////////// MOVING AVERAGE №2 INPUTS ///////////////////////////
ma2_show            = input(title="MA №2", defval=true, type=input.bool, inline="ma2")
ma2type             = input(title="", defval="SMA", options=["SMA","EMA","RMA","WMA","VWMA"], inline="ma2")
ma2src              = input(title="", defval=close, type=input.source, inline="ma2")
ma2Len              = input(title="", defval=21, type=input.integer, inline="ma2")
ma2col              = input(colordn, "", type=input.color, inline="ma2")

ma2                 = maType(ma2src, ma2Len, ma2type)

ma2p = plot(ma2_show ? ma2 : na, linewidth=1, color=color.new(ma2col , 50))

/////////////////////////// MOVING AVERAGE №3 INPUTS ///////////////////////////

read                = input(title="For Safe Side = Read This >>>", defval=true, tooltip="If you want to play on the safe side, Check ON Moving Average № 3, MA №3 shows the major trend, its work as a Trend-Zone,\nRule: Do not open trades if the market is below MA № 3, WHY? because Trend is Bearish and it will make more Down, NOTE:: It is possible after adding MA № 3, it will give you a small profit. But the great advantage of that, it will reduce your loss and it will also increase your Profit Factor.\nAnd if you not have any issue with Risk then you can Leave Moving Average No 3")
ma3_show            = input(title="MA №3", defval=false, type=input.bool, inline="ma3")
ma3type             = input(title="", defval="SMA", options=["SMA","EMA","RMA","WMA","VWMA"], inline="ma3")
// ma3srcH          = input(title="", defval=high, type=input.source, inline="ma3")
// ma3srcL          = input(title="", defval=low, type=input.source, inline="ma3")
ma3Len              = input(title="", defval=50, type=input.integer, inline="ma3")
ma3col              = input(colordn, "", type=input.color, inline="ma3")

ma3H                = maType(high, ma3Len, ma3type)
ma3L                = maType(low, ma3Len, ma3type)

ma3p                = plot(ma3_show ? ma3H : na, linewidth=1, color=color.new(ma3col , 50))
ma3p2               = plot(ma3_show ? ma3L : na, linewidth=1, color=color.new(ma3col , 50))

Bigcross_zone_color = if ma3_show and close > ma3H
    color.new(colorup , 90)
else
    if ma3_show and close < ma3L
        color.new(colordn , 90)
fill(ma3p , ma3p2, color=Bigcross_zone_color, title="Cross Background Color")

BigCrossSignal      = close > ma3H
ZoneCrossover       = crossover(close , ma3H)
///////////////////////////// BACK TESTING INPUTS //////////////////////////////
startTime           = input(title="Start Time", type=input.time, defval= timestamp("01 Jan 2021"))
endTime             = input(title="End Time", type=input.time, defval= timestamp("01 Jan 2100"))
inDateRange         = true

//////////////////////////// PLOTING AND COOLORING /////////////////////////////
Cross               = input(true, "Cross Sign ON/OFF") 
maCrossOver         = crossover(ma1 , ma2)
maCrossUnder        = crossunder(ma1 , ma2)
cross_zone_color    = ma1 > ma2 ? color.new(colorup , 85) : color.new(colordn , 85)

plotshape(Cross ? maCrossOver : na, title="CrossUP Sign", style=shape.triangleup, location=location.belowbar, color=color.white, size=size.tiny)
plotshape(Cross ? maCrossUnder : na, title="CrossDN Sign", style=shape.xcross, location=location.abovebar, color=#e91e63, size=size.tiny)

fill(ma1p , ma2p, color=cross_zone_color, title="Cross Background Color")

///////////////////////////////// (CONDITIONS) /////////////////////////////////

if maCrossOver and inDateRange
    if ma3_show
        strategy.entry("BUY", strategy.long, when=BigCrossSignal)
    else    
        strategy.entry("BUY", strategy.long)

if  ma3_show
    strategy.entry("BUY", strategy.long, when=ZoneCrossover)

if maCrossUnder and inDateRange
    strategy.close("BUY", comment="Exit")
if (not inDateRange)
    strategy.close_all()





Más.