Экспоненциальная скользящая средняя и кумулятивный объем цикл кроссовер стратегия динамической торговой теории

EMA CVP AVWP TOD
Дата создания: 2025-01-06 11:45:38 Последнее изменение: 2025-01-06 11:45:38
Копировать: 1 Количество просмотров: 346
1
Подписаться
1617
Подписчики

Экспоненциальная скользящая средняя и кумулятивный объем цикл кроссовер стратегия динамической торговой теории

Обзор

Эта стратегия представляет собой торговую систему, которая объединяет экспоненциальную скользящую среднюю (EMA) и период кумулятивного объема (CVP). Он фиксирует поворотные моменты рыночных тенденций, анализируя пересечение экспоненциальной скользящей средней цены и кумулятивной цены, взвешенной по объему. Стратегия имеет встроенные временные фильтры, которые могут ограничивать часы торговли и поддерживать автоматическое закрытие позиций по окончании торгового периода. Стратегия предусматривает два различных метода выхода: обратный перекрестный выход и индивидуальный выход CVP, что делает ее более гибкой и адаптируемой.

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

Основная логика стратегии основана на следующих ключевых расчетах:

  1. Рассчитайте среднюю цену (AVWP): умножьте среднее арифметическое самой высокой, самой низкой цены и цены закрытия на объем.
  2. Рассчитайте значение совокупного объема за период: сложите взвешенную по объему цену за установленный период и разделите на совокупный объем.
  3. Рассчитайте EMA цены закрытия и EMA CVP по отдельности.
  4. Длинный сигнал генерируется, когда ценовая EMA пересекает CVP EMA снизу вверх; короткий сигнал генерируется, когда ценовая EMA пересекает CVP EMA сверху вниз.
  5. Выходным сигналом может быть обратный кроссоверный сигнал или кроссоверный сигнал на основе пользовательского цикла CVP.

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

  1. Система сигналов надежна: она объединяет ценовые тенденции и информацию об объеме торгов для более точного определения рыночных тенденций.
  2. Высокая адаптивность: период EMA и период CVP можно корректировать для адаптации к различным рыночным условиям.
  3. Идеальное управление рисками: встроенные временные фильтры позволяют избегать операций в периоды, неподходящие для торговли.
  4. Гибкий механизм выхода: предусмотрены два различных метода выхода, и вы можете выбрать подходящий метод выхода в соответствии с характеристиками рынка.
  5. Хорошая визуализация: стратегия предоставляет понятный графический интерфейс, включая сигнальные маркеры и заполнение области тренда.

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

  1. Риск гистерезиса: EMA сама по себе имеет определенный гистерезис, который может вызывать небольшие задержки во времени входа и выхода.
  2. Риск волатильности рынка: на боковом и волатильном рынке могут генерироваться ложные сигналы.
  3. Чувствительность параметров: Различные комбинации параметров могут привести к значительным различиям в эффективности стратегии.
  4. Риск ликвидности: на рынках с низкой ликвидностью расчеты CVP могут быть недостаточно точными.
  5. Зависимость от часового пояса: стратегия использует нью-йоркское время в качестве временного фильтра и должна учитывать разницу в часах торговли на разных рынках.

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

  1. Внедрение фильтров волатильности: параметры стратегии можно корректировать в соответствии с волатильностью рынка, чтобы улучшить адаптивность стратегии.
  2. Оптимизированный временной фильтр: можно добавить несколько временных окон для более точного контроля торговых сессий.
  3. Повысьте оценку качества громкости: введите индикаторы анализа громкости для фильтрации некачественных сигналов громкости.
  4. Динамическая настройка параметров: разработка адаптивной системы параметров для автоматической настройки периодов EMA и CVP в соответствии с рыночными условиями.
  5. Добавьте индикаторы настроений рынка: сочетайте их с другими техническими индикаторами для подтверждения торговых сигналов.

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

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

Исходный код стратегии
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// © sapphire_edge 

// # ========================================================================= #
// #                  
// #        _____                   __    _              ______    __         
// #      / ___/____ _____  ____  / /_  (_)_______     / ____/___/ /___ ____ 
// #      \__ \/ __ `/ __ \/ __ \/ __ \/ / ___/ _ \   / __/ / __  / __ `/ _ \
// #     ___/ / /_/ / /_/ / /_/ / / / / / /  /  __/  / /___/ /_/ / /_/ /  __/
// #    /____/\__,_/ .___/ .___/_/ /_/_/_/   \___/  /_____/\__,_/\__, /\___/ 
// #              /_/   /_/                                     /____/       
// #                                      
// # ========================================================================= #

strategy(shorttitle="⟡Sapphire⟡ EMA/CVP", title="[Sapphire] EMA/CVP Strategy", initial_capital= 50000, currency= currency.USD,default_qty_value = 1,commission_type= strategy.commission.cash_per_contract,overlay= true )

// # ========================================================================= #
// #                       // Settings Menu //
// # ========================================================================= #

