Стратегия среднего канала реверсии CCI

Автор:Чао Чжан, Дата: 2023-11-01 16:20:45
Тэги:

img

Обзор

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

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

  1. Для определения рыночных тенденций используйте перекрестки нулевой линии CCI. Пересечение CCI выше нуля является бычьим сигналом, а пересечение ниже является медвежьим сигналом.

  2. Установите пользовательские верхние и нижние полосы CCI. Пересечение CCI выше верхней полосы является быстрым, а пересечение ниже нижней полосы является медвежьим. Пересечения полос действуют как остановки.

  3. Возможность торговать только в определенные временные рамки и закрывать все позиции за пределами этих периодов.

  4. Установите фиксированные стоп-лосс и проценты прибыли.

  5. Настраиваемые предупреждающие сообщения для сигналов входа и выхода.

  6. Высоко настраиваемая стратегия с регулируемыми параметрами CCI, диапазонами, остановками и т. д.

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

  1. CCI чувствителен к изменениям цен, хорошо распознает изменение тренда.

  2. Специализированные полосы могут быть настроены для разных рынков.

  3. Поддержка торговли в разные временные рамки с оптимизированными параметрами на основе характеристик.

  4. Фиксированные коэффициенты стоп-лосса/прибыли и риск-вознаграждение и предельный риск.

  5. Полностью настраиваемые параметры оптимизируют стратегию для различных продуктов и рыночных условий.

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

  1. CCI, склонные к ложным сигналам, должны проверять сигналы с более длительными индикаторами временных рамок.

  2. Фиксированные процентные ставки стоп/тач не могут адаптироваться к изменяющимся рыночным условиям.

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

  4. Частые оптимизации параметров могут привести к переоценке или отсутствию сделок.

  5. Необходимо учитывать макрофакторы, поскольку оптимизация сама по себе недостаточна для устранения рисков.

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

  1. Добавить более длительные временные индикаторы для проверки сигналов CCI.

  2. Включать динамические остановки/заезды, такие как ATR.

  3. Проверьте параметры в разных временных рамках и найдите периоды высокой эффективности.

  4. Оптимизировать параметры и диапазоны CCI для меняющихся рынков.

  5. Подумайте о включении других факторов, таких как волатильность и объем.

  6. Выберите временные рамки, подходящие для торговых продуктов.

  7. Подумайте о машинном обучении для автоматизации оптимизации стратегии.

Резюме

В целом это очень гибкая и настраиваемая система следования трендам. Ключевыми преимуществами являются использование CCI для тенденций, пользовательские диапазоны для ограничения риска, фиксированные остановки/взятия и выбор временных рамок. Необходимо следить за ложными сигналами CCI и негибкими остановками. Будущие улучшения могут исходить из оптимизации параметров, фильтрации сигналов, выбора эффективных временных рамок и включения машинного обучения для автоматической адаптации к изменениям рынка, чтобы достичь более последовательной избыточной отдачи.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 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/
// © REV0LUTI0N

//@version=4

strategy(title="CCI Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash)


//CCI Code

length = input(20, minval=1, title="CCI Length")
src = input(close, title="Source")
ma = sma(src, length)
cci = (src - ma) / (0.015 * dev(src, length))


// Strategy Backtesting
startDate  = input(timestamp("2099-10-01T00:00:00"), type = input.time, title='Backtesting Start Date')
finishDate = input(timestamp("9999-12-31T00:00:00"), type = input.time, title='Backtesting End Date')

time_cond  = true


//Time Restriction Settings
startendtime = input("", title='Time Frame To Enter Trades')
enableclose = input(false, title='Enable Close Trade At End Of Time Frame')
timetobuy = true
timetoclose = true


//Strategy Settings

//Strategy Settings - Enable Check Boxes
enableentry = input(true, title="Enter First Trade ASAP")
enableconfirmation = input(false, title="Wait For Cross To Enter First Trade")
enablezero =input(true, title="Use CCI Simple Cross Line For Entries & Exits")
enablebands = input(false, title="Use Upper & Lower Bands For Entries & Exits")

//Strategy Settings - Band Sources
ccisource = input(0, title="CCI Simple Cross")
upperbandsource =input(100, title="CCI Enter Long Band")
upperbandexitsource =input(100, title="CCI Exit Long Band")
lowerbandsource =input(-100, title="CCI Enter Short Band")
lowerbandexitsource =input(-100, title="CCI Exit Short Band")

//Strategy Settings - Crosses
simplecrossup = crossover(cci, ccisource)
simplecrossdown = crossunder(cci, ccisource)
uppercrossup = crossover(cci, upperbandsource)
lowercrossdown = crossunder(cci, lowerbandsource)
uppercrossdown = crossunder(cci, upperbandexitsource)
lowercrossup = crossover(cci, lowerbandexitsource)
upperstop = crossunder(cci, upperbandsource)
lowerstop = crossover(cci, lowerbandsource)


// Stop Loss & Take Profit % Based
enablesl = input(false, title='Enable Stop Loss')
enabletp = input(false, title='Enable Take Profit')
stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100
takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100

longStop = strategy.position_avg_price * (1 - stopTick)
shortStop = strategy.position_avg_price * (1 + stopTick)
shortTake = strategy.position_avg_price * (1 - takeTick)
longTake = strategy.position_avg_price * (1 + takeTick)

plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL")
plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit")
plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit")


// Alert messages
message_enterlong  = input("", title="Long Entry message")
message_entershort = input("", title="Short Entry message")
message_closelong = input("", title="Close Long message")
message_closeshort = input("", title="Close Short message")
    

//Strategy Execution

//Strategy Execution - Simple Line Cross
if (cci > ccisource and enablezero and enableentry and time_cond and timetobuy)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
if (cci < ccisource and enablezero and enableentry and time_cond and timetobuy)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)

if (simplecrossup and enablezero and enableconfirmation and time_cond and timetobuy)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
if (simplecrossdown and enablezero and enableconfirmation and time_cond and timetobuy)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)

//Strategy Execution - Upper and Lower Band Entry
if (uppercrossup and enablebands and time_cond and timetobuy)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
if (lowercrossdown and enablebands and time_cond and timetobuy)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)

//Strategy Execution - Upper and Lower Band Exit
if strategy.position_size > 0 and uppercrossdown and enablebands and time_cond and timetobuy
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and lowercrossup and enablebands and time_cond and timetobuy
    strategy.close_all(alert_message = message_closeshort)

//Strategy Execution - Upper and Lower Band Stops
if strategy.position_size > 0 and upperstop and enablebands and time_cond and timetobuy
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and lowerstop and enablebands and time_cond and timetobuy
    strategy.close_all(alert_message = message_closeshort)

//Strategy Execution - Close Trade At End Of Time Frame    
if strategy.position_size > 0 and timetoclose and enableclose and time_cond
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and timetoclose and enableclose and time_cond
    strategy.close_all(alert_message = message_closeshort)

//Strategy Execution - Stop Loss and Take Profit
if strategy.position_size > 0 and enablesl and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enablesl and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)
    
if strategy.position_size > 0 and enabletp and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enabletp and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)



Больше