Esta estrategia utiliza principalmente la consolidación formada por las líneas de promedio móvil HMA y EMA para determinar el momento de compra.
La estrategia también combina el indicador RSI para detectar condiciones de sobrecompra y sobreventa.
Esta estrategia utiliza un sistema de promedio móvil construido con EMA y HMA de 200 períodos. Entre ellos, el indicador HMA es un indicador de promedio móvil más sensible diseñado sobre la base de EMA. Cuando HMA cruza por encima de EMA, significa que la etapa de consolidación ha terminado y el precio de las acciones comienza a subir. En este momento, si el indicador RSI no muestra sobrecompra, se genera una señal de compra.
En el caso de una posición existente, si el precio de las acciones vuelve a caer y el HMA vuelve a cruzar por debajo de la EMA, lo que indica el comienzo de una nueva consolidación, toda la posición se cerrará.
La lógica de transacción de esta estrategia es bastante simple, basándose principalmente en los cruces largos y cortos de HMA y EMA, combinados con los máximos y mínimos del RSI, para formar una estrategia de negociación relativamente robusta.
La mayor ventaja de esta estrategia es que mediante la utilización del patrón de negociación de consolidación de EMA y HMA, la mayoría de las False Breaks se pueden filtrar, mejorando así la tasa de ganancia. Al mismo tiempo, el auxiliar del indicador RSI también puede controlar los riesgos de manera efectiva. La combinación de los dos hace que esta estrategia sea muy adecuada para mercados de consolidación y volatilidad.
Además, esta estrategia sólo utiliza 3 indicadores y la lógica es simple, lo que facilita la optimización de parámetros y backtest, lo que favorece la verificación y mejora de las estrategias.
Aunque esta estrategia tiene algunas ventajas, todavía hay algunos riesgos a tener en cuenta. Por ejemplo, el tiempo de retención puede ser relativamente largo, requiriendo fondos suficientes para apoyar. Si se encuentra con un período de consolidación lateral, no puede salir rápidamente con un stop loss, lo que fácilmente conduce a la situación de pérdidas en expansión.
Además, esta estrategia se basa principalmente en indicadores de promedio móvil. Si hay un avance anormal en los precios, las medidas de stop-loss pueden no poder tener efecto, lo que traerá mayores riesgos. Además, los ajustes de parámetros también afectarán el rendimiento de la estrategia y requerirán pruebas extensas para encontrar parámetros óptimos.
Teniendo en cuenta los riesgos anteriores, esta estrategia puede optimizarse en los siguientes aspectos:
Combinar indicadores de volatilidad para ajustar dinámicamente las posiciones en función de la volatilidad del mercado.
Aumentar los juicios de los indicadores de tendencia para evitar operaciones innecesarias de reversión.
Optimizar los parámetros de la media móvil para acercarlos a las características actuales del mercado.
Utilice paradas de tiempo para evitar pérdidas individuales de gran tamaño.
En general, se trata de una estrategia de consolidación y volatilidad relativamente clásica y simple. Se utiliza principalmente para el comercio a corto y mediano plazo de índices bursátiles y acciones calientes, y puede obtener valores alfa relativamente estables.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h 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(title="EMA_HMA_RSI_Strategy", overlay=true, pyramiding=2, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD) //default_qty_value=10, default_qty_type=strategy.fixed, //longCondition = crossover(sma(close, 14), sma(close, 28)) //if (longCondition) //strategy.entry("My Long Entry Id", strategy.long) //shortCondition = crossunder(sma(close, 14), sma(close, 28)) //if (shortCondition) // strategy.entry("My Short Entry Id", strategy.short) //HMA HMA(src1, length1) => wma(2 * wma(src1, length1/2) - wma(src1, length1), round(sqrt(length1))) var stopLossVal=0.00 //variables BEGIN length=input(200,title="EMA and HMA Length") //square root of 13 rsiLength=input(13, title="RSI Length") takePartialProfits = input(true, title="Take Partial Profits (if this selected, RSI 13 higher reading over 80 is considered for partial closing ) ") stopLoss = input(title="Stop Loss%", defval=8, minval=1) //variables END //RSI rsi13=rsi(close,rsiLength) ema200=ema(close,length) hma200=HMA(close,length) //exitOnAroonOscCrossingDown = input(true, title="Exit when Aroon Osc cross down zero ") // Drawings //Aroon oscillator arronUpper = 100 * (highestbars(high, length+1) + length)/length aroonLower = 100 * (lowestbars(low, length+1) + length)/length aroonOsc = arronUpper - aroonLower aroonMidpoint = 0 //oscPlot = plot(aroonOsc, color=color.green) //midLine= plot(aroonMidpoint, color=color.green) //topLine = plot(90,style=plot.style_circles, color=color.green) //bottomLine = plot(-90,style=plot.style_circles, color=color.red) //fill(oscPlot, midLine, color=aroonOsc>0?color.green:color.red, transp=50) //fill(topLine,bottomLine, color=color.blue) //fill(topLine,oscPlot, color=aroonOsc>90?color.purple:na, transp=25) // RSI //plot(rsi13, title="RSI", linewidth=2, color=color.purple) //hline(50, title="Middle Line", linestyle=hline.style_dotted) //obLevel = hline(80, title="Overbought", linestyle=hline.style_dotted) //osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted) //fill(obLevel, osLevel, title="Background", color=rsi13 >=30 ? color.green:color.purple, transp=65) // longTermRSI >=50 hullColor = hma200 > hma200[2] ? #00ff00 : #ff0000 plot(hma200, title="HULL 200", color=hullColor, transp=25) plot(ema200, title="EMA 200", color=color.orange) //Entry-- strategy.initial_capital = 50000 strategy.entry(id="Long Entry", comment="LE", qty=(strategy.initial_capital * 0.10)/close, long=true, when=strategy.position_size<1 and hma200 < ema200 and hma200 > hma200[2] and rsi13<70 ) // // aroonOsc<0 //Add if(strategy.position_size>=1 and close < strategy.position_avg_price and ( crossover(rsi13,30) or crossover(rsi13,40) ) ) // hma200 < ema200 and hma200 > hma200[2] and hma200[2] < hma200[3] ) //and crossover(rsi13,30) aroonOsc<0 //and hma200 > hma200[2] and hma200[2] <= hma200[3] //crossover(rsi13,30) qty1=(strategy.initial_capital * 0.10)/close //stopLossVal:= abs(strategy.position_size)>1 ? ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 strategy.entry(id="Long Entry", comment="Add", qty=qty1, long=true ) //crossover(close,ema34) //and close>ema34 //crossover(rsi5Val,rsiBuyLine) -- SL="+tostring(stopLossVal, "####.##") //stopLossVal:= abs(strategy.position_size)>1 ? strategy.position_avg_price*(1-0.5) : 0.00 stopLossVal:= abs(strategy.position_size)>1 ? ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 //stopLossVal:= abs(strategy.position_size)>1 ? strategy.position_avg_price*(1-stopLoss*0.01) : 0.00 barcolor(color=strategy.position_size>=1? rsi13>80 ? color.purple: color.blue:na) //close partial if(takePartialProfits==true) strategy.close(id="Long Entry", comment="Partial X points="+tostring(close - strategy.position_avg_price, "####.##"), qty_percent=20 , when=abs(strategy.position_size)>=1 and crossunder(rsi13, 80) and close > strategy.position_avg_price ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close All //if(exitOnAroonOscCrossingDown) // strategy.close(id="Long Entry", comment="Exit All points="+tostring(close - strategy.position_avg_price, "####.##"), when=abs(strategy.position_size)>=1 and crossunder(aroonOsc, 0) ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close<ema89 //close All on stop loss strategy.close(id="Long Entry", comment="Stoploss X points="+tostring(close - strategy.position_avg_price, "####.##"), when=abs(strategy.position_size)>=1 and close < stopLossVal ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close<ema89 strategy.close(id="Long Entry", comment="hmaXema X points="+tostring(close - strategy.position_avg_price, "####.##"), when=abs(strategy.position_size)>=1 and close > strategy.position_avg_price and crossunder(hma200,ema200) ) //close<ema55 and rsi5Val<20 //ema34<ema55 //close<ema89