Estrategia de seguimiento de tendencias de impulso

El autor:¿ Qué pasa?, fecha: 2023-11-07 16:49:49
Las etiquetas:

img

Resumen general

Esta estrategia se basa en el análisis de tendencias de las medias móviles y el volumen, establece indicadores de impulso y realiza operaciones de compra y venta siguiendo las tendencias.

Principios de estrategia

  1. Calcular la EMA del precio de cierre y la EMA acumulada del volumen
  2. Cuando el cierre se cruza por encima de la EMA, se juzga como una tendencia al alza y se toma una posición larga
  3. Cuando continúa subiendo, cierre cruces por encima de 2 veces la EMA acumulada, añadir a la posición larga
  4. Establecer el indicador RSI, cuando el RSI exceda de 90, cerrar 1/3 de la posición para obtener ganancias
  5. Cuando el cierre se cruza por debajo de la EMA, se considera tendencia a la baja, cierre todas las posiciones largas
  6. Cuando el cierre se cruza por debajo de la EMA, se juzga como tendencia a la baja, tomar posición corta
  7. Establecer una línea de stop loss a un porcentaje fijo del precio de entrada
  8. La toma de ganancias de una posición corta es la misma que la posición larga.

Análisis de ventajas

Las principales ventajas de esta estrategia son las siguientes:

  1. El uso de la EMA para juzgar las tendencias puede realizar un seguimiento eficaz de las mismas
  2. Utilización de la EMA acumulada del volumen para juzgar los cambios reales de tendencia
  3. Indicador de impulso de seguimiento RSI para la obtención de beneficios
  4. Un buen control del riesgo con stop loss
  5. Puede adaptarse a las diferentes condiciones del mercado, los parámetros se pueden ajustar de forma flexible

Análisis de riesgos

Los principales riesgos de esta estrategia son:

  1. La EMA tiene retraso, puede perder puntos de inflexión
  2. El volumen puede no reflejar siempre la tendencia real
  3. El porcentaje fijo de pérdida de parada puede ser demasiado mecánico
  4. Demasiados parámetros hacen que el ajuste de parámetros sea difícil
  5. La alta frecuencia de negociación conduce a altos costes de negociación

Soluciones de riesgos:

  1. Optimizar los parámetros de la EMA para reducir el retraso
  2. Combinar con otros indicadores para confirmar las señales de volumen
  3. Optimizar los puntos de stop loss basados en las condiciones del mercado
  4. Simplifique los parámetros, mantenga solo las configuraciones principales
  5. Relajar adecuadamente el stop loss y la frecuencia de negociación

Direcciones de optimización

Esta estrategia puede optimizarse en los siguientes aspectos:

  1. Prueba diferentes parámetros de EMA para encontrar la combinación óptima
  2. Añadir múltiplos de volumen como juicio de la intensidad de la señal para la entrada
  3. Combinar con MACD, KD y otros indicadores para confirmar la entrada
  4. Optimizar el porcentaje de pérdida de parada de acuerdo con las características de las existencias específicas
  5. Optimizar la frecuencia de las operaciones para reducir los costes de las mismas

Resumen de las actividades

En resumen, esta es una estrategia de seguimiento de tendencias basada en el sistema de promedios móviles. La idea central es usar EMA para determinar la dirección de la tendencia y confirmar la entrada con el indicador de impulso VOLUME. Se puede optimizar continuamente a través del ajuste de parámetros y asistido por otros indicadores para una mayor confirmación. En general, es una estrategia de seguimiento de tendencias flexible, que puede producir buenos rendimientos después de un uso competente.


/*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"   ) )



Más.