Тенденция в течение нескольких временных рамок, основанная на EMA и стохастическом RSI

Автор:Чао Чжан, Дата: 2024-03-08 17:32:38
Тэги:

img

Обзор стратегии

Стратегия, названная EMA и Stochastic RSI based Multi-timeframe Trend Following Trading Strategy, использует две экспоненциальные скользящие средние (EMAs) с разными периодами и индикатор Stochastic RSI для улавливания средне- и долгосрочных рыночных тенденций.

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

  1. Вычислить быструю и медленную EMA. Параметр по умолчанию для быстрой EMA составляет 12, а для медленной EMA - 25. Они могут быть скорректированы в зависимости от характеристик рынка и частоты торговли.

  2. Определить рост/медвежий тренд:

  • Когда быстрая EMA пересекает медленную EMA, она генерирует бычий сигнал.
  • Когда быстрая EMA пересекается ниже медленной EMA, она генерирует медвежий сигнал.
  1. Подтверждение тренда: после появления сигнала бычьего/медвежьего, для подтверждения тренда требуется 2 последовательных свечи бычьего/медвежьего. Это помогает фильтровать ложные сигналы.

  2. Используйте стохастический RSI в качестве вспомогательного суждения:

  • Когда стохастический показатель RSI %K пересекает линию выше линии %D, а %K ниже 20, он генерирует сигнал перепродажи, указывающий на потенциальное бычье изменение.
  • Когда стохастический показатель RSI %K пересекает линию ниже линии %D, а %K превышает 80, он генерирует сигнал перекупленности, указывающий на потенциальное понижение.
  1. Правила торговли:
  • Открыть длинную позицию, когда EMA генерируют бычий сигнал, а Stochastic RSI не находится на перекупленной территории
  • Открыть короткую позицию, когда EMA генерируют медвежий сигнал, а Stochastic RSI не находится в зоне перепроданности

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

  1. Используя два EMA с разными периодами, стратегия может лучше сбалансировать чувствительность и надежность улавливания трендов.

  2. Механизм подтверждения тренда может эффективно отфильтровать большинство ложных сигналов и улучшить показатель выигрыша.

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

  4. Логика стратегии проста, с небольшим количеством параметров, что делает ее легкой для понимания и реализации.

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

  1. Уровень EMA является отстающим показателем и может привести к значительному сдвигу в начале перемены тренда.

  2. Стратегии, следующие за трендом, как правило, неэффективны на нестабильных рынках.

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

  4. Фиксированные параметры могут не адаптироваться ко всем рыночным условиям, что требует динамических корректировок на основе рыночных характеристик.

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

  1. Внедрение показателей волатильности, таких как ATR, для динамической корректировки параметров EMA и адаптации к различным рыночным ритмам.

  2. Добавьте суждение для рынков с ограниченным диапазоном, таких как объединение ширины полос Боллинджера, чтобы избежать частых сделок в нестабильных условиях.

  3. Для повышения надежности сигнала необходимо добавлять дополнительные критерии к стохастическому RSI, такие как изменения объема.

  4. Рассмотреть рыночные корреляции и внедрить межрыночные сигналы для множества активов для повышения устойчивости системы к риску.

Резюме

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


/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('[Jacky] Trader XO Macro Trend Scanner', overlay=true)

// Variables
var ok = 0
var countBuy = 0
var countSell = 0
src = input(close, title='OHLC Type')
i_fastEMA = input(12, title='Fast EMA')
i_slowEMA = input(25, title='Slow EMA')
i_defEMA = input(25, title='Consolidated EMA')

// Allow the option to show single or double EMA
i_bothEMAs = input(title='Show Both EMAs', defval=true)

// Define EMAs
v_fastEMA = ta.ema(src, i_fastEMA)
v_slowEMA = ta.ema(src, i_slowEMA)
v_biasEMA = ta.ema(src, i_defEMA)

// Color the EMAs
emaColor = v_fastEMA > v_slowEMA ? color.green : v_fastEMA < v_slowEMA ? color.red : #FF530D

// Plot EMAs
plot(i_bothEMAs ? na : v_biasEMA, color=emaColor, linewidth=3, title='Consolidated EMA')
plot(i_bothEMAs ? v_fastEMA : na, title='Fast EMA', color=emaColor)
plot(i_bothEMAs ? v_slowEMA : na, title='Slow EMA', color=emaColor)

// Colour the bars
buy = v_fastEMA > v_slowEMA
sell = v_fastEMA < v_slowEMA

