Estratégia de consolidação da média móvel de ímpeto

Autora:ChaoZhang, Data: 2024-01-25 11:39:00
Tags:

img

Resumo

Esta estratégia utiliza principalmente a consolidação formada pelas linhas médias móveis HMA e EMA para determinar o momento da compra.

A estratégia também combina o indicador RSI para detectar condições de sobrecompra e sobrevenda.

Princípio da estratégia

Esta estratégia usa um sistema de média móvel construído com EMA e HMA de 200 períodos. Entre eles, o indicador HMA é um indicador de média móvel mais sensível projetado com base na EMA. Quando o HMA cruza acima da EMA, isso significa que o estágio de consolidação terminou e o preço das ações começa a subir. Neste momento, se o indicador RSI não mostrar sobrecompra, um sinal de compra é gerado.

No caso de uma posição existente, se o preço da ação cair novamente e a HMA cruzar novamente abaixo da EMA, indicando o início de uma nova consolidação, toda a posição será fechada.

A lógica de transacção desta estratégia é bastante simples, baseando-se principalmente nas cruzamentos longos e curtos de HMA e EMA, combinados com os altos e baixos do RSI, para formar uma estratégia de negociação relativamente robusta.

Análise das vantagens

A maior vantagem desta estratégia é que, utilizando o padrão de negociação de consolidação da EMA e HMA, a maioria das False Breaks pode ser filtrada, melhorando assim a taxa de lucro. Ao mesmo tempo, o auxiliar do indicador RSI também pode controlar efetivamente os riscos. A combinação dos dois torna esta estratégia muito adequada para mercados de consolidação e volatilidade.

Além disso, esta estratégia utiliza apenas 3 indicadores e a lógica é simples, o que facilita a otimização de parâmetros e backtest, o que favorece a verificação e melhoria de estratégias.

Análise de riscos

Embora essa estratégia tenha algumas vantagens, ainda há alguns riscos a serem notados. Por exemplo, o tempo de detenção pode ser relativamente longo, exigindo fundos suficientes para suportar.

Além disso, esta estratégia depende principalmente de indicadores de média móvel. Se houver uma ruptura anormal nos preços, as medidas de stop-loss podem não ser capazes de entrar em vigor, o que trará maiores riscos. Além disso, as configurações de parâmetros também afetarão o desempenho da estratégia e exigirão testes extensos para encontrar parâmetros ideais.

Orientações de otimização

Tendo em conta os riscos acima referidos, esta estratégia pode ser otimizada nos seguintes aspectos:

  1. Combinar indicadores de volatilidade para ajustar dinamicamente as posições com base na volatilidade do mercado.

  2. Aumentar os julgamentos dos indicadores de tendência para evitar negociações de reversão desnecessárias.

  3. Otimizar os parâmetros da média móvel para aproximá-los das características actuais do mercado.

  4. Use paradas de tempo para evitar perdas individuais de grande porte.

Resumo

No geral, esta é uma estratégia de consolidação e volatilidade relativamente clássica e simples. É usada principalmente para negociação de índices de ações e ações quentes de curto e médio prazo, e pode obter valores alfa relativamente estáveis. Com a otimização de parâmetros e o fortalecimento das medidas de controle de risco, o desempenho desta estratégia ainda tem muito espaço para melhoria.


/*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
    

Mais.