Эта стратегия использует индикатор CCI и индикатор импульса в сочетании с индикатором RSI для выявления рыночных тенденций и входа, когда пробел появляется в зоне перекупа / перепродажи. Она также использует полосы Боллинджера для распознавания тенденций и среднего диапазона реверсии. Стратегия может эффективно идентифицировать прорывы и отступления, входить в начало тренда и адаптироваться к различным продуктам путем корректировки параметров.
Во-первых, стратегия определяет длинные и короткие сигналы по индикатору CCI или индикатору импульса, пересекающим линию 0/ниже. Кроме того, она требует, чтобы RSI находился в зоне перекупленности/перепроданности, то есть выше 65 для перекупленности и ниже 35 для перепроданности, чтобы избежать ложных сигналов.
Кроме того, стратегия может определить расхождения RSI между бычьим и медвежьим показателями для обеспечения более надежных сигналов.
Когда CCI или импульс запускает длинный сигнал, и RSI находится в зоне перепродажи, стратегия проверяет, находятся ли предыдущий высокий и низкий показатели выше средней линии Боллингерской полосы. Если да, то генерируется длинный сигнал. И наоборот, когда короткий сигнал запускает и предыдущий высокий и низкий показатели находятся ниже средней линии, генерируется короткий сигнал.
Таким образом, стратегия использует как индикаторы тренда, так и колебаний, чтобы войти в тренд рано и избежать ложного прорыва со средним диапазоном реверсии.
Сочетание индикаторов тренда и колебаний позволяет войти в тренд рано и избежать ненужных позиций на рынке диапазона.
Использование среднего значения полосы Боллинджера с ценовыми разрывами эффективно фильтрует ложные прорывы.
Проверка исторических показателей RSI позволяет избежать генерирования неправильных торговых сигналов.
Полностью автоматизированная торговля без ручного вмешательства, подходящая для алгоритмической торговли.
Гибкое регулирование параметров адаптируется к различным торговым продуктам.
Остановить убытки и контролировать прибыль эффективно.
Неправильные параметры диапазона Боллинджера могут привести к недействительной идентификации средней реверсии.
Неправильные параметры индикатора могут генерировать слишком много ложных сигналов.
Неудачный прорыв требует своевременной остановки потери, когда цена возвращается к средней.
Низкая ликвидность может привести к неэффективной торговле.
Обеспечить достаточное количество исторических данных, чтобы избежать плохого приспособления кривой.
Обратите внимание на торговые сессии, чтобы избежать ложного прорыва.
Оптимизировать параметры полос Боллинджера для более стабильного диапазона реверсии среднего значения.
Испытание параметров на различных продуктах для лучшей оптимизации.
Добавьте размеры позиций, чтобы избежать переразмера одной позиции.
Добавить фильтр сеанса торговли для торговли в основном в активные часы.
Включить модели машинного обучения для генерации более интеллектуальных сигналов.
Интегрировать больше источников данных для определения общей тенденции рынка.
Добавьте больше показателей, чтобы сформировать надежный ансамбль показателей.
Эта стратегия объединяет индикаторы тренда и колебаний для раннего обнаружения тенденций. С помощью среднего значения полосы Боллинджера и ценовых разрывов она эффективно избегает ложных прорывов. Гибкие параметры адаптируются к различным продуктам с отличными результатами бэкстеста. Следующими шагами являются оптимизация параметров и модельного ансамбля для большей надежности и достижение постоянного избыточного дохода в долгосрочной перспективе.
/*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)