Окончательная стратегия торговли с балансовым осциллятором

Автор:Чао Чжан, Дата: 2024-01-12 14:08:33
Тэги:

img

Обзор

Стратегия торговли Ultimate Balance Oscillator представляет собой количественную торговую стратегию, которая умно сочетает сигналы из нескольких технических индикаторов. Используя мощь таких индикаторов, как Rate of Change (ROC), Relative Strength Index (RSI), Commodity Channel Index (CCI), Williams %R и Average Directional Index (ADX), он рассчитывает композитный осциллятор для определения тенденции рынка и генерации торговых сигналов.

Наибольшее преимущество этой стратегии заключается в ее способности объективно и систематически оценивать рынки для определения оптимальных точек входа и выхода.

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

Ядром торговой стратегии Ultimate Balance Oscillator является вычисление индикатора композитного осциллятора.

  1. Вычислить значения отдельных технических показателей: ROC, RSI, CCI, Williams %R и ADX

  2. Стандартизируйте эти значения показателей в диапазоне 0-1 для сравнения

  3. Используйте средневзвешенную методологию для вычисления значения композитного осциллятора. Каждый индикатор имеет регулируемое взвешивание, с значениями по умолчанию 2 для ROC, 0,5 для RSI, 2 для CCI, 0,5 для %R и 0,5 для ADX. Умножьте каждый стандартизированный индикатор на его вес, суммируйте их и делите на общий вес, чтобы получить композитное значение 0-1.

  4. Стрельца сигналов торговли, когда этот композитный осциллятор пересекает надлежащим образом установленные перекупленные и перепроданные уровни.

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

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

Торговая стратегия Ultimate Balance Oscillator имеет несколько ключевых преимуществ:

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

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

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

  4. Система оповещения в режиме реального времени для уведомления трейдеров о новых сигналах покупки/выхода и обеспечения осведомленности о последних событиях на рынке.

  5. Строгое обратное тестирование и оптимизация до начала торговли, чтобы оценить производительность по сравнению с историческими данными и отрегулировать параметры для улучшения стратегии.

Риски

Несмотря на его достоинства, некоторые ключевые риски в практическом применении включают:

  1. Риск оптимизации параметров от не оптимальных показателей и настроек, ухудшающих производительность в режиме реального времени. Требуется обширное обратное тестирование для обнаружения идеальных параметров.

  2. Риск перепродажи/перекупки из-за неправильного установления диапазона относительно более широких рыночных условий и настроения.

  3. Дивергентные показатели рискуют исказить значения композитных осцилляторов.

  4. Ограничения квантовой модели, когда определенные рыночные условия могут ухудшить производительность.

Для смягчения рисков настоятельно рекомендуется всестороннее обратное тестирование, калибровка для понимания ограничений модели, отслеживание производительности в режиме реального времени и гибкость в регулировании параметров или весов на основе меняющихся условий.

Возможности для расширения

Некоторые способы дальнейшей оптимизации стратегии включают:

  1. Расширение многофакторной модели с более разнообразными техническими показателями для повышения точности прогнозов.

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

  3. Включение фундаментальных данных, таких как отчеты о доходах и экономические показатели для увеличения количественных факторов.

  4. Внедрение адаптивной настройки параметров для динамического изменения весов и настроек на основе меняющегося рынка.

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

  6. Интеграция моделей размещения позиций на основе размера счета для количественного управления капиталом.

Заключение

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


/*backtest
start: 2023-01-05 00:00:00
end: 2024-01-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © Julien_Eche

//@version=5
strategy("Ultimate Balance Oscillator Strategy", overlay=true)

// Indicator Weights
weightROC = input.float(2, "Rate of Change (ROC) Weight", group="Weightings")
weightRSI = input.float(0.5, "Relative Strength Index (RSI) Weight", group="Weightings")
weightCCI = input.float(2, "Commodity Channel Index (CCI) Weight", group="Weightings")
weightWilliamsR = input.float(0.5, "Williams %R Weight", group="Weightings")
weightADX = input.float(0.5, "Average Directional Index (ADX) Weight", group="Weightings")

// ROC Settings
rocLength = input.int(20, "Length", minval=1, group="ROC")

// RSI Settings
rsiLength = input.int(14, "Length", minval=1, group="RSI")

// CCI Settings
cciLength = input.int(20, "Length", minval=1, group="CCI")

// Williams %R Settings
williamsRLength = input.int(14, "Length", minval=1, group="Williams %R")

// ADX Settings
adxLength = input.int(14, "ADX Length", minval=1, group="ADX")
adxDiLength = input.int(14, "DI Length", minval=1, group="ADX")

// Source
source_options = input.string("hlc3", "Source", options=["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"])

price_open = request.security(syminfo.tickerid, "D", open)
price_high = request.security(syminfo.tickerid, "D", high)
price_low = request.security(syminfo.tickerid, "D", low)
price_close = request.security(syminfo.tickerid, "D", close)
price_hl2 = request.security(syminfo.tickerid, "D", hl2)
price_hlc3 = request.security(syminfo.tickerid, "D", hlc3)
price_ohlc4 = request.security(syminfo.tickerid, "D", ohlc4)

get_source(source_option) =>
    price = price_close
    if source_option == "open"
        price := price_open
    else if source_option == "high"
        price := price_high
    else if source_option == "low"
        price := price_low
    else if source_option == "close"
        price := price_close
    else if source_option == "hl2"
        price := price_hl2
    else if source_option == "hlc3"
        price := price_hlc3
    else
        price := price_ohlc4
    price

src = get_source(source_options)

// Overbought/Oversold Levels
obLevel = input.float(0.75, "Overbought Level")
osLevel = input.float(0.25, "Oversold Level")

// Calculating the indicators
rocValue = ta.change(close, rocLength)
rsiValue = ta.rsi(close, rsiLength)
cciValue = (src - ta.sma(src, cciLength)) / (0.015 * ta.dev(src, cciLength))
williamsRValue = -100 * (ta.highest(high, williamsRLength) - close) / (ta.highest(high, williamsRLength) - ta.lowest(low, williamsRLength))

dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
    minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
    [plus, minus]

adx(dilen, adxlen) =>
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

adxValue = adx(adxDiLength, adxLength)

// Normalizing the values
normalize(value, min, max) =>
    (value - min) / (max - min)

normalizedROC = normalize(rocValue, ta.lowest(rocValue, rocLength), ta.highest(rocValue, rocLength))
normalizedRSI = normalize(rsiValue, 0, 100)
normalizedCCI = normalize(cciValue, ta.lowest(cciValue, cciLength), ta.highest(cciValue, cciLength))
normalizedWilliamsR = normalize(williamsRValue, ta.lowest(williamsRValue, williamsRLength), ta.highest(williamsRValue, williamsRLength))
normalizedADX = normalize(adxValue, 0, 50)

// Calculating the combined oscillator line
oscillatorLine = (normalizedROC * weightROC + normalizedRSI * weightRSI + normalizedCCI * weightCCI + normalizedWilliamsR * weightWilliamsR + normalizedADX * weightADX) / (weightROC + weightRSI + weightCCI + weightWilliamsR + weightADX)

// Strategy conditions
enterLong = ta.crossover(oscillatorLine, obLevel)
exitLong = ta.crossunder(oscillatorLine, osLevel)

// Strategy orders
if (enterLong)
    strategy.entry("Buy", strategy.long)
if (exitLong)
    strategy.close("Buy")

// Alert conditions
if (enterLong)
    alert("Buy signal")
if (exitLong)
    alert("Exit signal")


Больше