Стратегии торговли осциллятором


Дата создания: 2023-12-13 14:45:51 Последнее изменение: 2023-12-13 14:45:51
Копировать: 0 Количество просмотров: 795
1
Подписаться
1621
Подписчики

Стратегии торговли осциллятором

Обзор

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

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

Торговые сигналы для этой стратегии исходят из пользовательского индикатора Edri, который учитывает перекрестное положение CCI, динамического индикатора и RSI. Конкретная логика:

Условия многоголовной сигнализации:

  1. Поточный криптовалютный индикатор “Эдри” дает сигнал “купить”, то есть CCI пересекает 0-угол или динамический индикатор пересекает 0-угол, а RSI ниже линии “продавать”.
  2. Цена снизилась или упала ниже 100-циклической EMA.

Условия пустого сигнала:

  1. Точка продажи - это точка продажи, когда CCI пересекает 0-ую ось, а RSI выше, чем перекуп.
  2. Цена снизилась или превысила 100-циклическую EMA.

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

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

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

  1. Анализ нескольких показателей помогает избежать ложных сигналов в одном показателе.
  2. Реверсивный способ торговли, способствующий поимке коротких торговых возможностей в условиях потрясений.
  3. ATR Stop Loss Stop Mode, может корректировать позиции в зависимости от волатильности рынка.
  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)