Estrategia de doble MA con límite de tiempo

El autor:¿ Qué pasa?, Fecha: 2023-11-14 16:45:03
Las etiquetas:

img

Resumen general

Esta estrategia implementa un módulo de límite de tiempo basado en la estrategia original de media móvil dual para controlar la hora de inicio de la estrategia.

Principio

La estrategia genera señales comerciales utilizando MA rápidos y lentos. El MA rápido tiene un período de 14 días y el MA lento tiene un período de 21 días. Una señal de compra se genera cuando el MA rápido cruza por encima del MA lento. Una señal de venta se genera cuando el MA rápido cruza por debajo del MA lento.

La estrategia también incorpora una opción de inversión comercial para revertir la dirección comercial original.

El módulo de límite de tiempo compara el tiempo actual con el tiempo de inicio configurado utilizando sellos de tiempo, devolviendo verdadero o falso para controlar si la estrategia se inicia o no. El año de inicio, mes, día, hora y minuto deben configurarse. La estrategia solo se iniciará cuando el tiempo actual exceda el tiempo de inicio configurado.

Ventajas

  • Los dos MAs capturan eficazmente las tendencias a medio y corto plazo
  • El módulo de límite de tiempo controla con precisión el tiempo de ejecución de la estrategia, evitando operaciones innecesarias en condiciones de mercado desfavorables
  • La opción de inversión comercial añade flexibilidad

Riesgos y soluciones

  • Los MAs duales pueden generar señales comerciales excesivas, aumentando la frecuencia y los costes de negociación
  • La configuración incorrecta del límite de tiempo puede causar oportunidades perdidas
  • La inversión incorrecta del comercio puede dar lugar a señales comerciales incorrectas

La optimización de los períodos de MA puede reducir la frecuencia de negociación. La hora de inicio también debe establecerse racionalmente para evitar oportunidades perdidas. Finalmente, elija cuidadosamente si invertir las señales en función de las condiciones del mercado.

Direcciones de optimización

  • La adición de un módulo de stop loss controla mejor el riesgo de las operaciones individuales
  • Implementar un stop loss que mueva gradualmente el punto de stop loss puede ayudar a obtener ganancias
  • La combinación de señales a través de múltiples símbolos puede mejorar la calidad de la señal y reducir las señales falsas
  • Desarrollo de un módulo de optimización de parámetros que encuentre automáticamente las combinaciones óptimas de parámetros

Resumen de las actividades

Esta estrategia genera señales de trading utilizando MAs duales y controla el tiempo de ejecución con el módulo de límite de tiempo, capturando efectivamente las tendencias evitando condiciones de mercado desfavorables.


/*backtest
start: 2023-11-06 00:00:00
end: 2023-11-13 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Strategy Code Example", shorttitle = "Strategy Code Example", overlay = true)

// Revision:        1
// Author:          @JayRogers
//
// *** THIS IS JUST AN EXAMPLE OF STRATEGY TIME LIMITING ***
//
//  This is a follow up to my previous strategy example for risk management, extended to include a time limiting factor.

// === GENERAL INPUTS ===
// short ma
maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 14, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

// === STRATEGY RELATED INPUTS ===
tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// Risk management
inpTakeProfit   = input(defval = 1000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 200, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 200, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)
// *** FOCUS OF EXAMPLE ***
// Time limiting
// a toggle for enabling/disabling
useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
// set up where we want to run from
startYear       = input(defval = 2016, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// *** FOCUS OF EXAMPLE ***
// === TIME LIMITER CHECKING FUNCTION ===
// using a multi line function to return true or false depending on our input selection
// multi line function logic must be indented.
startTimeOk() =>
    // get our input time together
    inputTime   = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    // check the current time is greater than the input time and assign true or false
    timeOk      = time > inputTime ? true : false
    // last line is the return value, we want the strategy to execute if..
    // ..we are using the limiter, and the time is ok -OR- we are not using the limiter
    r = (useTimeLimit and timeOk) or not useTimeLimit

// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

// === PLOTTING ===
fast = plot(maFast, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = red, linewidth = 2, style = line, transp = 50)

// === LOGIC ===
// is fast ma above slow ma?
aboveBelow = maFast >= maSlow ? true : false
// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// *** FOCUS OF EXAMPLE ***
// wrap our strategy execution in an if statement which calls the time checking function to validate entry
// like the function logic, content to be included in the if statement must be indented.
if( startTimeOk() )
    // === STRATEGY - LONG POSITION EXECUTION ===
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    strategy.close( id = "Long", when = exitLong )
    
    // === STRATEGY - SHORT POSITION EXECUTION ===
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    strategy.close( id = "Short", when = exitShort )
    
    // === STRATEGY RISK MANAGEMENT EXECUTION ===
    strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
    strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)


Más.