Эта стратегия использует двойные индикаторы скользящей средней и тройные экспоненциальные индикаторы скользящей средней, в сочетании со стохастическими индикаторами, для формирования относительно стабильной и надежной стратегии отслеживания тренда.
Эта стратегия состоит главным образом из четырех частей:
Индикатор двойной скользящей средней: рассчитывает экспоненциальные скользящие средние (EMA) на 50 и 100 периодов соответственно.
Тройной экспоненциальный индикатор: рассчитывает 50-периодные, 100-периодные и 200-периодные экспоненциальные скользящие средние для определения направления тренда рынка. Когда 50EMA> 100EMA> 200EMA, это бычий рынок. Когда 50EMA<100EMA<200EMA, это медвежий рынок.
Стохастический индикатор: рассчитывает 6-дневные значения K и D RSI для определения условий перекупления и перепродажи. Когда значение K переходит выше значения D, оно перепродается. Когда пересекается ниже, оно перекуплено.
Торговые сигналы: только когда индикатор двойной скользящей средней генерирует сигнал одновременно с тем, как рынок соответствует бычьему или медвежьему состоянию тройной экспоненциальной скользящей средней, и стохастический индикатор не показывает перекуп или перепродажу, будут выпущены настоящие торговые ордера.
Эта стратегия сочетает в себе преимущества скользящих средних показателей и стохастических показателей. При выдаче торговых сигналов она учитывает как суждение о направлении тренда, так и состояние перекупленности/перепроданности рынка, тем самым более эффективно фильтруя шум для отслеживания более четких тенденций. Кроме того, она использует тройную экспоненциальную скользящую среднюю для определения общей тенденции, что делает сигналы более надежными. Эта стратегия проста, проста в реализации и легко оптимизируется.
Наибольший риск этой стратегии заключается в том, что она опирается на суждения индикаторов. Когда индикатор дает неправильные сигналы, это может легко привести к неудачным сделкам. Кроме того, при использовании длинных циклов скользящих средних для определения общей тенденции, некоторые краткосрочные возможности также могут быть упущены. Основные контрмеры риска следующие:
Оптимизировать параметры показателей и корректировать комбинации циклов двойных скользящих средних и тройных экспоненциальных скользящих средних, чтобы они лучше соответствовали характеристикам рынка.
Включить больше показателей для операций CANCEL, прекращая текущие сделки, когда рынок показывает резкие колебания.
Используйте вспомогательные краткосрочные бычьи стратегии, чтобы использовать краткосрочные возможности на долгосрочных бычьих рынках.
К основным аспектам, в которых эта стратегия может быть оптимизирована, относятся:
Корректировка параметров цикла двойной скользящей средней и тройной экспоненциальной скользящей средней для оптимизации показателей
Увеличить объем, MACD и другие оценки, чтобы избежать аномальных движений цен, вызывающих неправильные сигналы.
Лучше подтвердить тенденции с помощью моделей свечей, чтобы избежать неправильных сигналов после краткосрочных спадов.
Расширьте его до большего количества видов, таких как акции, форекс и проверьте адаптивность стратегии.
Включить показатели 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