Стратегия торговли двойным скользящим средним, тройным экспоненциальным индикатором

Автор:Чао Чжан, Дата: 2023-12-15 15:39:45
Тэги:

img

Обзор

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

Принципы

Эта стратегия состоит главным образом из четырех частей:

  1. Индикатор двойной скользящей средней: рассчитывает экспоненциальные скользящие средние (EMA) на 50 и 100 периодов соответственно.

  2. Тройной экспоненциальный индикатор: рассчитывает 50-периодные, 100-периодные и 200-периодные экспоненциальные скользящие средние для определения направления тренда рынка. Когда 50EMA> 100EMA> 200EMA, это бычий рынок. Когда 50EMA<100EMA<200EMA, это медвежий рынок.

  3. Стохастический индикатор: рассчитывает 6-дневные значения K и D RSI для определения условий перекупления и перепродажи. Когда значение K переходит выше значения D, оно перепродается. Когда пересекается ниже, оно перекуплено.

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

Преимущества

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

Риски и контрмеры

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

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

  2. Включить больше показателей для операций CANCEL, прекращая текущие сделки, когда рынок показывает резкие колебания.

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

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

К основным аспектам, в которых эта стратегия может быть оптимизирована, относятся:

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

  2. Увеличить объем, MACD и другие оценки, чтобы избежать аномальных движений цен, вызывающих неправильные сигналы.

  3. Лучше подтвердить тенденции с помощью моделей свечей, чтобы избежать неправильных сигналов после краткосрочных спадов.

  4. Расширьте его до большего количества видов, таких как акции, форекс и проверьте адаптивность стратегии.

  5. Включить показатели VIX для определения общей волатильности рынка и контроля размеров позиций.

Заключение

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


