Estrategia de trading larga y corta basada en EMA y volumen acumulado


Fecha de creación: 2023-09-20 11:48:34 Última modificación: 2023-09-20 11:48:34
Copiar: 0 Número de Visitas: 793
1
Seguir
1617
Seguidores

Descripción general

La estrategia combina EMA y el indicador de volumen de negocios acumulado para determinar la tendencia del mercado en función de la intersección de ambos, generando señales de compra y venta. Es una estrategia típica de seguimiento de tendencias que sigue la dirección del mercado a nivel de líneas más largas.

Principio de estrategia

Calcula el promedio de la EMA de 50 días, así como el indicador de volumen de negocios acumulado de 100 días. Cuando la EMA de abajo hacia arriba rompe el volumen de negocios acumulado, genera una señal de compra más; cuando la EMA de arriba hacia abajo rompe el volumen de negocios acumulado, genera una señal de venta cero.

Durante el proceso de mantenimiento de la posición, establezca un stop loss fijo y un stop exiting. El stop loss se establece como el 8% por debajo del precio de entrada; el stop stop se establece como el 8% por encima del precio de entrada y se liquida una parte de la posición cuando el precio toca el punto de parada.

Análisis de las ventajas

La estrategia combina el indicador de tendencia EMA y el indicador de flujo de capital para acumular volumen de transacciones, aprovechando al máximo la información de precios y volumen de transacciones, para identificar de manera efectiva las tendencias de la línea media y larga. La estrategia de stop loss fija es directamente eficiente y ventajosa para bloquear parte de las ganancias y controlar el riesgo.

Se pueden ajustar libremente los parámetros del ciclo EMA para adaptarse a diferentes variedades. Se puede hacer más deuda libre y realizar operaciones lineales. Los datos de retrospectiva muestran que la estrategia funciona bien en condiciones de tendencia.

Análisis de riesgos

Esta estrategia depende demasiado de indicadores de la línea media y es propensa a generar señales erróneas en situaciones de oscilación intermedia. Las paradas fijas también pueden causar salidas prematuras o paradas excesivas. Sólo se considera la información de precios y volúmenes de transacción, sin considerar otros factores.

Se pueden ampliar adecuadamente los parámetros de la línea media para reducir las señales erróneas. También se pueden introducir indicadores como la tasa de volatilidad y el RSI para ayudar a juzgar. Se pueden optimizar los mecanismos de parada de pérdidas, como la introducción de paradas de seguimiento y paradas dinámicas.

Dirección de optimización

  1. Prueba de optimización de la combinación de parámetros de EMA para encontrar el parámetro óptimo.

  2. Introducir otros indicadores técnicos para formar una estrategia de combinación de indicadores.

  3. Aplicación de aprendizaje automático para predecir tendencias de precios y mejorar la eficacia de las EMA.

  4. Optimización de las estrategias de stop loss, combinadas con mecanismos de seguimiento de stop loss, stop loss dinámico, etc.

  5. Introducción de un módulo de gestión de fondos y ajuste dinámico de posiciones.

  6. Ajuste de parámetros a las características de la variedad para formar una combinación de estrategias.

Resumir

La estrategia integra los EMA y los indicadores de volumen de transacción para determinar la tendencia de la línea media y larga. Sin embargo, también existe el problema de la excesiva dependencia de la línea media y los paros de parada fijos.

Código Fuente de la Estrategia
/*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"   ) )