if buy
    countBuy += 1
    countBuy

if buy
    countSell := 0
    countSell

if sell
    countSell += 1
    countSell

if sell
    countBuy := 0
    countBuy

buysignal = countBuy < 2 and countBuy > 0 and countSell < 1 and buy and not buy[1]
sellsignal = countSell > 0 and countSell < 2 and countBuy < 1 and sell and not sell[1]

barcolor(buysignal ? color.green : na)
barcolor(sellsignal ? color.red : na)

// Strategy backtest
if (buysignal)
    strategy.entry("Buy", strategy.long)

if (sellsignal)
    strategy.entry("Sell", strategy.short)

// Plot Bull/Bear

plotshape(buysignal, title='Bull', text='Bull', style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.black, 0), size=size.tiny)
plotshape(sellsignal, title='Bear', text='Bear', style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.black, 0), size=size.tiny)

bull = countBuy > 1
bear = countSell > 1

barcolor(bull ? color.green : na)
barcolor(bear ? color.red : na)

// Set Alerts

alertcondition(ta.crossover(v_fastEMA, v_slowEMA), title='Bullish EMA Cross', message='Bullish EMA crossover')
alertcondition(ta.crossunder(v_fastEMA, v_slowEMA), title='Bearish EMA Cross', message='Bearish EMA Crossover')

// Stoch RSI code

smoothK = input.int(3, 'K', minval=1)
smoothD = input.int(3, 'D', minval=1)
lengthRSI = input.int(14, 'RSI Length', minval=1)
lengthStoch = input.int(14, 'Stochastic Length', minval=1)

rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)

bandno0 = input.int(80, minval=1, title='Upper Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')
bandno2 = input.int(50, minval=1, title='Middle Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')
bandno1 = input.int(20, minval=1, title='Lower Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')

// Alerts

crossoverAlertBgColourMidOnOff = input.bool(title='Crossover Alert Background Colour (Middle Level) [ON/OFF]', group='Crossover Alerts', defval=false)
crossoverAlertBgColourOBOSOnOff = input.bool(title='Crossover Alert Background Colour (OB/OS Level) [ON/OFF]', group='Crossover Alerts', defval=false)

crossoverAlertBgColourGreaterThanOnOff = input.bool(title='Crossover Alert >input [ON/OFF]', group='Crossover Alerts', defval=false)
crossoverAlertBgColourLessThanOnOff = input.bool(title='Crossover Alert <input [ON/OFF]', group='Crossover Alerts', defval=false)

maTypeChoice = input.string('EMA', title='MA Type', group='Moving Average', options=['EMA', 'WMA', 'SMA', 'None'])
maSrc = input.source(close, title='MA Source', group='Moving Average')
maLen = input.int(200, minval=1, title='MA Length', group='Moving Average')

maValue = if maTypeChoice == 'EMA'
    ta.ema(maSrc, maLen)
else if maTypeChoice == 'WMA'
    ta.wma(maSrc, maLen)
else if maTypeChoice == 'SMA'
    ta.sma(maSrc, maLen)
else
    0

crossupCHECK = maTypeChoice == 'None' or open > maValue and maTypeChoice != 'None'
crossdownCHECK = maTypeChoice == 'None' or open < maValue and maTypeChoice != 'None'

crossupalert = crossupCHECK and ta.crossover(k, d) and (k < bandno2 or d < bandno2)
crossdownalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno2 or d > bandno2)
crossupOSalert = crossupCHECK and ta.crossover(k, d) and (k < bandno1 or d < bandno1)
crossdownOBalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno0 or d > bandno0)

aboveBandalert = ta.crossunder(k, bandno0)
belowBandalert = ta.crossover(k, bandno1)

bgcolor(color=crossupalert and crossoverAlertBgColourMidOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert Background Colour (Middle Level)', transp=70)
bgcolor(color=crossupOSalert and crossoverAlertBgColourOBOSOnOff ? #fbc02d : crossdownOBalert and crossoverAlertBgColourOBOSOnOff ? #000000 : na, title='Crossover Alert Background Colour (OB/OS Level)', transp=70)

bgcolor(color=aboveBandalert and crossoverAlertBgColourGreaterThanOnOff ? #ff0014 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K > Upper level', transp=70)
bgcolor(color=belowBandalert and crossoverAlertBgColourLessThanOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K < Lower level', transp=70)

alertcondition(crossupalert or crossdownalert, title='Stoch RSI Crossover', message='STOCH RSI CROSSOVER')





Больше