
La estrategia utiliza principalmente el movimiento promedio HMA y la formación de la línea de equilibrio EMA para determinar el momento de comprar. Cuando el HMA se lleva a cabo la EMA se considera el final de la liquidación, la formación de una nueva tendencia al alza, por lo tanto, comprar al mismo tiempo que el EMA se lleva a cabo en el HMA.
La estrategia se combina con el indicador RSI para detectar sobrecompras y sobreventas. Se permite comprar cuando el RSI está por debajo de 70 y se considera una parada parcial cuando el RSI está por encima de 80.
La estrategia utiliza 200 EMA y HMA para construir un sistema de medias lineal. En este caso, el indicador HMA es un indicador de media móvil más sensible, diseñado para mejorar la EMA. Cuando el HMA lleva el EMA, indica que la fase de reajuste ha terminado y el precio de las acciones comienza a subir.
En el caso de que se haya creado una posición, si el precio de las acciones retrocede, la HMA vuelve a bajar el EMA, lo que indica que comienza una nueva liquidación, la posición está completamente en equilibrio. Al mismo tiempo, si el RSI se eleva a 80, se detendrá parcialmente el 20% para evitar pérdidas.
La lógica de negociación de esta estrategia es más simple, consistente principalmente en el cruce múltiple de HMA y EMA, combinado con el juicio de los altos y bajos del RSI, para formar una estrategia de negociación más sólida.
La mayor ventaja de esta estrategia es que se puede filtrar la mayor parte de los False Break utilizando la configuración de operaciones de balanceo de EMA y HMA, lo que mejora la rentabilidad. Al mismo tiempo, el auxiliar del indicador RSI también puede controlar el riesgo de manera efectiva, y la combinación de ambos hace que esta estrategia sea ideal para los mercados de balanceo.
Además, la estrategia utiliza solo 3 indicadores y es lógicamente simple, lo que facilita la optimización y retroalimentación de sus parámetros, lo que facilita la verificación y mejora de la estrategia.
A pesar de las ventajas de esta estrategia, existen algunos riesgos a tener en cuenta. Por ejemplo, el tiempo de tenencia de la posición puede ser más largo y requiere un apoyo financiero suficiente. Si se encuentra en un momento de liquidación horizontal, no se puede detener rápidamente la salida de pérdidas, y es susceptible a la expansión de las pérdidas.
Además, la estrategia se basa principalmente en el indicador de la línea media, y si el precio tiene una ruptura anormal, las medidas de detención pueden no funcionar a tiempo y conllevar un mayor riesgo. Además, la configuración de los parámetros también puede afectar el rendimiento de la estrategia, y se necesita una gran cantidad de pruebas para encontrar los parámetros óptimos.
Teniendo en cuenta los riesgos mencionados, la estrategia puede ser optimizada en los siguientes aspectos:
Combinado con un indicador de volatilidad, ajuste dinámico de posiciones según las fluctuaciones del mercado.
Aumentar el conocimiento de los indicadores de tendencia y evitar inversiones innecesarias.
Optimizar los parámetros de las medias móviles para que se acerquen más a las características actuales del mercado.
La adopción de la pérdida de tiempo evita al máximo el problema de las pérdidas individuales excesivas.
En general, esta estrategia es una estrategia de balance simple y relativamente clásica. Se aplica principalmente a las operaciones a corto y mediano plazo de los índices de acciones y las acciones populares, obteniendo un valor de alfa relativamente estable. Con la optimización de los parámetros y el fortalecimiento de las medidas de control de riesgo, el rendimiento de esta estrategia tiene un gran espacio para mejorar.
/*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