
La estrategia utiliza la intersección de dos medias móviles para determinar el cambio de tendencia en el mercado y realizar operaciones de compra y venta en función de la tendencia. Cuando el promedio corto atraviesa el promedio largo, se hace más y cuando el promedio corto atraviesa el promedio largo, se hace un espacio para seguir la dirección de la tendencia.
El núcleo de la estrategia son dos medias móviles: una media rápida (de 32 periodos por defecto) y una media lenta (de 32 periodos por defecto, ajustable a través de parámetros). Cuando el precio de cierre sube/baja a través de los canales formados por estas dos medias, la estrategia genera una señal de compra o venta:
A través de esta forma de cruce equilíneo, la estrategia puede seguir la tendencia, manteniendo más órdenes en una tendencia alcista y más órdenes en una tendencia bajista, hasta que la tendencia se vuelva hacia atrás.
En respuesta a estos riesgos, se puede considerar la adición de filtros adecuados, como el filtro ATR o el filtro de amplitud real media, para reducir el exceso de operaciones en mercados convulsos; establecer un alto razonable, controlar las pérdidas individuales; optimizar continuamente los parámetros para adaptarse al mercado. Pero las limitaciones de la estrategia en sí son difíciles de evitar por completo.
Las optimizaciones anteriores pueden mejorar la capacidad de la estrategia para hacer frente a mercados complejos, pero hay que tener en cuenta que la optimización excesiva puede conducir a la curva de ajuste y causar un mal rendimiento en el futuro.
La estrategia de seguimiento de tendencias de doble línea de equilibrio captura la tendencia a través de la cruz de la línea de equilibrio, tiene características de fácil uso y amplia aplicabilidad. Sin embargo, su desempeño en el mercado de la oscilación es insuficiente, la respuesta a las situaciones extremas es insuficiente y la optimización de los parámetros es más difícil. La estrategia puede optimizarse mediante la introducción de más indicadores de filtrado, stop loss dinámico, gestión de posiciones, combinación de múltiples ciclos y adaptación de los parámetros.
/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
//study(title="Demo - SSL Basic", shorttitle="Demo - SSL Basic", overlay=true)
strategy(title='Demo - SSL Basic', shorttitle='Demo - SSL Basic', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, commission_value=0.15)
// Backtest Date Range
start_date_long = input(title='Backtest Long Start Date', defval=timestamp('01 Jan 2018 00:00 +0530'))
end_date_long = input(title='Backtest Long End Date', defval=timestamp('25 Jan 2030 00:00 +0530'))
backtest_range = true
// Inputs
maType = input.string(title='SSL MA Type', options=['SMA', 'EMA', 'WMA'], defval='SMA')
sslLen = input(title='SSL Length', defval=32)
showCross = input(title='Show Crossover?', defval=true)
showEntry = input(title='Show Entry?', defval=true)
showTrend = input(title='Show Trend Colors?', defval=true)
// Calc MA for SSL Channel
calc_ma(close, len, type) =>
float result = 0
if type == 'SMA' // Simple
result := ta.sma(close, len)
result
if type == 'EMA' // Exponential
result := ta.ema(close, len)
result
if type == 'WMA' // Weighted
result := ta.wma(close, len)
result
result
// Add SSL Channel
maHigh = calc_ma(high, sslLen, maType)
maLow = calc_ma(low, sslLen, maType)
Hlv = int(na)
Hlv := close > maHigh ? 1 : close < maLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? maHigh : maLow
sslUp = Hlv < 0 ? maLow : maHigh
ss1 = plot(sslDown, title='Down SSL', linewidth=2, color=showTrend ? na : color.red)
ss2 = plot(sslUp, title='Up SSL', linewidth=2, color=showTrend ? na : color.lime)
// Conditions
longCondition = ta.crossover(sslUp, sslDown)
shortCondition = ta.crossover(sslDown, sslUp)
// Strategy
if shortCondition
strategy.close('Long', comment='Long Exit', alert_message='JSON')
if longCondition
strategy.close('Short', comment='Short Exit', alert_message='JSON')
if backtest_range and longCondition
strategy.entry('Long', strategy.long, comment='Long Entry', alert_message='JSON')
if backtest_range and shortCondition
strategy.entry('Short', strategy.short, comment= 'Short Entry', alert_message='JSON')
// Plots
fill(ss1, ss2, color=showTrend ? sslDown < sslUp ? color.new(color.lime, transp=75) : color.new(color.red, transp=75) : na, title='Trend Colors')