CCI+RSI+KC фильтрация тренда длинная и короткая двусторонняя торговая стратегия

CCI RSI KC SMA EMA SMMA CMA TMA
Дата создания: 2024-05-15 16:56:03 Последнее изменение: 2024-05-15 16:56:03
Копировать: 1 Количество просмотров: 670
1
Подписаться
1617
Подписчики

CCI+RSI+KC фильтрация тренда длинная и короткая двусторонняя торговая стратегия

Обзор

Эта стратегия использует три технических показателя CCI, RSI и Kentner Channel (KC), в сочетании с трендовым фильтром, чтобы реализовать многополюсную двустороннюю торговлю на валютных парах AUDNZD и GBPNZD. Стратегия использует CCI и RSI для определения перекупа и перепродажи, KC в качестве ориентира для остановки убытков, а также использует скользящую среднюю для фильтрации тренда.

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

  1. Вычислить показатели CCI, RSI и KC. КК на верхней полосе в среднюю линию плюс ATR, на нижней полосе в среднюю линию минус ATR.
  2. Выбор типа скользящей средней (SMA, EMA, SMMA, CMA или TMA) и метода фильтрации трендов (OFF, POSITIVE или REVERSE) в зависимости от входных параметров.
  3. Условия для открытия позиций с несколькими участниками: допускается много, CCI < линейка сверхпродажи, цена закрытия < KC вниз, RSI < линейка сверхпродажи, объем сделок> 50 циклов*В настоящее время не существует более одной позиции.
  4. Условия для открытия позиции с пустой позицией: разрешены пустота, CCI> перекуп, цена закрытия> KC на трассе, RSI> перекуп, объем сделки> средняя величина 50 циклов*Умножение, текущие свободные позиции
  5. Условия многоглавого плава: CCI>0 ∙ условия пустого плава: CCI ∙
  6. При открытии позиции, а также при закрытии позиции, сигналы подаются.

Стратегические преимущества

  1. В сочетании с несколькими показателями для комплексного суждения, повышение точности сигнала.
  2. Применение метода фильтрации тенденций позволяет гибко адаптироваться к рыночным тенденциям.
  3. Типы скользящих средних могут быть выбраны в зависимости от особенностей рынка.
  4. Исторические данные подтверждены, стабильность хорошая, подходит для длительного использования.
  5. Второсторонние сделки, адаптация к различным ситуациям, больше возможностей для получения прибыли.
  6. Высокая степень автоматизации, без вмешательства человека, экономия времени и сил.

Стратегический риск

  1. Недостаток традиционных стоп-стоп может привести к значительным отступлениям в экстремальных ситуациях.
  2. В условиях нестабильности рынка может возникать частое открытие позиций, что может привести к увеличению стоимости торгов.
  3. При использовании относительно короткого цикла CCI может возникнуть шумный сигнал.
  4. Тренд-фильтрация имеет ограниченную эффективность, когда тенденции неясны или рыночная волатильность усиливается.
  5. Фиксированные позиции, которые не могут самостоятельно адаптироваться к изменениям волатильности рынка.

Направление оптимизации стратегии

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

Подвести итог

Эта стратегия использует несколько классических индикаторов, составление и обратная проверка на trading view относительно удобны. Эффективность обратной проверки неплохая, но в реальном диапазоне также необходимо обратить внимание на контроль рисков, корректировку параметров. Рекомендуется сначала тестировать небольшие средства, а после накопления опыта постепенно увеличивать вложение.

Исходный код стратегии
/*backtest
start: 2024-04-01 00:00:00
end: 2024-04-30 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('CCI Strategy with Trend Filter AUDNZD, GBPNZD', overlay=true, default_qty_type=strategy.cash, default_qty_value=50000, commission_value=0.0005, slippage=2, initial_capital=10000)

// State variables to ensure one entry per signal
var bool isLongOpen = false
var bool isShortOpen = false

// 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.string(title='MA Type', options=['OFF', 'SMA', 'EMA', 'SMMA', 'CMA', 'TMA'], defval='OFF')
trendFilterMethod = input.string(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.float(0, title='Volume Multiplier', step=0.1, minval=0)

// Define Moving Averages
var float maValue = na
if maType == 'SMA'
    maValue := ta.sma(close, maLength)
else if maType == 'EMA'
    maValue := ta.ema(close, maLength)
else if maType == 'SMMA'
    float initialSMMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? initialSMMA : (maValue[1] * (maLength - 1) + close) / maLength
else if maType == 'CMA'
    float firstSMA = ta.sma(close, maLength)
    float secondSMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? firstSMA : (firstSMA + secondSMA - maValue[1]) / 2
else if maType == 'TMA'
    maValue := ta.sma(ta.sma(close, math.round(maLength / 2)), math.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 = ta.sma(typicalPrice, lengthKC)
range_1 = multKC * ta.atr(lengthKC)
upperChannel = middleLine + range_1
lowerChannel = middleLine - range_1

// CCI
cci = ta.cci(close, lengthCCI)

// RSI
rsi = ta.rsi(close, rsiPeriod)

// Volume
volCondition = volume > ta.sma(volume, 50) * volumeMultiplier

// Combined Entry Conditions with Trend Filter and state check
longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition and not isLongOpen
shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition and not isShortOpen

// Execute orders at the open of the new bar after conditions are met
if longCondition
    strategy.entry('Long', strategy.long)
    alert('LicenseID,buy,AUDNZD,risk=1')
    isLongOpen := true
if shortCondition
    strategy.entry('Short', strategy.short)
    alert('LicenseID,sell,AUDNZD,risk=1')
    isShortOpen := true

// Exit Conditions and Alerts
longExitCondition = cci > 0
shortExitCondition = cci < 0
if (longExitCondition and isLongOpen)
    strategy.close('Long')
    alert('LiceneseID,closelong,AUDNZD')
    isLongOpen := false
if (shortExitCondition and isShortOpen)
    strategy.close('Short')
    alert('LicenseID,closeshort,AUDNZD')
    isShortOpen := false

// Plotting
plot(upperChannel, color=color.new(color.red, 0), linewidth=1)
plot(lowerChannel, color=color.new(color.green, 0), linewidth=1)
hline(overboughtCCI, 'Overbought', color=color.red)
hline(oversoldCCI, 'Oversold', color=color.green)