/*backtest
start: 2023-12-07 00:00:00
end: 2023-12-12 08:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='5212 EMA Strategy', shorttitle='5212 EMA', overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

//**Backtest Date sof
useStartPeriodTime  = input.bool(true                       , 'Start Date & Time'   , group='Date Range'    , inline='Start Period')
startPeriodTime     = input(timestamp('16 Apr 2021')   , ''                    , group='Date Range'    , inline='Start Period')
useEndPeriodTime    = input.bool(false                      , 'End Date & Time'     , group='Date Range'    , inline='End Period')
endPeriodTime       = input(timestamp('31 Dec 2222')   , ''                    , group='Date Range'    , inline='End Period')
enableHighlight     = input.bool(false                      , 'Highlight'           , group='Date Range'    , inline='Highlight')
highlightType       = input.string('Anchors'                , ''                    , group='Date Range'    , inline='Highlight'    , options=['Anchors', 'Background'])
highlightColor      = input.color(color.white               , ''                    , group='Date Range'    , inline='Highlight')
start = useStartPeriodTime ? startPeriodTime >= time : false
end = useEndPeriodTime ? endPeriodTime <= time : false
calcPeriod = true
// var line startAnchor    = line.new(na, na, na, na, xloc.bar_time, extend.both, highlightColor, width=2)
// var line endAnchor      = line.new(na, na, na, na, xloc.bar_time, extend.both, highlightColor, width=2)
// useBgcolor = false
// if enableHighlight
//     if highlightType == 'Anchors'
//         if useStartPeriodTime
//             line.set_xy1(startAnchor, startPeriodTime, low)
//             line.set_xy2(startAnchor, startPeriodTime, high)
//         if useEndPeriodTime
//             line.set_xy1(endAnchor, calcPeriod ? time : line.get_x1(endAnchor), low)
//             line.set_xy2(endAnchor, calcPeriod ? time : line.get_x1(endAnchor), high)

//     if highlightType == 'Background'
//         useBgcolor := true
//         useBgcolor

// bgcolor(useBgcolor and calcPeriod ? color.new(highlightColor,90) : na, editable=false)
//**Backtest Date eof

src         =input(close    , 'Source'      , group='Support')
showEMA     = input(true    , 'Show EMA'    , group='Support')

//**Stochastic RSI sof
smoothK     = input.int(6   , "K"               , group='Stochastic RSI'    , minval=1)
smoothD     = input.int(6   , "D"               , group='Stochastic RSI'    , minval=1)
lengthRSI   = input.int(28  , "RSI Length"      , group='Stochastic RSI'    , minval=1)
lengthStoch = input.int(28  , "Stoch Length"    , group='Stochastic RSI'    , minval=1)

rsi1    = ta.rsi(src, lengthRSI)
k       = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d       = ta.sma(k, smoothD)
//**STochastic RSI eof

//** EMA sof
emain01     = input.int(50  , "EMAma Girang"    , group='Moving Average Exponential'    , minval=1)
emain02     = input.int(100 , "EMAma Muda"      , group='Moving Average Exponential'    , minval=1)
emain03     = input.int(200 , "EMAma Tua"       , group='Moving Average Exponential'    , minval=1)

ema01 = ta.ema(src, emain01)
ema02 = ta.ema(src, emain02)
ema03 = ta.ema(src, emain03)
plot(showEMA ? ema01 : na, 'EMAma Girang'   , color = color.new(color.orange, 0))
plot(showEMA ? ema02 : na, 'EMAma Muda'     , color = color.new(color.blue, 0))
plot(showEMA ? ema03 : na, 'EMAma Tua'      , color = color.new(color.red, 0))
//** EMA eof

//**Condition sof
emaLong     = ema01 > ema02 and ema02 > ema03 and low > ema03
emaShort    = ema01 < ema02 and ema02 < ema03 and high < ema03

longCond    = ta.crossover(k,d) and k <= 23 and emaLong
shortCond   = ta.crossunder(k,d) and k >= 77 and emaShort

longClose   = ta.crossunder(k,d) and k <= 77
shortClose  = ta.crossover(k,d) and k >= 23
longCross   = ta.crossover(ema01, ema02)
shortCross  = ta.crossunder(ema01, ema02)
//**Condition eof

//**Strategy sof
if calcPeriod and longCond
    strategy.entry('long', strategy.long, when=longCond, comment='EN Long')
strategy.close('long', when=shortClose, comment='EX Long')
strategy.close('long', when=shortCross, comment='MD Short')

if calcPeriod and shortCond
    strategy.entry('short', strategy.short, when=shortCond, comment='EN Short')
strategy.close('short', when=longClose, comment='EX Short')
strategy.close('short', when=longCross, comment='MD Long')

if calcPeriod == false and ta.crossover(ema01, ema02) or ta.crossunder(ema01, ema02)
    strategy.cancel('long')
    strategy.cancel('short')
//**Strategy eof

//**Label sof
entryText       = str.tostring(strategy.position_avg_price, '##.###')
longText    = 'Long Entry : ' + entryText 
shortText   = 'Short Entry : ' + entryText
noTrade     = 'Sleeping Mode'

LongTrade = strategy.position_size > 0
ShortTrade = strategy.position_size < 0

Tekslabel = LongTrade ? longText : ShortTrade ? shortText : noTrade

xPosition = timenow + math.round(ta.change(time)*1)
yPosition = ta.highest(1)
labelColor = LongTrade ? color.new(color.aqua, 0) : ShortTrade ? color.new(color.red, 0) : color.new(color.gray, 0)
textColor   = LongTrade ? color.new(color.black, 0) : ShortTrade ? color.new(color.white, 0) : color.new(color.white, 0)

// lab_l = label.new(
//           xPosition, yPosition, Tekslabel,
//           color=labelColor, 
//           textcolor=textColor, 
//           style =  label.style_label_left,
//           textalign=text.align_left,
//           xloc=xloc.bar_time, yloc = yloc.price)

// label.delete(lab_l[1])
//**Strategy eof


Больше