Количественная стратегия, основанная на каналах Келтнера и индикаторе CCI

Автор:Чао Чжан, Дата: 2024-02-27 15:47:20
Тэги:

img

Обзор

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

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

Стратегия принимает торговые решения в основном на основе следующих показателей и условий:

  1. Канала Келтнера: Расчет верхней и нижней полос на основе типичной цены и ATR за период, чтобы определить, находится ли цена в канале.

  2. Индикатор CCI: используется для определения того, перекуплена или перепродана ли цена.

  3. Индикатор RSI: помогает оценить уровни перекупленности/перепроданности.

  4. Объем торговли: требует прорыва определенной скользящей средней стоимости.

  5. Тенденционный фильтр с МА: Используйте SMA, EMA и т. д. для определения общего направления тренда.

С условием направления тренда, сигналы покупки и продажи генерируются, когда цена прерывает диапазоны Keltner Channel, CCI и RSI дают сигналы, и объем торговли увеличивается.

Преимущества

Стратегия сочетает в себе несколько показателей и условий для фильтрации неопределенных сигналов и принятия более надежных решений:

  1. Тенденционный фильтр избегает неопределенных волатильных рынков.

  2. Келтнерские каналы идентифицируют ключевые уровни прорыва.

  3. Сигналы CCI и RSI относительно точны.

  4. Увеличение объема помогает предотвратить некоторые ложные прорывы.

Риски

Основные риски:

  1. Неправильное суждение о тенденциях может пропустить более сильные тенденции.

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

  3. Неэффективное увеличение объема оставляет определенный риск ложного прорыва.

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

Потенциальные направления оптимизации:

  1. Испытать различные типы и длины MA для лучшего фильтра тренда.

  2. Оптимизировать параметры Keltner Channels, CCI, RSI для более точных сигналов.

  3. Испытайте различные множители объема, чтобы найти оптимальный уровень.

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

Заключение

В целом, эта стратегия сочетает в себе Keltner Channels, CCI, RSI индикаторы и условия объема торговли, чтобы создать относительно полную стратегию количественной торговли, фильтрующую тренд. Она имеет такие преимущества, как избегание неясных волатильных рынков, выявление ключевых прорывов, получение относительно точных сигналов перекупления / перепродажи и предотвращение некоторых ложных прорывов. Риски существуют в таких аспектах, как неправильное настройка параметров и неэффективное увеличение объема. Дальнейшие оптимизации могут быть сделаны на методе фильтрации тренда, параметрах индикатора, мультипликаторе объема и добавлении механизмов остановки потерь.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Custom Keltner CCI Strategy with Trend Filter", overlay=true )
// Input Parameters for allowing long and short trades
allowLong = input(true, title="Allow Long Trades")
allowShort = input(true, title="Allow Short Trades")
// Trend Filter Inputs
maType = input(title="MA Type", options=["OFF", "SMA", "EMA", "SMMA", "CMA", "TMA"], defval="OFF")
trendFilterMethod = input(title="Trend Filter Method", options=["OFF", "Normal", "Reversed"], defval="OFF")
maLength = input(14, title="MA Length")
// Other Input Parameters
lengthKC = input(30, title="Keltner Channels Length")
multKC = input(0.7, title="Keltner Channels Multiplier")
lengthCCI = input(5, title="CCI Length")
overboughtCCI = input(75, title="CCI Overbought Level")
oversoldCCI = input(-75, title="CCI Oversold Level")
rsiPeriod = input(30, title="RSI Period")
rsiOverbought = input(60, title="RSI Overbought Level")
rsiOversold = input(60, title="RSI Oversold Level")
volumeMultiplier = input(0, title="Volume Multiplier", type=input.float, step=0.1, minval=0)
// Define Moving Averages
var float maValue = na
if (maType == "SMA")
    maValue := sma(close, maLength)
else if (maType == "EMA")
    maValue := ema(close, maLength)
else if (maType == "SMMA")
    maValue := na(maValue[1]) ? sma(close, maLength) : (maValue[1] * (maLength - 1) + close) / maLength
else if (maType == "CMA")
    maValue := na(maValue[1]) ? sma(close, maLength) : (sma(close, maLength) + (sma(close, maLength) - maValue[1])) / 2
else if (maType == "TMA")
    maValue := sma(sma(close, round(maLength/2)), round(maLength/2)+1)
// Entry Conditions with Trend Filter
longCondition = allowLong and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close > maValue) or (trendFilterMethod == "Reversed" and close < maValue))
shortCondition = allowShort and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close < maValue) or (trendFilterMethod == "Reversed" and close > maValue))
// Keltner Channels
typicalPrice = hlc3
middleLine = sma(typicalPrice, lengthKC)
range = multKC * atr(lengthKC)
upperChannel = middleLine + range
lowerChannel = middleLine - range
// CCI
cci = cci(close, lengthCCI)
// RSI
rsi = rsi(close, rsiPeriod)
// Volume
volCondition = volume > sma(volume, 50) * volumeMultiplier
// Combined Entry Conditions with Trend Filter
longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition
shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition
// Execute orders at the open of the new bar after conditions are met
if (longCondition)
    strategy.entry("Long", strategy.long)
if (shortCondition)
    strategy.entry("Short", strategy.short)
// Exit Conditions
strategy.close("Long", when = cci > 0)
strategy.close("Short", when = cci < 0)
// Plotting
plot(upperChannel, color=color.red, linewidth=1)
plot(lowerChannel, color=color.green, linewidth=1)
hline(overboughtCCI, "Overbought", color=color.red)
hline(oversoldCCI, "Oversold", color=color.green)

Больше