Estrategia inteligente de trailing stop loss basada en media móvil y patrón intradiario

SMA MA18 ATR
Fecha de creación: 2025-01-17 16:04:09 Última modificación: 2025-01-17 16:04:09
Copiar: 4 Número de Visitas: 361
1
Seguir
1617
Seguidores

Estrategia inteligente de trailing stop loss basada en media móvil y patrón intradiario

Descripción general

Esta es una estrategia basada en el promedio móvil de 18 días (SMA18), combinada con el reconocimiento de patrones de negociación intradía y un mecanismo de trailing stop inteligente. Esta estrategia observa principalmente la relación entre el precio y la SMA18, combina los puntos máximos y mínimos intradiarios e ingresa en la posición larga en el momento adecuado. La estrategia adopta un plan de stop-loss flexible, que puede utilizar un punto de stop-loss fijo o un punto más bajo de dos días como referencia de stop-loss dinámico.

Principio de estrategia

La lógica central de la estrategia incluye los siguientes elementos clave:

  1. Las condiciones de entrada se basan en la posición relativa del precio respecto de la media móvil de 18 días. Puede optar por entrar en el mercado cuando supere la media móvil o por encima de ella.
  2. Al analizar los patrones de la línea K intradía, prestando especial atención al patrón de la línea K interna (barra interior), se mejora la precisión de la entrada.
  3. En función de las características de rendimiento de los diferentes días de negociación de la semana, puede negociar de forma selectiva en días específicos.
  4. El precio de entrada se establece en una orden limitada, con una pequeña prima por encima del punto bajo para aumentar la probabilidad de una transacción.
  5. El mecanismo de stop loss admite dos modos: uno es un stop loss fijo basado en el precio de entrada y el otro es un stop loss dinámico basado en el punto más bajo de los dos días de negociación anteriores.

Ventajas estratégicas

  1. Combinando indicadores técnicos y patrones de precios, las señales de entrada son más confiables
  2. Mecanismo de selección de horario de negociación flexible, que se puede optimizar según las diferentes características del mercado.
  3. La solución inteligente de stop loss protege las ganancias y al mismo tiempo otorga a los precios suficiente margen para las fluctuaciones
  4. Los parámetros de la estrategia son altamente ajustables y pueden adaptarse a diferentes entornos de mercado.
  5. Mediante la detección de patrones internos de la línea K, se reducen eficazmente las señales falsas.

Riesgo estratégico

  1. En mercados volátiles, los stops fijos pueden llevar a salidas prematuras
  2. Para una reversión rápida, un stop loss dinámico puede generar menos ganancias.
  3. Durante la fase lateral, las velas internas frecuentes pueden generar operaciones excesivas. Contramedidas:
  • Ajuste dinámicamente la distancia del stop loss según la volatilidad del mercado
  • Añadir indicadores de confirmación de tendencias
  • Establezca un objetivo de beneficio mínimo para filtrar las operaciones de baja calidad

Dirección de optimización de la estrategia

  1. Introduzca indicadores de volatilidad (como ATR) para ajustar dinámicamente la distancia de stop loss
  2. Aumente la dimensión del análisis de volumen y mejore la confiabilidad de la señal.
  3. Desarrollar algoritmos de selección de fechas más inteligentes para optimizar automáticamente los tiempos de negociación en función del rendimiento histórico
  4. Se agregó un filtro de fuerza de tendencia para evitar operar en tendencias débiles.
  5. Optimizar el algoritmo de reconocimiento de línea K interna para mejorar la precisión del reconocimiento de patrones

Resumir

Esta estrategia construye un sistema comercial relativamente completo combinando métodos de análisis de múltiples dimensiones. La principal ventaja de la estrategia radica en su configuración flexible de parámetros y su mecanismo inteligente de stop-loss, que le permite adaptarse a diferentes entornos de mercado. A través de la optimización y mejora continuas, se espera que la estrategia mantenga un rendimiento estable en diversas condiciones del mercado.

Código Fuente de la Estrategia
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © zweiprozent

strategy('Buy Low over 18 SMA Strategy', overlay=true, default_qty_value=1)
xing = input(false, title='crossing 18 sma?')
sib = input(false, title='trade inside Bars?')
shortinside = input(false, title='trade inside range bars?')
offset = input(title='offset', defval=0.001)
belowlow = input(title='stop below low minus', defval=0.001)
alsobelow = input(false, title='Trade only above 18 sma?')
tradeabove = input(false, title='Trade with stop above order?')
trailingtwo = input(false, title='exit with two days low trailing?')


insideBar() =>  //and high <= high[1] and low >= low[1] ? 1 : 0
    open <= close[1] and close >= open[1] and close <= close[1] or open >= close[1] and open <= open[1] and close <= open[1] and close >= close[1] ? 1 : 0

