
Una estrategia de seguimiento de tendencias basada en el cruce de promedios móviles en dos períodos diferentes como una señal de compra y venta. La estrategia utiliza una media rápida y una media lenta como punto de entrada de la operación, luego de la cruza, determina la dirección de la tendencia y establece una posición de ventaja o de ventaja correspondiente.
La estrategia utiliza dos promedios móviles: un MA rápido y un MA lento. El ciclo de MA rápido generalmente se configura como un período más corto (como un período de 15), para capturar cambios en los precios a corto plazo; el ciclo de MA lento generalmente se configura como un período más largo (como un período de 21), para determinar la dirección de la tendencia principal. La señal de negociación de la estrategia proviene de la intersección de dos MA: una señal de compra cuando el MA rápido atraviesa el MA lento sobre el MA rápido; una señal de venta cuando el MA rápido atraviesa el MA lento debajo del MA rápido.
Al configurar diferentes combinaciones de MA, se puede ajustar la duración de la estrategia para capturar tendencias. Las combinaciones de MA más cortas pueden capturar oportunidades de cambio de precios en períodos más cortos; Las combinaciones de MA más largas pueden filtrar las oscilaciones y capturar solo tendencias en niveles de línea más largos.
La estrategia también incluye módulos de gestión de riesgos: stop loss, stop loss, stop loss móvil. Esto puede limitar la pérdida máxima de una sola operación y ayudar a proteger los beneficios generales.
La estrategia de doble línea de equilibrio tiene las siguientes ventajas:
La estrategia de doble línea de equilibrio también tiene ciertos riesgos, que se centran en los siguientes aspectos:
Estos riesgos pueden ser mejorados y optimizados por medio de ajustes en los parámetros de MA, la adición de condiciones de filtración y la optimización de la lógica de stop loss.
Las estrategias de doble línea pueden ser optimizadas en los siguientes aspectos:
Con estas optimizaciones y mejoras, se puede mejorar significativamente la probabilidad de éxito, la rentabilidad y la rentabilidad del riesgo de la estrategia.
La estrategia de ruptura de doble línea es una estrategia de seguimiento de tendencias que es fácil de implementar y optimizar en general. Tiene ventajas como la simplicidad de operación, la flexibilidad de ajuste y el control de riesgos, y es muy adecuada como estrategia de entrada para el comercio cuantitativo. A través de pruebas y optimización continuas, esta estrategia puede mejorar continuamente y tiene el potencial de ser una estrategia de optimización cualitativa.
/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)
maFastSource = input(defval = ohlc4, title = "Fast MA Source")
maFastLength = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength = input(defval = 21, title = "Slow MA Period", minval = 1)
tradeInvert = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)
useTakeProfit = inpTakeProfit >= 1 ? inpTakeProfit : na
useStopLoss = inpStopLoss >= 1 ? inpStopLoss : na
useTrailStop = inpTrailStop >= 1 ? inpTrailStop : na
useTrailOffset = inpTrailOffset >= 1 ? inpTrailOffset : na
useTimeLimit = input(defval = true, title = "Use Start Time Limiter?")
startYear = input(defval = 2018, 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)
startTimeOk() =>
inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
timeOk = time > inputTime ? true : false
r = (useTimeLimit and timeOk) or not useTimeLimit
maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)
fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)
aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false
if( startTimeOk() )
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 )
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.exit("Exit Long", from_entry = "Long", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)