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

EMA SMA RSI ATR VWAP ORB
Дата создания: 2025-04-01 16:00:37 Последнее изменение: 2025-04-01 16:00:37
Копировать: 0 Количество просмотров: 382
2
Подписаться
319
Подписчики

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

Обзор

Стратегия многополюсных прорывов и обратных сделок - это метод количественного трейдинга, который объединяет технический анализ показателей и ценового поведения и предназначен для захвата двух основных торговых возможностей на рынке: ценовых обратных сделок и трендовых прорывов. Стратегия искусно объединяет различные технические показатели, такие как движущиеся средние, относительно сильные слабые индексы (RSI), средний реальный диапазон (ATR) и средние цены, взвешенные по объему сделок (VWAP), а также вводит механизм прорыва между дисками (ORB) для повышения надежности входного сигнала.

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

Основным принципом стратегии является фильтрация и подтверждение трех категорий потенциально выгодных торговых возможностей с помощью нескольких показателей:

  1. Обратный торговый сигнал

    • Многоголовый переход: возникает, когда цена пересекает 50-дневную простую движущуюся среднюю ((SMA50), RSI ниже перепродажной отметки ((по умолчанию 30), а цена ниже VWAP, в то же время общая тенденция вверх ((цена выше SMA200)).
    • Воздушный обрат: срабатывает, когда цена пересекает SMA50 ниже, RSI выше, чем превышает порог перекупа ((по умолчанию 70), и цена выше, чем VWAP, в то время как общая тенденция идет вниз ((цена ниже SMA200)).
  2. Сигнал прорыва

    • Множественный прорыв: когда 9-кратный индекс перемещается в среднем ((EMA9) через 20-кратный индекс перемещается в среднем ((EMA20), цена выше, чем VWAP, и общая тенденция вверх.
    • Воздушный прорыв: запускается, когда EMA9 пересекает EMA20, цена ниже VWAP, и общая тенденция снижается.
  3. Открытый диапазон прорыва (ORB)

    • Многоглавый ORB: запускается, когда цена превышает максимальное количество столбцов, сформированных перед открытием, и объем сделки превышает заданный кратный среднего объема сделки в течение периода открытия (по умолчанию в 1,5 раза).
    • ORB: запускается, когда цена опускается ниже минимальной цены, сформированной перед открытием торгов, и объем торгов соответствует условиям обесценения.

Стратегия использует показатель ATR для вычисления динамической позиции стоп-лора, которая устанавливается путем восстановления минимальной/максимальной цены за определенный период (задаточная 7) и умножения на величину ATR (задаточная 0.5). После входа в игру стратегия устанавливает две цели стоп-стопа:

  • Первая цель (TP1): 0,5 раза больше риска (по умолчанию) и 25%-ная позиция
  • Цель 2 (TP2): риски в 1,1 раза (по умолчанию), остальные 75% позиции в открытом положении

После достижения первой цели остановки, стратегия автоматически корректирует остановку до цены входа (убыточная равновесная точка), эффективно защищая полученную прибыль.

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

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

  2. Правильное управление рискамиСтратегия использует пошаговый механизм остановки, позволяя частично получить прибыль, сохраняя потенциально большую прибыль. Когда первый цель остановки будет достигнута, автоматически будет скорректирована остановка до точки равновесия прибыли и убытков, что позволяет “позволить прибыли бежать” и одновременно защищать капитал.

  3. Динамический учет стоп-лостов: Использование показателя ATR для вычисления стоп-позиций позволяет скорректировать уровень стоп-поста в зависимости от динамики волатильности рынка, более точно отражая текущие рыночные условия, избегая слишком жестких или слишком мягких стоп-поста.

  4. Подтверждение объема сделкиВ частности, в ORB-сигнале введен механизм подтверждения объема сделок, требующий, чтобы объем сделок в момент прорыва превышал определенный кратный объем среднего объема сделок в открытом диапазоне, чтобы эффективно отфильтровывать низкокачественные прорывы.

  5. Фильтр трендовОпределение долгосрочного направления тренда с помощью 200-срочной простой скользящей средней (SMA200), обеспечение согласованности направления с основными тенденциями, повышение успешности торгов.

  6. Интеграция управления капиталомСтратегия: встроенные механизмы управления капиталом, ограничение доли капитала, используемого для каждой сделки (по умолчанию 50% капитала), обеспечение диверсификации размещения капитала, снижение риска для одной сделки.

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

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

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

  1. Параметр ЧувствительностьБольшое количество регулируемых параметров (например, длина EMA, порог RSI, коэффициент ATR и т. Д.) усложняет оптимизацию стратегии и может привести к чрезмерной адаптации к историческим данным, что может привести к плохой производительности на будущих рынках.

Решение: использование надлежащих методов оптимизации параметров, таких как проверка вперед, моделирование Монте-Карло, чтобы избежать чрезмерной оптимизации; или использование фиксированных параметров, сосредоточенных на более надежной разработке правил.

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

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

  1. Опасность прыжковВ условиях повышенной волатильности или низкой ликвидности цены могут перепрыгнуть за пределы стоп-позиции, что приводит к фактическим потерям, превышающим ожидания.

Решение: рассмотреть возможность использования стратегии хеджирования опционов или увеличить стоп-дистанцию в условиях высокой волатильности рынка или даже временно снизить размер позиции.

  1. Вход в систему рискаСтратегия: одновременное проведение нескольких связанных сделок, которые могут быть подвержены систематическому риску при резких колебаниях на рынке, что приводит к одновременному убытку нескольких сделок.

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

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

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

Причина оптимизации: традиционные комбинации фиксированных весов не могут адаптироваться к различным этапам рынка, а машинное обучение может автоматически изучать оптимальную модель комбинации из исторических данных.

  1. Интеграция показателей рыночных настроенийВключение индекса волатильности (VIX) или высокочастотного индикатора настроений на рынке помогает стратегии лучше идентифицировать рыночную обстановку, регулировать условия входа и параметры риска.

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

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

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

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

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

  1. Оптимизация расчета размеров позиций: переход от соотношения фиксированного капитала к расчету размеров позиций на основе волатильности, автоматическое уменьшение позиций в периоды высокой волатильности и соответствующее увеличение позиций в периоды низкой волатильности.

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

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

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

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

//@version=5
strategy("Reversal & Breakout Strategy with ORB", overlay=true, pyramiding=2, initial_capital=50000)

// --- Inputs ---
ema9Length = input.int(9, "9 EMA Length", minval=1)
ema20Length = input.int(20, "20 EMA Length", minval=1)
sma50Length = input.int(50, "50 SMA Length", minval=1)
sma200Length = input.int(200, "200 SMA Length", minval=1)
rsiLength = input.int(14, "RSI Length", minval=1)
rsiOverbought = input.int(70, "RSI Overbought", minval=0, maxval=100)
rsiOversold = input.int(30, "RSI Oversold", minval=0, maxval=100)
atrLength = input.int(14, "ATR Length", minval=1)
stopMulti = input.float(0.5, "Stop Loss ATR Multiplier", minval=0.1, step=0.1)
stopLookback = input.int(7, "Stop Loss Lookback", minval=1)
rr1 = input.float(0.5, "Risk:Reward Target 1", minval=0.1, step=0.1)
rr2 = input.float(1.1, "Risk:Reward Target 2", minval=0.1, step=0.1)
target1Percent = input.float(25, "Profit % Target 1", minval=0, maxval=100)
orbBars = input.int(15, "Opening Range Bars", minval=1, tooltip="Number of bars to define the opening range (e.g., 15 bars = 30 min on 2-min chart)")
volThreshold = input.float(1.5, "Volume Threshold Multiplier", minval=1.0, step=0.1, tooltip="Volume must be this multiple of the opening range average")

// --- Indicators ---
// Moving Averages
ema9 = ta.ema(close, ema9Length)
ema20 = ta.ema(close, ema20Length)
sma50 = ta.sma(close, sma50Length)
sma200 = ta.sma(close, sma200Length)

// VWAP
vwapValue = ta.vwap(close)

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

// ATR
atr = ta.atr(atrLength)

// --- Opening Range Breakout ---
var float openingRangeHigh = na
var float openingRangeLow = na
var float openingRangeAvgVol = na
if bar_index < orbBars
    openingRangeHigh := na
    openingRangeLow := na
    openingRangeAvgVol := na
else if bar_index == orbBars
    openingRangeHigh := ta.highest(high, orbBars)
    openingRangeLow := ta.lowest(low, orbBars)
    openingRangeAvgVol := ta.sma(volume, orbBars)

orbLong = not na(openingRangeHigh) and ta.crossover(close, openingRangeHigh) and volume > openingRangeAvgVol * volThreshold
orbShort = not na(openingRangeLow) and ta.crossunder(close, openingRangeLow) and volume > openingRangeAvgVol * volThreshold

// --- Trend Detection ---
trendUp = close > sma200
trendDown = close < sma200

// --- Reversal Conditions ---
reversalLong = ta.crossover(close, sma50) and rsi < rsiOversold and close < vwapValue and trendUp
reversalShort = ta.crossunder(close, sma50) and rsi > rsiOverbought and close > vwapValue and trendDown

// --- Range Breakout Conditions ---
breakoutLong = ta.crossover(ema9, ema20) and close > vwapValue and trendUp
breakoutShort = ta.crossunder(ema9, ema20) and close < vwapValue and trendDown

// Combine conditions
longCondition = (reversalLong or breakoutLong or orbLong)
shortCondition = (reversalShort or breakoutShort or orbShort)

// --- Calculate Position Size ---
equityPerPosition = 25000.0  // $50,000 / 2 positions
positionSizeLong = math.floor(equityPerPosition / close)
positionSizeShort = math.floor(equityPerPosition / close)

// --- Stop Loss Calculation ---
longStop = ta.lowest(low, stopLookback) - (atr * stopMulti)
shortStop = ta.highest(high, stopLookback) + (atr * stopMulti)

// --- Variables to Store Trade Levels ---
var float tradeStop = na
var float tradeTarget1 = na
var float tradeTarget2 = na
var float initialPositionSize = na
var bool breakEvenSet = false  // Track if stop has been moved to break-even
var float stopLevel = na       // Dedicated variable for stop loss in exits
var float target1Level = na    // Dedicated variable for first take profit
var float target2Level = na    // Dedicated variable for second take profit
var float qtyTotal = na        // Track total quantity

// --- Reset Levels Before New Trade ---
var bool newTrade = false
if longCondition or shortCondition
    newTrade := true
else
    newTrade := false

if strategy.position_size == 0 and newTrade
    tradeStop := na
    tradeTarget1 := na
    tradeTarget2 := na
    stopLevel := na
    target1Level := na
    target2Level := na
    initialPositionSize := na
    qtyTotal := na
    breakEvenSet := false

// --- Strategy Entries ---
if longCondition and strategy.position_size == 0
    strategy.entry("Long", strategy.long, qty=positionSizeLong * 2)
    tradeStop := longStop
    stopLevel := longStop
    stopDistance = close - tradeStop
    tradeTarget1 := close + (stopDistance * rr1)
    tradeTarget2 := close + (stopDistance * rr2)
    target1Level := tradeTarget1
    target2Level := tradeTarget2
    initialPositionSize := positionSizeLong * 2
    qtyTotal := positionSizeLong * 2
    breakEvenSet := false  // Reset break-even flag

if shortCondition and strategy.position_size == 0
    strategy.entry("Short", strategy.short, qty=positionSizeShort * 2)
    tradeStop := shortStop
    stopLevel := shortStop
    stopDistance = tradeStop - close
    tradeTarget1 := close - (stopDistance * rr1)
    tradeTarget2 := close - (stopDistance * rr2)
    target1Level := tradeTarget1
    target2Level := tradeTarget2
    initialPositionSize := positionSizeShort * 2
    qtyTotal := positionSizeShort * 2
    breakEvenSet := false  // Reset break-even flag

// --- Trade Exits ---
if strategy.position_size > 0
    qty_tp1 = qtyTotal * (target1Percent / 100)
    qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
    strategy.exit("Long Exit 1", "Long", qty=qty_tp1, stop=stopLevel, limit=target1Level)
    strategy.exit("Long Exit 2", "Long", qty=qty_tp2, stop=stopLevel, limit=target2Level)

if strategy.position_size < 0
    qty_tp1 = qtyTotal * (target1Percent / 100)
    qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
    strategy.exit("Short Exit 1", "Short", qty=qty_tp1, stop=stopLevel, limit=target1Level)
    strategy.exit("Short Exit 2", "Short", qty=qty_tp2, stop=stopLevel, limit=target2Level)

// --- Move Stop to Break-even ---
if strategy.position_size != 0 and not na(initialPositionSize) and not breakEvenSet
    if math.abs(strategy.position_size) < math.abs(initialPositionSize)
        tradeStop := strategy.position_avg_price
        stopLevel := strategy.position_avg_price
        tradeTarget1 := na  // Clear first target for plotting
        breakEvenSet := true  // Mark break-even as set

// --- Manual Close Fallback ---
if strategy.position_size > 0
    if close >= target2Level or close <= stopLevel
        strategy.close("Long", qty=qtyTotal, comment="Manual Close")

if strategy.position_size < 0
    if close <= target2Level or close >= stopLevel
        strategy.close("Short", qty=qtyTotal, comment="Manual Close")

// --- Reset Levels When No Position ---
if strategy.position_size == 0 and not newTrade
    tradeStop := na
    tradeTarget1 := na
    tradeTarget2 := na
    stopLevel := na
    target1Level := na
    target2Level := na
    initialPositionSize := na
    qtyTotal := na
    breakEvenSet := false

// --- Plotting ---
plot(tradeStop, title="Stop Loss", color=color.red, linewidth=1, style=plot.style_linebr)
plot(tradeTarget1, title="Take Profit 1", color=color.green, linewidth=1, style=plot.style_linebr)
plot(tradeTarget2, title="Take Profit 2", color=color.blue, linewidth=1, style=plot.style_linebr)