inside() =>
    high <= high[1] and low >= low[1] ? 1 : 0
enterIndex = 0.0
enterIndex := enterIndex[1]

inPosition = not na(strategy.position_size) and strategy.position_size > 0
if inPosition and na(enterIndex)
    enterIndex := bar_index
    enterIndex



//if strategy.position_size <= 0 

//    strategy.exit("Long", stop=low[0]-stop_loss,comment="stop loss")


//if not na(enterIndex) and bar_index - enterIndex + 0 >= 0 

//    strategy.exit("Long", stop=low[0]-belowlow,comment="exit")

//    enterIndex := na

T_Low = request.security(syminfo.tickerid, 'D', low[0])
D_High = request.security(syminfo.tickerid, 'D', high[1])
D_Low = request.security(syminfo.tickerid, 'D', low[1])
D_Close = request.security(syminfo.tickerid, 'D', close[1])
D_Open = request.security(syminfo.tickerid, 'D', open[1])

W_High2 = request.security(syminfo.tickerid, 'W', high[1])
W_High = request.security(syminfo.tickerid, 'W', high[0])
W_Low = request.security(syminfo.tickerid, 'W', low[0])
W_Low2 = request.security(syminfo.tickerid, 'W', low[1])
W_Close = request.security(syminfo.tickerid, 'W', close[1])
W_Open = request.security(syminfo.tickerid, 'W', open[1])

//longStopPrice  = strategy.position_avg_price * (1 - stopl)
// Go Long - if prev day low is broken and stop loss prev day low
entryprice = ta.sma(close, 18)

//(high[0]<=high[1]or close[0]<open[0]) and low[0]>vwma(close,30) and time>timestamp(2020,12,0,0,0)

showMon = input(true, title='trade tuesdays?')
showTue = input(true, title='trade wednesdayy?')
showWed = input(true, title='trade thursday?')
showThu = input(true, title='trade friday?')
showFri = input(true, title='trade saturday?')
showSat = input(true, title='trade sunday?')
showSun = input(true, title='trade monday?')

isMon() =>
    dayofweek(time('D')) == dayofweek.monday and showMon
isTue() =>
    dayofweek(time('D')) == dayofweek.tuesday and showTue
isWed() =>
    dayofweek(time('D')) == dayofweek.wednesday and showWed
isThu() =>
    dayofweek(time('D')) == dayofweek.thursday and showThu
isFri() =>
    dayofweek(time('D')) == dayofweek.friday and showFri
isSat() =>
    dayofweek(time('D')) == dayofweek.saturday and showSat
isSun() =>
    dayofweek(time('D')) == dayofweek.sunday and showSun


clprior = close[0]
entryline = ta.sma(close, 18)[1]
//(isMon() or isTue()or isTue()or  isWed() 
noathigh = high < high[1] or high[2] < high[3] or high[1] < high[2] or low[1] < ta.sma(close, 18)[0] and close > ta.sma(close, 18)[0]

if noathigh and time > timestamp(2020, 12, 0, 0, 0) and (alsobelow == false or high >= ta.sma(close, 18)[0]) and (isMon() or isTue() or isWed() or isThu() or isFri() or isSat() or isSun()) and (high >= high[1] or sib or low <= low[1])  //((sib == false and inside()==true) or inside()==false) and (insideBar()==true or shortinside==false)
    if tradeabove == false
        strategy.entry('Long', strategy.long, limit=low + offset * syminfo.mintick, comment='long')
    if tradeabove == true and (xing == false or clprior < entryline)  // and high<high[1] 
        strategy.entry('Long', strategy.long, stop=high + offset * syminfo.mintick, comment='long')


//if time>timestamp(2020,12,0,0,0) and isSat()  
//    strategy.entry("Long", strategy.long, limit=0, comment="long")


//strategy.exit("Long", stop=low-400*syminfo.mintick)

//strategy.exit("Long", stop=strategy.position_avg_price-10*syminfo.mintick,comment="exit")
//strategy.exit("Long", stop=low[1]-belowlow*syminfo.mintick, comment="stop")

if strategy.position_avg_price > 0 and trailingtwo == false and close > strategy.position_avg_price
    strategy.exit('Long', stop=strategy.position_avg_price, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo == false and (low > strategy.position_avg_price or close < strategy.position_avg_price)
    strategy.exit('Long', stop=low[0] - belowlow * syminfo.mintick, comment='stop')

if strategy.position_avg_price > 0 and trailingtwo
    strategy.exit('Long', stop=ta.lowest(low, 2)[0] - belowlow * syminfo.mintick, comment='stop')