
La estrategia de rebote de la media móvil es una estrategia que sigue a los precios para romper las medias móviles. Se examina si el tiburón se rebota por debajo de la media móvil, y si lo hace, es una señal de cabeza; si el tiburón se rebota por encima de la media móvil, es una señal de cabeza.
Exponential Moving Average Bounce Strategy
La estrategia se basa en el promedio móvil exponencial. Se calcula una línea EMA en tiempo real. Luego se comprueba si el precio rebota por encima o por debajo de la línea EMA:
La respuesta es la señal de entrada en la estrategia.
La estrategia de rebote de la EMA sólo se utiliza cuando se determina una reversión de los precios, lo que evita que la operación de rebote se bloquee.
Debido a la utilización de las medias móviles de índices, que permiten suavizar eficazmente los datos de precios y filtrar el ruido del mercado, el retroceso de la estrategia es pequeño y los rendimientos históricos son mejores.
La estrategia de rebote de EMA depende únicamente de las medias móviles, es muy simple y directa, fácil de entender para los novatos; al mismo tiempo, los parámetros de los períodos de EMA se pueden ajustar de manera flexible para adaptarse a diferentes variedades.
A menudo hay falsas rupturas densas cerca de la línea EMA, que pueden provocar señales erróneas. Se requiere ajustar los parámetros EMA para filtrar estos ruidos.
La estrategia es esencialmente una operación de avance. No se puede predecir el punto de inflexión de los precios, solo se puede perseguir la tendencia.
Los puntos de parada cercanos a la media móvil a veces se superan, lo que genera pérdidas ampliadas. Esto requiere el uso de un método de parada más flexible.
Se pueden agregar otros indicadores como el RSI, el MACD y otros para confirmar la inversión de precios y filtrar las falsas señales.
Se pueden utilizar métodos de deterioro más flexibles, como el tiempo de detención y el deterioro por vibración, para reducir el riesgo de ser derribado.
Optimización de los parámetros del ciclo EMA para encontrar la combinación óptima de parámetros. También se puede hacer que los parámetros EMA cambien dinámicamente para seguir el ciclo del mercado.
La estrategia de rebote de la media móvil es una estrategia de seguimiento de tendencias sencilla y práctica. Se opera de forma progresiva, tiene pequeñas retrocesos y es fácil de entender. Al mismo tiempo, existe un cierto riesgo de falsas señales y riesgo de parada. Se puede optimizar la estrategia para que sea una estrategia cuantitativa estable y confiable a través de una mejor combinación de indicadores, métodos de parada y opciones de parámetros.
/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
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/
// © tweakerID
// Simple strategy that checks for price bounces over an Exponential Moving Average. If the CLOSE of the candle bounces
// back from having it's LOW below the EMA, then it's a Bull Bounce. If the CLOSE of the candle bounces down from having it's
// high above the EMA, then it's a Bear Bounce. This logic can be reverted.
//@version=4
strategy("EMA Bounce", overlay=true,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
initial_capital=10000,
commission_value=0.04,
calc_on_every_tick=false,
slippage=0)
direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))
/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")
i_EMA=input(20, title="EMA Length")
/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")
// Backtester General Inputs
i_SL=input(true, title="Use Swing Stop Loss and Take Profit")
i_SPL=input(defval=10, title="Swing Point Loopback")
i_PercIncrement=input(defval=.2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_TPRRR = input(1.2, step=.1, title="Take Profit Risk Reward Ratio")
// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1]
or strategy.position_size < strategy.position_size[1]
// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na
entry_HH_price = strategy.position_size < 0 ? HH_price : na
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR
/////////////////////// STRATEGY LOGIC /////////////////////////////////////////
EMA=ema(close, i_EMA)
LowAboveEMA=low > EMA
LowBelowEMA=low < EMA
HighAboveEMA=high > EMA
HighBelowEMA=high < EMA
BullBounce=LowAboveEMA[1] and LowBelowEMA and close > EMA //and close > open
BearBounce=HighBelowEMA[1] and HighAboveEMA and close < EMA //and close < open
plot(EMA)
BUY=BullBounce
SELL=BearBounce
//Inputs
DPR=input(false, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")
// Entries
if reverse
if not DPR
strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
else
strategy.entry("long", strategy.long, when=SELL)
strategy.entry("short", strategy.short, when=BUY)
else
if not DPR
strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
else
strategy.entry("long", strategy.long, when=BUY)
strategy.entry("short", strategy.short, when=SELL)
SL=entry_LL_price
SSL=entry_HH_price
TP=tp
STP=stp
strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)
/////////////////////// PLOTS //////////////////////////////////////////////////
plot(strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar,
color=color.green, title="Bullish Setup", transp=80, size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar,
color=color.red, title="Bearish Setup", transp=80, size=size.auto)