Estrategia de seguimiento de tendencias de momentum


Fecha de creación: 2023-11-07 16:49:49 Última modificación: 2023-11-07 16:49:49
Copiar: 0 Número de Visitas: 650
1
Seguir
1617
Seguidores

Estrategia de seguimiento de tendencias de momentum

Descripción general

La estrategia se basa en el análisis de tendencias de las medias móviles y el volumen de transacciones, la configuración de indicadores de movimiento y la operación de compra y venta en un modo de seguimiento de tendencias.

Principio de estrategia

  1. Calcula el promedio EMA de los precios de cierre y el promedio EMA acumulado de los volúmenes de transacción
  2. Cuando el cierre en el EMA se juzga como una tendencia alcista, se hace una operación múltiple
  3. Cuando continúe subiendo, se agrega una posición adicional cuando el cierre atraviesa el doble de la línea media de la EMA acumulada
  4. Configurar el indicador RSI para que cuando el RSI supere los 90 se aplique un tercio de la posición para obtener ganancias
  5. Cuando el cierre atraviesa la EMA, se considera una tendencia a la baja y se borran todas las posiciones de más
  6. Cuando el cierre descienda por debajo de la EMA, se juzga como una tendencia a la baja y se hace una operación en blanco
  7. Establecer una línea de stop loss, la línea de stop loss es un porcentaje fijo del precio de entrada
  8. La forma de ganar dinero con la cabeza vacía es la misma que con la cabeza grande.

Análisis de las ventajas

Las principales ventajas de esta estrategia son:

  1. El uso de la media EMA para determinar tendencias permite un seguimiento eficaz de las mismas.
  2. El EMA acumulado del volumen de transacciones se utiliza para determinar el cambio de tendencia real
  3. El indicador de la dinámica RSI se ha convertido en un ganador
  4. Control de riesgos y línea de parada
  5. Parámetros de ajuste flexibles para adaptarse a diferentes situaciones

Análisis de riesgos

Los principales riesgos de esta estrategia son:

  1. La EMA promedio se retrasa y puede perder el punto de inflexión
  2. El volumen de transacciones no siempre refleja las tendencias reales
  3. El porcentaje fijo de pérdidas puede ser demasiado mecanizado
  4. PARAMETERS: Demasiados para hacer una lista
  5. Las transacciones son frecuentes y costosas.

La solución al riesgo:

  1. Optimización de los parámetros de EMA para reducir el retraso
  2. Combinado con otros indicadores para confirmar la señal de entrega
  3. Optimización de los puntos de parada en función de las condiciones del mercado
  4. Parámetros simplificados, sólo se mantiene la configuración principal
  5. La flexibilidad adecuada de los límites de pérdidas y la frecuencia de las operaciones

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  1. Prueba diferentes configuraciones de EMA para encontrar la combinación óptima de parámetros
  2. Aumentar el VOLUME multiplicado para determinar la fuerza de la señal de entrada
  3. En combinación con otros indicadores como MACD, KD y otros para confirmar la admisión
  4. Optimización del porcentaje de stop loss según las características de una acción en particular
  5. Optimizar la frecuencia de las transacciones y reducir los costos de las transacciones

Resumir

La estrategia en su conjunto es una estrategia de seguimiento de tendencias basada en un sistema de líneas uniformes. La idea central es usar EMA para determinar la dirección de la tendencia y, junto con el indicador de dinámica de VOLUME, para confirmar la entrada. Se puede optimizar continuamente mediante la optimización de los parámetros y ayudar a otros indicadores a confirmar aún más. En general, es una estrategia de seguimiento de tendencias flexible que puede obtener buenos resultados después de su uso hábil.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mohanee

