EMA y la estrategia de cruce de volumen acumulado para el corto largo

El autor:¿ Qué pasa?, Fecha: 20 de septiembre de 2023 11:48:34
Las etiquetas:

Resumen general

Esta estrategia combina los indicadores de EMA y volumen acumulado, generando señales de compra y venta basadas en sus situaciones cruzadas para determinar tendencias.

Estrategia lógica

Se computan los indicadores de volumen acumulado de 50 días y de 100 días. Cuando la EMA cruza por encima del volumen acumulado desde abajo, se genera una señal de compra para ir largo. Cuando la EMA cruza por debajo del volumen acumulado desde arriba, se genera una señal de venta para ir corto.

Durante las posiciones, se implementan estrategias fijas de stop loss y take profit. La stop loss se establece en un 8% por debajo del precio de entrada. La take profit se establece en un 8% por encima del precio de entrada, con cierre parcial de la posición cuando el precio alcanza el nivel de take profit.

Análisis de ventajas

La estrategia combina el indicador de tendencia EMA y el volumen acumulado del indicador de flujo de fondos, aprovechando tanto la información de precios como la de volumen para identificar eficazmente las tendencias a mediano y largo plazo.

El período EMA puede ajustarse libremente para diferentes productos. Tanto las operaciones largas como las cortas se implementan para el comercio lineal.

Análisis de riesgos

La dependencia excesiva de los promedios móviles puede dar lugar a problemas durante las consolidaciones de rango.

La ampliación de los períodos de promedio móvil podría reducir las señales falsas. Indicadores adicionales como la volatilidad, RSI también pueden ayudar a los juicios.

Direcciones de optimización

  1. Prueba y optimiza las combinaciones de parámetros EMA para encontrar los ajustes óptimos.

  2. Incorporar otros indicadores técnicos para formar un sistema conjunto.

  3. Aplicar el aprendizaje automático para predecir tendencias y mejorar el rendimiento de la EMA.

  4. Optimizar las estrategias de toma de ganancias y stop loss mediante la combinación de paradas de rastro, salidas dinámicas, etc.

  5. Introducir módulos de gestión de capital para el dimensionamiento dinámico de las posiciones.

  6. Personalizar los parámetros basados en las características del producto para formar un conjunto de estrategias.

Resumen de las actividades

La idea de la estrategia de combinar la EMA y el volumen para la identificación de tendencias es clara. Pero la dependencia excesiva de los promedios móviles y las salidas fijas tiene defectos. Agregar más indicadores de juicio y optimizar las salidas puede mejorar la robustez. En general, proporciona una idea de usar datos de precio y volumen para el seguimiento de tendencias.


/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 2h
basePeriod: 15m
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=1, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(50, 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(false, 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)

vwapValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

plot(emaVal, title="EMA", color=color.green,  transp=25)
plot(vwapValue, title="Cumulate Volumne / VWAP", color=color.orange,  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)

//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+(stopLoss*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="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) 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=(close<vwapValue and close<open  and close[1] < vwapValue  and close[1]<open[1] and close<close[1])  and emaVal>=vwapValue 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  close<shortTakeProfit )  //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<vwapValue and close>vwapValue and open>vwapValue and close>open )   or (crossover(emaVal,vwapValue))  ) 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"   ) )




Más.