Многопериодная торговая стратегия, основанная на EMA и Stochastic RSI


Дата создания: 2024-03-08 17:32:38 Последнее изменение: 2024-03-08 17:32:38
Копировать: 3 Количество просмотров: 772
1
Подписаться
1617
Подписчики

Многопериодная торговая стратегия, основанная на EMA и Stochastic RSI

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

Стратегия называется “Стратегия многоциклического отслеживания трендов на основе EMA и случайного RSI” и использует индикаторные движущиеся средние (EMA) и случайные RSI показатели двух различных циклов для захвата среднесрочных и долгосрочных тенденций на рынке. Основная идея стратегии заключается в том, чтобы определить направление тренда с помощью перекрестных EMA, а также использовать случайный RSI в качестве предупредительного сигнала для подтверждения и обратного предупреждения тренда, чтобы построить позиции в начале формирования тренда и ликвидировать позиции в конце тренда.

Стратегический принцип

  1. Вычисление быстрых и медленных ЭМА. Убыточный параметр быстрых ЭМА - 12, а у медленных ЭМА - 25. В практическом применении может быть скорректирован в зависимости от рыночных особенностей и частоты торгов.

  2. Как оценить тенденцию к увеличению количества свободных мест:

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

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

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

Стратегические преимущества

  1. Использование одновременно двух различных циклов ЭМА позволяет лучше сбалансировать чувствительность и надежность захвата трендов. Анализ показал, что комбинация ЭМА в цикле 1225 лучше отслеживает среднесрочные и долгосрочные тенденции.

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

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

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

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

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

  2. Трендовые стратегии, как правило, работают в колеблющихся городах.

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

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

Направление оптимизации

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

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

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

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

Подвести итог

Эта стратегия использует преимущества 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')