//@version=4
strategy("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=5, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(25, title="EMA Length", minval=1, maxval=200)
cumulativePeriod = input(100,  title="cumulative volume Period", minval=1, maxval=200)


riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(8,title="Stop Loss",minval=1)
takePartialProfits=input(true, title="take partial profits  (percentage same as stop loss)")

tradeDirection=input(title="Trade Direction", defval="LONG", options=["LONG", "SHORT"])

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = sum(avgPriceVolume, cumulativePeriod)
cumulVolume = sum(volume, cumulativePeriod)

cumValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

emaCumValue1=ema(cumValue, emaLength)
emaCumValue2=ema(cumValue, emaLength*2)

emaCumValueHistory=ema(cumValue[emaLength], emaLength)


//vwapVal1=vwap(hlc3)

rsiVal=rsi(close,5)

plotEma=plot(emaVal, title="EMA", color=color.green,  transp=25)
//plot(vwapValue, title="Cumulate Volumne", color=color.orange,  linewidth=2, transp=25)
//plot(vwapVal1, title="vwapVal1", color=color.purple,  linewidth=1, transp=25)
plotCum=plot(emaCumValue1, title="emaVwapValue", color=color.purple,  linewidth=2, transp=35)
plot(emaCumValue2, title="emaVwapValue", color=color.yellow,  linewidth=3, transp=25)
fill(plotEma,plotCum, color=emaVal>emaCumValue1 ? color.lime : color.red, transp=35, title="ema and cum area")

plot(emaCumValueHistory, title="emaCumValueHistory", color=color.black,  linewidth=2, transp=25)



//bgcolor(emaVal>vwapValue?color.blue:color.purple)    

//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1

//strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=crossover(emaVal, vwapValue)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=strategy.position_size==0 and crossover(emaVal, emaCumValue1)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

//re-entry
rentryCondition1=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValue2 and crossover(close, emaCumValue2) and close>open and  (tradeDirection=="LONG")
strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition1 )

rentryCondition2=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValueHistory and crossover(close, emaCumValueHistory) and close>open and  (tradeDirection=="LONG")
//strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition2 )    


//stoploss
stopLossVal=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00

//draw initil stop loss
//plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
takeProfit=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(1*0.01) )) : ( close[1] * 2 )
//if(takePartialProfits==true)
    //strategy.close(id="LE", comment="Partial"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and close>takeProfit and crossunder(close, emaVal) )    //close<close[1] and close[1]<close[2] and close[2]<close[3])

strategy.close(id="LE", comment="PExit Points=>"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and  takePartialProfits == true and close>=takeProfit and crossunder(rsiVal,90) )

profitVal=    strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(1*0.01) )) : ( close[1] * 2 )

//strategy.close(id="LE" , comment="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) and (tradeDirection=="LONG") )

strategy.close(id="LE" , comment="Exit Points=>"+tostring(close-strategy.position_avg_price, "###.##"), when=  crossunder(emaVal, emaCumValue1) and (tradeDirection=="LONG") )


strategy.close(id="LE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= close < stopLossVal   and (tradeDirection=="LONG") )


//for short  you dont have to wait crossodown of ema, falling is speed , so just check if close crossing down vwapVal
strategy.entry(id="SE",comment="SE", long=false, qty=qty1, when=crossunder(emaVal, emaCumValue1) and (tradeDirection=="SHORT") )    //emaVal>vwapValue and crossover(close , emaVal)


//stoploss
stopLossValUpside=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : 0.00

//draw initil stop loss
//plot(abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ? stopLossValUpside : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
shortTakeProfit=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00
if(takePartialProfits==true)
    strategy.close(id="SE", comment="Partial" , qty=strategy.position_size/3 , when = (tradeDirection=="SHORT"   ) and  crossover(rsiVal,15) )  //close<takeProfit and (emaVal - close)>8 )
  
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossover(emaVal, vwapValue) and (tradeDirection=="SHORT") )
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and ( (emaVal<emaCumValue1 and close>emaCumValue1 and open>emaCumValue1 and close>open )   or (crossover(emaVal,emaCumValue1))  ) and (tradeDirection=="SHORT") )

//strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  close > stopLossValUpside   and (tradeDirection=="SHORT"   ) )
strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  crossover(emaVal, emaCumValue1)   and (tradeDirection=="SHORT"   ) )