Estrategia cuantitativa de doble toma de beneficios de media móvil cruzada

El autor:¿ Qué pasa?, Fecha: 2023-11-14 16:04:33
Las etiquetas:

img

Resumen general

Esta estrategia utiliza técnicas simples de cruce de promedios móviles y doble toma de ganancias para controlar el riesgo y aumentar la rentabilidad.

Estrategia lógica

La estrategia se basa en el cruce de EMA y WMA para determinar las tendencias del mercado.

Al entrar, se establecen dos niveles de take profit. El primer take profit se fija al precio de entrada + 20 pips, y el segundo take profit se fija al precio de entrada + 40 pips. Mientras tanto, se coloca un stop loss al precio de entrada - 20 pips.

Cuando el precio alcanza el primer take profit, se cerrará la mitad de la posición.

Hay tres resultados posibles para cada operación:

  1. El precio alcanza el stop loss, toma una pérdida del 2% directamente.

  2. Primero golpea el precio, primero obtiene ganancias, cierra la mitad de la posición y obtiene un 1% de ganancias, luego sigue corriendo hasta que se detiene, terminando con el punto de equilibrio.

  3. Después de golpear el primer take profit, el precio sigue funcionando y golpea el segundo take profit, terminando con 1% + 2% = 3% de ganancia total.

Análisis de ventajas

La mayor ventaja de esta estrategia de doble toma de ganancias es que controla el riesgo y evita grandes pérdidas individuales.

En comparación con el single take profit/stop loss, esta estrategia tiene tres resultados: pérdida, ganancia o equilibrio, lo que reduce la probabilidad de stop loss.

La EMA y la WMA son indicadores bien conocidos que son fáciles de entender. La lógica take profit/stop loss es sencilla de controlar.

Análisis de riesgos

A pesar de las ventajas, también hay riesgos que deben tenerse en cuenta para esta estrategia.

En primer lugar, como indicadores de medias móviles, la EMA y la WMA tienen capacidades relativamente débiles para identificar el mercado de los rangos.

En segundo lugar, es posible que los niveles fijos de toma de ganancias/detención de pérdidas no se adapten a la volatilidad del mercado.

Por último, la estrategia no puede responder a acontecimientos inesperados, con el riesgo de quedar atrapado.

Direcciones de optimización

Hay varios aspectos para optimizar aún más la estrategia:

  1. Mejorar las señales de entrada. Prueba mejores indicadores de media móvil o tendencia que EMA y WMA para generar señales de mayor calidad.

  2. Utilice métodos como ATR, stop loss posterior, etc. para hacer que los niveles de ganancia/pérdida se adapten a los mercados.

  3. Añadir filtros. Requerir el volumen o la confirmación del indicador secundario antes de cruzar para evitar trampas. También considerar si el comercio alrededor de los eventos principales.

  4. Optimizar el tamaño de las posiciones, ajustar el tamaño de las posiciones de acuerdo con las reglas de gestión de capital.

Conclusión

En resumen, esta es una estrategia de seguimiento de tendencias simple y práctica. Utiliza el cruce de EMA y WMA para las entradas y la doble toma de ganancias para controlar los riesgos. En comparación con las estrategias tradicionales, tiene una mayor tasa de ganancia y un menor riesgo. Por supuesto, se deben tener en cuenta las limitaciones de los indicadores y la configuración de ganancias / pérdidas.


/*backtest
start: 2023-11-06 00:00:00
end: 2023-11-13 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("FS ATR & PS (MA)", overlay=true)

// Strategy
Buy  = input(true)
Sell = input(true)

// Time Period
start_year   = input(title='Start year'   ,defval=2019)
start_month  = input(title='Start month'  ,defval=1)
start_day    = input(title='Start day'    ,defval=1)
start_hour   = input(title='Start hour '  ,defval=0)
start_minute = input(title='Start minute' ,defval=0)
end_time     = input(title='set end time?',defval=false)
end_year     = input(title='end year'     ,defval=2019)
end_month    = input(title='end month'    ,defval=12)
end_day      = input(title='end day'      ,defval=31)
end_hour     = input(title='end hour'     ,defval=23)
end_minute   = input(title='end minute'   ,defval=59)

// MA
ema_period   = input(title='EMA period',defval=10)
wma_period   = input(title='WMA period',defval=20)
ema = ema(close,ema_period)
wma = wma(close,wma_period)

// Entry Condition
longCondition  = 
 crossover(ema,wma) and Buy and
 nz(strategy.position_size) == 0 and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)
 
shortCondition = 
 crossunder(ema,wma) and Sell and
 nz(strategy.position_size) == 0 and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)

// Exit Condition
a = input(20)*10
b = input(40)*10
c = a*syminfo.mintick
d = b*syminfo.mintick

long_stop_level     = float(na)
long_profit_level1  = float(na)
long_profit_level2  = float(na)
long_even_level     = float(na)

short_stop_level    = float(na)
short_profit_level1 = float(na)
short_profit_level2 = float(na)
short_even_level    = float(na)

long_stop_level     := longCondition  ? close - c : long_stop_level     [1]
long_profit_level1  := longCondition  ? close + c : long_profit_level1  [1]
long_profit_level2  := longCondition  ? close + d : long_profit_level2  [1]
long_even_level     := longCondition  ? close + 0 : long_even_level     [1]

short_stop_level    := shortCondition ? close + c : short_stop_level    [1]
short_profit_level1 := shortCondition ? close - c : short_profit_level1 [1]
short_profit_level2 := shortCondition ? close - d : short_profit_level2 [1]
short_even_level    := shortCondition ? close + 0 : short_even_level    [1] 

// Position Sizing
Risk = input(defval=10, title="Risk per trade%", step=1, minval=0, maxval=100)/100
size  = 1

// Strategy
if longCondition
    strategy.entry("Buy"  , strategy.long, qty=size)
    strategy.exit ("Exit1", stop=long_stop_level, limit=long_profit_level1, qty=size/2)
    strategy.exit ("Exit2", stop=long_stop_level, limit=long_profit_level2)
    
if shortCondition
    strategy.entry("Sell" , strategy.short, qty=size)
    strategy.exit ("Exit3", stop=short_stop_level, limit=short_profit_level1, qty=size/2)
    strategy.exit ("Exit4", stop=short_stop_level, limit=short_profit_level2)
    
// Plot
plot(strategy.position_size <= 0 ? na : long_stop_level    , color=#dc143c, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size <= 0 ? na : long_profit_level1 , color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size <= 0 ? na : long_profit_level2 , color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size <= 0 ? na : long_even_level    , color=#ffffff, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_stop_level   , color=#dc143c, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_profit_level1, color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_profit_level2, color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_even_level   , color=#ffffff, style=plot.style_linebr, linewidth=1)
plot(ema,color=#00ced1)
plot(wma,color=#dc143c)






Más.