Estrategia de negociación de cruce de medias móviles dobles


Fecha de creación: 2023-10-13 15:40:49 Última modificación: 2023-10-13 15:40:49
Copiar: 0 Número de Visitas: 743
1
Seguir
1617
Seguidores

Descripción general

La estrategia de intercambio de doble línea recta se realiza mediante el cálculo de la línea recta de dos parámetros diferentes y mediante el cruce de la línea recta para realizar operaciones de compra y venta. La estrategia es sencilla y directa, adecuada para el comercio a corto y medio plazo.

Principio de estrategia

La estrategia se basa en la introducción de parámetros como el ciclo de la media rápida, el ciclo de la media lenta y el tipo de media, para calcular la media rápida y la media lenta. La operación de compra se realiza cuando la media rápida atraviesa la media lenta en la media rápida y la operación de venta cuando la media rápida atraviesa la media lenta por debajo de la media rápida.

La lógica central de esta estrategia es la siguiente:

  1. Los parámetros de entrada son: ciclo de línea media rápida maLen1, ciclo de línea media lenta maLen2, tipo de línea media maTypeChoice

  2. Calculación de la media rápida maValue1 y la media lenta maValue2 de acuerdo con los parámetros de entrada

  3. Comparación entre dos líneas medias que definen las condiciones de compra y venta:

    • Condiciones de compra: maValue1 y maValue2

    • Condiciones de venta: maValue1 bajo maValue2

  4. Realizar las operaciones correspondientes cuando se establezcan las condiciones de compra y venta

  5. Visualización de la línea media y relación de tamaño de la línea media con diferentes colores

  6. Envío de señales de compra y venta

Ventajas estratégicas

  • Utiliza el principio de la cruz de dos líneas uniformes para evitar ser engañado por una sola oscilación uniforme

  • Los parámetros de la línea media son ajustables y se adaptan a diferentes operaciones de ciclo

  • La lógica de la transacción es simple, directa y fácil de entender.

  • Indicadores de compra y venta personalizados, que permiten conocer el momento de la operación en tiempo real.

  • La visualización muestra el movimiento de la línea media, formando un indicador de comercio intuitivo

  • Se puede encontrar la combinación de parámetros óptima mediante optimización de parámetros

  • Se puede utilizar para el retroceso de búsqueda de parámetros óptimos, también se puede utilizar para el comercio de discos duros

Riesgo estratégico

  • El cruce de líneas medias es propenso a generar señales erróneas y debe ser juzgado en combinación con la tendencia y la forma.

  • Las pérdidas de costos de transacción se deben a la apertura frecuente de posiciones en momentos de fluctuación de la línea de par

  • Los parámetros incorrectos pueden causar transacciones demasiado frecuentes o poco frecuentes

  • Los eventos repentinos pueden provocar situaciones dramáticas que no se pueden detener

  • Los indicadores de corto período pueden fallar cuando se rompe el gran ciclo

  • El sistema de monitoreo es muy frecuente y no se puede implementar automáticamente.

La solución al riesgo:

  • La combinación de indicadores de tendencia evita el comercio de cañones convulsivos

  • Combinación de indicadores de forma para confirmar la efectividad de la señal

  • Optimizar los parámetros para que la frecuencia de las transacciones sea razonable

  • Establezca un punto de parada para controlar las pérdidas individuales

  • Verificación de la estabilidad de los parámetros en varios períodos de tiempo

  • El uso de filtros de tiempo o señales para evitar falsas brechas

Dirección de optimización de la estrategia

  • Prueba de diferentes parámetros de la media para encontrar el parámetro óptimo

  • Prueba de diferentes tipos de medias para seleccionar la mediana más precisa para generar la señal

  • Combinación de indicadores de tendencia para evitar operaciones fuera de tendencia

  • Indicadores de fluctuación para determinar el momento adecuado para jugar

  • Añadir filtros de tiempo o de señal para reducir las señales erróneas

  • Configuración de control de punto de deslizamiento para optimizar el efecto de las operaciones en disco duro

  • Estabilidad comprobada en múltiples variedades y ciclos

  • Unirse a una estrategia de parada automática de pérdidas

  • Explorar tecnologías como el aprendizaje automático para mejorar la detección

Resumir

La estrategia de cruce de dos líneas es una estrategia de indicadores técnicos muy típica. Utiliza el principio de cruce de línea recta rápida y lenta para generar señales de negociación, y puede obtener buenos resultados de retroalimentación mediante la optimización de los parámetros. Pero la estrategia también tiene un cierto riesgo, y se necesita trabajar con otros indicadores técnicos, como tendencias, formas, para verificar y reducir la tasa de señales erróneas.

Código Fuente de la Estrategia
/*backtest
start: 2023-10-05 00:00:00
end: 2023-10-05 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// © sehweijun
//study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="")
// strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract)

maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] )
maSrc = input( close, title="MA Source" )
maLen1 = input( 15, minval=1, title="MA Length" )
maLen2 = input( 95, minval=1, title="MA Length" )

maValue1 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen1 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen1 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen1 )
else
    0
    
maValue2 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen2 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen2 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen2 )
else
    0

buySignal = crossover( maValue1, maValue2 )
sellSignal = crossunder( maValue1, maValue2 )

mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red 

plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 )
//plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 )

var color buyCandleColour = #00ff0a
var color sellCandleColour = #ff1100

barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" )
bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour")

alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!")
alertcondition( buySignal, title="Buy signal!", message="Buy signal!")
alertcondition( sellSignal, title="Sell signal!", message="Sell signal!")

// Strategy Tester
stratTesterOn    = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
entryTime        = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session )
startTime        = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session )
maxDailyLoss     = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer )
maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer )
contractSize     = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer )

tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)

fixedTPSL        = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false)
fixedTPValue     = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" )
fixedSLValue     = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" )

fromDay          = input(defval = 1,    title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
fromMonth        = input(defval = 1,    title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
fromYear         = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970)
thruDay          = input(defval = 1,    title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
thruMonth        = input(defval = 1,    title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
thruYear         = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash )
// strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash )

isTime(_position) =>
    range = time( timeframe.period, _position + ':1234567' )
bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 )

if ( stratTesterOn and window() )
    if ( buySignal and isTime( entryTime ) )
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Buy", strategy.long, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0 )
            strategy.entry( "Buy", strategy.long, contractSize )
            strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        
    if ( sellSignal and isTime( entryTime ))
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Sell", strategy.short, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0  )
            strategy.entry( "Sell", strategy.short, contractSize )
            strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 )
        if ( maValue1 > maValue2 )
            strategy.entry( "Buy", strategy.long, contractSize )
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        else
            strategy.entry( "Sell", strategy.short, contractSize ) 
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    strategy.close_all( when=not isTime( entryTime ) )

plot( strategy.equity )