Стратегия показателей реверсальной терапии

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

img

Обзор

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

Логика стратегии

Торговые сигналы стратегии поступают от пользовательского индикатора под названием Edri Extreme Points Buy & Sell. Он учитывает CCI, индикатор импульса и кроссоверы RSI. Конкретные логики таковы:

Долгие сигнальные условия:

  1. Индикатор Edri Extreme Points Buy & Sell запускает сигнал покупки, то есть пересечение CCI выше 0, или пересечение Momentum выше 0, а RSI находится ниже уровня перепроданности.
  2. Цена падает до или ниже 100-периодного EMA.

Условия короткого сигнала:

  1. Индикатор Edri Extreme Points Buy & Sell запускает сигнал продажи, то есть пересечение CCI ниже 0 или пересечение Momentum ниже 0, а RSI находится выше уровня перекупа.
  2. Цена отходит до или выше 100-периодного EMA.

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

При запуске торговых сигналов стратегия устанавливает стоп-лосс по входной цене ± 2ATR, прибыль по входной цене ± 4ATR. Это позволяет получить разумный диапазон стоп-лосса и прибыли на основе волатильности рынка.

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

  1. Объединение нескольких показателей позволяет избежать ложных сигналов от одного показателя.
  2. Стиль реверсионной торговли использует среднесрочные возможности на рынках с ограниченным диапазоном.
  3. Стойкость потери и прибыль на основе ATR могут корректировать позиции в зависимости от волатильности рынка.
  4. Поиск расхождений позволяет избежать открытия позиций без чрезвычайных уровней перекупа/перепродажи.

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

  1. Неправильные параметры показателей могут привести к упущенным возможностям или слишком большому количеству неправильных сигналов.
  2. Обратная торговля может привести к последовательным стоп-лосс на трендовых рынках.
  3. ATR имеет задерживающий эффект и не может своевременно обновлять режим стоп-лосса/приобретения прибыли на быстро меняющихся рынках.

Решения:

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

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

  1. Испытать различные комбинации параметров CCI, длины импульса, параметров RSI, мультипликатора ATR и т.д.
  2. Добавьте другие условия фильтрации, такие как ценовые модели, изменения объема и т. д.
  3. Настраивайте правила размещения позиций, например, отношение позиций на базе ATR.
  4. Установка шаблонов параметров для различных продуктов и временных рамок.
  5. Подумайте о добавлении отслеживания трендов для приостановки обратной торговли на трендовых рынках.

Резюме

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


/*backtest
start: 2023-11-12 00:00:00
end: 2023-12-02 00:00:00
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/
// © MagicStrategies

//@version=5
strategy("Reversal Indicator Strategy", overlay = true)

// Input settings
ccimomCross = input.string('CCI', 'Entry Signal Source', options=['CCI', 'Momentum'], tooltip='CCI or Momentum will be the final source of the Entry signal if selected.')
ccimomLength = input.int(10, minval=1, title='CCI/Momentum Length')
useDivergence = input.bool(true, title='Find Regular Bullish/Bearish Divergence', tooltip='If checked, it will only consider an overbought or oversold condition that has a regular bullish or bearish divergence formed inside that level.')
rsiOverbought = input.int(65, minval=1, title='RSI Overbought Level', tooltip='Adjusting the level to extremely high may filter out some signals especially when the option to find divergence is checked.')
rsiOversold = input.int(35, minval=1, title='RSI Oversold Level', tooltip='Adjusting this level extremely low may filter out some signals especially when the option to find divergence is checked.')
rsiLength = input.int(14, minval=1, title='RSI Length')
plotMeanReversion = input.bool(false, 'Plot Mean Reversion Bands on the chart', tooltip='This function doesn\'t affect the entry of signal but it suggests buying when the price is at the lower band, and then sell it on the next bounce at the higher bands.')
emaPeriod = input(200, title='Lookback Period (EMA)')
bandMultiplier = input.float(1.8, title='Outer Bands Multiplier', tooltip='Multiplier for both upper and lower bands')


// CCI and Momentum calculation
momLength = ccimomCross == 'Momentum' ? ccimomLength : 10
mom = close - close[momLength]
cci = ta.cci(close, ccimomLength)
ccimomCrossUp = ccimomCross == 'Momentum' ? ta.cross(mom, 0) : ta.cross(cci, 0)
ccimomCrossDown = ccimomCross == 'Momentum' ? ta.cross(0, mom) : ta.cross(0, cci)

// RSI calculation
src = close
up = ta.rma(math.max(ta.change(src), 0), rsiLength)
down = ta.rma(-math.min(ta.change(src), 0), rsiLength)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down)
oversoldAgo = rsi[0] <= rsiOversold or rsi[1] <= rsiOversold or rsi[2] <= rsiOversold or rsi[3] <= rsiOversold
overboughtAgo = rsi[0] >= rsiOverbought or rsi[1] >= rsiOverbought or rsi[2] >= rsiOverbought or rsi[3] >= rsiOverbought

// Regular Divergence Conditions
bullishDivergenceCondition = rsi[0] > rsi[1] and rsi[1] < rsi[2]
bearishDivergenceCondition = rsi[0] < rsi[1] and rsi[1] > rsi[2]

// Entry Conditions
longEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition)
shortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition)


// Mean Reversion Indicator
meanReversion = plotMeanReversion ? ta.ema(close, emaPeriod) : na
stdDev = plotMeanReversion ? ta.stdev(close, emaPeriod) : na
upperBand = plotMeanReversion ? meanReversion + stdDev * bandMultiplier : na
lowerBand = plotMeanReversion ? meanReversion - stdDev * bandMultiplier : na


// Plotting
plotshape(longEntryCondition, title='BUY', style=shape.triangleup, text='B', location=location.belowbar, color=color.new(color.lime, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(shortEntryCondition, title='SELL', style=shape.triangledown, text='S', location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

plot(upperBand, title='Upper Band', color=color.new(color.fuchsia, 0), linewidth=1)
plot(meanReversion, title='Mean', color=color.new(color.gray, 0), linewidth=1)
plot(lowerBand, title='Lower Band', color=color.new(color.blue, 0), linewidth=1)

// Entry signal alerts
alertcondition(longEntryCondition, title='BUY Signal', message='Buy Entry Signal')
alertcondition(shortEntryCondition, title='SELL Signal', message='Sell Entry Signal')
alertcondition(longEntryCondition or shortEntryCondition, title='BUY or SELL Signal', message='Entry Signal')

ema100 = ta.ema(close, 100)
plot(ema100, color=color.red)

// Define trading signals based on the original indicator's entry conditions
// Buy if long condition is met and price has pulled back to or below the 100 EMA
longCondition  = longEntryCondition and close <= ema100
// Sell if short condition is met and price has pulled back to or above the 100 EMA
shortCondition = shortEntryCondition and close >= ema100

// Strategy Entries
if longCondition
    strategy.entry("Buy", strategy.long)
if shortCondition
    strategy.entry("Sell", strategy.short)

Больше