Стратегия консолидации движущейся средней

Автор:Чао Чжан, Дата: 2024-01-25 11:39:00
Тэги:

img

Обзор

Эта стратегия в основном использует консолидацию, сформированную скользящими средними линиями HMA и EMA, для определения времени покупки. Когда HMA пересекает EMA, считается, что консолидация закончилась и формируется новая восходящая тенденция, поэтому покупают, когда HMA пересекает EMA в то же время.

Стратегия также сочетает в себе индикатор RSI для обнаружения условий перекупления и перепродажи.

Принцип стратегии

Эта стратегия использует скользящую среднюю систему, построенную с 200-периодным EMA и HMA. Среди них индикатор HMA является более чувствительным скользящим средним индикатором, разработанным на основе EMA. Когда HMA пересекает EMA, это означает, что этап консолидации закончился, и цена акций начинает расти. В это время, если индикатор RSI не показывает перекуп, генерируется сигнал покупки.

В случае существующей позиции, если цена акций опять падает и HMA снова пересекается ниже EMA, что указывает на начало новой консолидации, вся позиция будет закрыта.

Логика сделки этой стратегии довольно проста, в основном опираясь на длинные и короткие пересечения HMA и EMA, в сочетании с максимумами и минимумами RSI, чтобы сформировать относительно надежную торговую стратегию.

Анализ преимуществ

Наибольшее преимущество этой стратегии заключается в том, что, используя консолидационную торговую модель EMA и HMA, большинство ложных перерывов можно отфильтровать, тем самым улучшая уровень прибыли. В то же время вспомогательный индикатор RSI также может эффективно контролировать риски. Комбинация двух делает эту стратегию очень подходящей для консолидации и волатильности рынков.

Кроме того, эта стратегия использует только 3 индикатора, а логика проста, что позволяет легко оптимизировать параметры и бэкстест, что способствует проверке и улучшению стратегий.

Анализ рисков

Хотя эта стратегия имеет некоторые преимущества, все же есть некоторые риски, которые следует отметить. Например, время удержания может быть относительно длинным, требуя достаточных средств для поддержки. Если он сталкивается с периодом боковой консолидации, он не может быстро выйти со стоп-лосом, что легко приводит к ситуации расширения потерь.

Кроме того, эта стратегия в основном опирается на показатели скользящих средних. Если произойдет аномальный прорыв цен, меры стоп-лосса могут не иметь эффекта, что повлечет за собой большие риски. Кроме того, настройки параметров также повлияют на эффективность стратегии и потребуют обширного тестирования для поиска оптимальных параметров.

Руководство по оптимизации

Учитывая вышеуказанные риски, эта стратегия может быть оптимизирована в следующих аспектах:

  1. Сочетание показателей волатильности для динамической корректировки позиций на основе волатильности рынка.

  2. Увеличить оценку показателей тренда, чтобы избежать ненужной обратной торговли.

  3. Оптимизировать параметры скользящих сред, чтобы приблизить их к текущим рыночным характеристикам.

  4. Используйте временные остановки, чтобы избежать чрезмерных потерь.

Резюме

В целом, это относительно классическая простая стратегия консолидации и волатильности. Она в основном используется для краткосрочной и среднесрочной торговли фондовыми индексами и горячими акциями, и может получить относительно стабильные альфа-значения. С оптимизацией параметров и усилением мер контроля рисков производительность этой стратегии все еще имеет большое пространство для улучшения.


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

Больше