Разрыв в ценах и тенденция в соответствии с торговой стратегией

Автор:Чао Чжан, Дата: 2023-10-25 18:02:11
Тэги:

img

Обзор

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

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

Во-первых, стратегия определяет длинные и короткие сигналы по индикатору CCI или индикатору импульса, пересекающим линию 0/ниже. Кроме того, она требует, чтобы RSI находился в зоне перекупленности/перепроданности, то есть выше 65 для перекупленности и ниже 35 для перепроданности, чтобы избежать ложных сигналов.

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

Когда CCI или импульс запускает длинный сигнал, и RSI находится в зоне перепродажи, стратегия проверяет, находятся ли предыдущий высокий и низкий показатели выше средней линии Боллингерской полосы. Если да, то генерируется длинный сигнал. И наоборот, когда короткий сигнал запускает и предыдущий высокий и низкий показатели находятся ниже средней линии, генерируется короткий сигнал.

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

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

  1. Сочетание индикаторов тренда и колебаний позволяет войти в тренд рано и избежать ненужных позиций на рынке диапазона.

  2. Использование среднего значения полосы Боллинджера с ценовыми разрывами эффективно фильтрует ложные прорывы.

  3. Проверка исторических показателей RSI позволяет избежать генерирования неправильных торговых сигналов.

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

  5. Гибкое регулирование параметров адаптируется к различным торговым продуктам.

  6. Остановить убытки и контролировать прибыль эффективно.

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

  1. Неправильные параметры диапазона Боллинджера могут привести к недействительной идентификации средней реверсии.

  2. Неправильные параметры индикатора могут генерировать слишком много ложных сигналов.

  3. Неудачный прорыв требует своевременной остановки потери, когда цена возвращается к средней.

  4. Низкая ликвидность может привести к неэффективной торговле.

  5. Обеспечить достаточное количество исторических данных, чтобы избежать плохого приспособления кривой.

  6. Обратите внимание на торговые сессии, чтобы избежать ложного прорыва.

Направления к улучшению

  1. Оптимизировать параметры полос Боллинджера для более стабильного диапазона реверсии среднего значения.

  2. Испытание параметров на различных продуктах для лучшей оптимизации.

  3. Добавьте размеры позиций, чтобы избежать переразмера одной позиции.

  4. Добавить фильтр сеанса торговли для торговли в основном в активные часы.

  5. Включить модели машинного обучения для генерации более интеллектуальных сигналов.

  6. Интегрировать больше источников данных для определения общей тенденции рынка.

  7. Добавьте больше показателей, чтобы сформировать надежный ансамбль показателей.

Заключение

Эта стратегия объединяет индикаторы тренда и колебаний для раннего обнаружения тенденций. С помощью среднего значения полосы Боллинджера и ценовых разрывов она эффективно избегает ложных прорывов. Гибкие параметры адаптируются к различным продуктам с отличными результатами бэкстеста. Следующими шагами являются оптимизация параметров и модельного ансамбля для большей надежности и достижение постоянного избыточного дохода в долгосрочной перспективе.


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='BroTheJo Strategy', shorttitle='BTJ', overlay=true)

// Input settings
ccimomCross = input.string('CCI', 'Entry Signal Source', options=['CCI', 'Momentum'])
ccimomLength = input.int(10, minval=1, title='CCI/Momentum Length')
useDivergence = input.bool(false, title='Find Regular Bullish/Bearish Divergence')
rsiOverbought = input.int(65, minval=1, title='RSI Overbought Level')
rsiOversold = input.int(35, minval=1, title='RSI Oversold Level')
rsiLength = input.int(14, minval=1, title='RSI Length')
plotMeanReversion = input.bool(true, 'Plot Mean Reversion Bands on the chart')
emaPeriod = input(200, title='Lookback Period (EMA)')
bandMultiplier = input.float(1.6, title='Outer Bands Multiplier')

// 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]

// 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

// Entry Conditions
prevHigh = ta.highest(high, 1)
prevLow = ta.lowest(low, 1)
longEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition) and (prevHigh >= meanReversion) and (prevLow >= meanReversion)
shortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition) and (prevHigh <= meanReversion) and (prevLow <= meanReversion)

// Plotting
oldLongEntryCondition = ccimomCrossUp and oversoldAgo and (not useDivergence or bullishDivergenceCondition)
oldShortEntryCondition = ccimomCrossDown and overboughtAgo and (not useDivergence or bearishDivergenceCondition)
plotshape(oldLongEntryCondition, title='BUY', style=shape.triangleup, location=location.belowbar, color=color.new(color.lime, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(oldShortEntryCondition, title='SELL', style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

// Strategy logic
if (longEntryCondition)
    strategy.entry("Buy", strategy.long)
if (shortEntryCondition)
    strategy.entry("Sell", strategy.short)

// Close all open positions when outside of bands
closeAll = (high >= upperBand) or (low <= lowerBand)

if (closeAll)
    strategy.close_all("Take Profit/Cut Loss")


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

Больше