// --------------------    Main Settings    -------------------- //
groupEMACVP = "EMA / Cumulative Volume Period"
tradeDirection = input.string(title='Trade Direction', defval='LONG', options=['LONG', 'SHORT'], group=groupEMACVP)
emaLength = input.int(25, title='EMA Length', minval=1, maxval=200, group=groupEMACVP)
cumulativePeriod = input.int(100, title='Cumulative Volume Period', minval=1, maxval=200, step=5, group=groupEMACVP)
exitType = input.string(title="Exit Type", defval="Crossover", options=["Crossover", "Custom CVP" ], group=groupEMACVP)
cumulativePeriodForClose = input.int(50, title='Cumulative Period for Close Signal', minval=1, maxval=200, step=5, group=groupEMACVP)
showSignals = input.bool(true, title="Show Signals", group=groupEMACVP)
signalOffset = input.int(5, title="Signal Vertical Offset", group=groupEMACVP)

// --------------------    Time Filter Inputs    -------------------- //
groupTimeOfDayFilter = "Time of Day Filter"
useTimeFilter1  = input.bool(false, title="Enable Time Filter 1", group=groupTimeOfDayFilter)
startHour1      = input.int(0, title="Start Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
startMinute1    = input.int(0, title="Start Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
endHour1        = input.int(23, title="End Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
endMinute1      = input.int(45, title="End Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
closeAtEndTimeWindow = input.bool(false, title="Close Trades at End of Time Window", group=groupTimeOfDayFilter)

// --------------------    Trading Window    -------------------- //
isWithinTradingWindow(startHour, startMinute, endHour, endMinute) =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    startInMinutes    = startHour * 60 + startMinute
    endInMinutes      = endHour * 60 + endMinute
    timeInMinutes    >= startInMinutes and timeInMinutes <= endInMinutes

timeCondition =  (useTimeFilter1 ? isWithinTradingWindow(startHour1, startMinute1, endHour1, endMinute1) : true)

// Check if the current bar is the last one within the specified time window
isEndOfTimeWindow() =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    endInMinutes      = endHour1 * 60 + endMinute1
    timeInMinutes == endInMinutes

// Logic to close trades if the time window ends
if timeCondition and closeAtEndTimeWindow and isEndOfTimeWindow()
    strategy.close_all(comment="Closing trades at end of time window")

// # ========================================================================= #
// #                       // Calculations //
// # ========================================================================= #

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = math.sum(avgPriceVolume, cumulativePeriod)
cumulVolume = math.sum(volume, cumulativePeriod)
cumValue = cumulPriceVolume / cumulVolume

cumulPriceVolumeClose = math.sum(avgPriceVolume, cumulativePeriodForClose)
cumulVolumeClose = math.sum(volume, cumulativePeriodForClose)
cumValueClose = cumulPriceVolumeClose / cumulVolumeClose

emaVal = ta.ema(close, emaLength)
emaCumValue = ta.ema(cumValue, emaLength)

// # ========================================================================= #
// #                       // Signal Logic //
// # ========================================================================= #

// Strategy Entry Conditions
longEntryCondition = ta.crossover(emaVal, emaCumValue) and tradeDirection == 'LONG'
shortEntryCondition = ta.crossunder(emaVal, emaCumValue) and tradeDirection == 'SHORT'

// User-Defined Exit Conditions
longExitCondition = false
shortExitCondition = false

if exitType == "Crossover"
    longExitCondition := ta.crossunder(emaVal, emaCumValue)
    shortExitCondition := ta.crossover(emaVal, emaCumValue)

if exitType == "Custom CVP"
    emaCumValueClose = ta.ema(cumValueClose, emaLength)
    longExitCondition := ta.crossunder(emaVal, emaCumValueClose)
    shortExitCondition := ta.crossover(emaVal, emaCumValueClose)

// # ========================================================================= #
// #                       // Strategy Management //
// # ========================================================================= #

// Strategy Execution
if longEntryCondition and timeCondition
    strategy.entry('Long', strategy.long)
    label.new(bar_index, high - signalOffset, "◭", style=label.style_label_up, color = color.rgb(119, 0, 255, 20), textcolor=color.white)

if shortEntryCondition and timeCondition
    strategy.entry('Short', strategy.short)
    label.new(bar_index, low + signalOffset, "⧩", style=label.style_label_down, color = color.rgb(255, 85, 0, 20), textcolor=color.white)

if strategy.position_size > 0 and longExitCondition
    strategy.close('Long')

if strategy.position_size < 0 and shortExitCondition
    strategy.close('Short')

// # ========================================================================= #
// #                         // Plots and Charts //
// # ========================================================================= #

plot(emaVal, title='EMA', color=color.new(color.green, 25))
plot(emaCumValue, title='Cumulative EMA', color=color.new(color.purple, 35))
fill(plot(emaVal), plot(emaCumValue), color=emaVal > emaCumValue ? #008ee6 : #d436a285, title='EMA and Cumulative Area', transp=70)