Количественная торговая стратегия с прорывом стоп-лосс в Лондоне и Нью-Йорке на двух сессиях

ORB EMA SL TP RRR 交易会话 追踪止损 价格突破 风险管理
Дата создания: 2025-04-27 11:32:24 Последнее изменение: 2025-04-27 11:32:24
Копировать: 2 Количество просмотров: 334
2
Подписаться
319
Подписчики

Количественная торговая стратегия с прорывом стоп-лосс в Лондоне и Нью-Йорке на двух сессиях Количественная торговая стратегия с прорывом стоп-лосс в Лондоне и Нью-Йорке на двух сессиях

Обзор

Двухчасовая стратегия трейдинга, основанная на 15-минутных ценовых промежутках перед началом торгов в Лондонском и Нью-Йоркском торговых часах. Стратегия заключается в том, чтобы отслеживать остановки, чтобы сохранить рост прибыли и защитить прибыль.

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

Операционный механизм стратегии строится вокруг двух ключевых периодов времени: открытие рынка в Лондоне (03:35 по нью-йоркскому времени) и открытие рынка в Нью-Йорке (09:30-9:45 по нью-йоркскому времени). Рабочий процесс стратегии выглядит следующим образом:

  1. Запись цены в Лондоне и Нью-Йорке в течение первых 15 минут торговой сессии, как максимумы, так и минимумы, образует “ценовые диапазоны”
  2. После формирования ценового диапазона стратегия проверяет, соответствует ли размер диапазона минимальным требованиям (по умолчанию 2 балла)
  3. Если цена пересекает предельную высоту с нижнего направления и удовлетворяет условию фильтрации EMA (если она включена), то открывается дополнительная позиция
  4. Если цена пробивает межбанковские минимумы сверху вниз и удовлетворяет условию фильтрации EMA (если она включена), открывается позиция на “поза”,
  5. Стоп-стоп устанавливается на высоте одного диапазона за пределами ценового диапазона в направлении, противоположном прорыву
  6. Стоп-старт - коэффициент возврата риска (по умолчанию 2.0) умноженный на высоту интервала
  7. Одновременно с установкой стоп-трафика, по умолчанию 8 минимальных единиц изменения, корректировка по мере движения цены в выгодном направлении

Ключевая логика стратегии заключается в том, чтобы улавливать ориентировочные прорывы цены в начале торгового периода, что обычно предвещает возможную последующую тенденционную ситуацию. Используя механизм отслеживания стоп-лосса, стратегия позволяет продолжать прибыльную торговлю, защищая при этом уже прибыльную.

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

После глубокого анализа, эта стратегия имеет следующие преимущества:

  1. Двухчасовые торговые возможностиПомимо этого, по мнению экспертов, в случае, если в течение дня будет открыто несколько торговых площадок в Лондоне и Нью-Йорке, то это позволит увеличить возможности для торговли.
  2. Механизм отслеживания потерьПо сравнению с фиксированными стоп-позициями, отслеживание стоп-лосса позволяет прибыльным сделкам продолжать развиваться, эффективно повышая средний уровень прибыли, защищая прибыль.
  3. Идеальный контроль риска: стратегия использует динамическую стоп-стратировку, основанную на волатильности (размер интервала), чтобы управлять риском в соответствии с состоянием рынка.
  4. Сильная настройкаПользователь может настроить свой рисково-вознаградительный коэффициент, размер минимального интервала, отслеживать количество стоп-лосс и использовать ли фильтры EMA, чтобы адаптироваться к различным видам торгов и личным предпочтениям риска.
  5. Фильтрация технических показателейВыбор 5-минутного фильтра EMA помогает избежать обратной торговли и улучшить качество торгов.
  6. Ограничение на одну сделку в часВстроенные в стратегию торговые знаки гарантируют выполнение не более одной сделки в каждое время, избегая затрат и рисков, связанных с частотой торгов.

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

Несмотря на разумную конструкцию, существуют следующие потенциальные риски:

  1. Риск ложного проникновения: цена может немедленно отступить после кратковременного прорыва границы между зонами, что приводит к остановке проигрыша. В ответ на этот риск можно рассмотреть возможность добавления механизма подтверждения, например, требуя, чтобы цена после прорыва оставалась в течение определенного времени или достигала определенной величины, прежде чем открывать позицию.
  2. Проблемы с управлением финансамиСтратегия: по умолчанию используется фиксированное количество контрактов для торговли, что может быть не подходит для всех размеров средств. Рекомендуется корректировать размер позиции в зависимости от размера счета и его рискованности.
  3. Риски оптимизации параметров: чрезмерная оптимизация параметров может привести к корректировке кривой, которая плохо отразится на будущих рыночных условиях. Следует обратить внимание на тестирование стабильности параметров.
  4. Зависимость от рыночной средыПримечание: Эта стратегия может часто вызывать остановки на рынках с волатильным рынком и без видимой тенденции. Можно рассмотреть возможность добавления условий фильтрации на рынке.
  5. Проблема с временным поясомВ коде используется часовой пояс Нью-Йорка, но при этом необходимо убедиться, что он соответствует часовому поясу торговой платформы, иначе может привести к неправильному расположению торгового сигнала.
  6. Влияние праздниковОсобые торговые дни и праздничные дни могут повлиять на эффективность стратегии, которая не включает логику фильтрации праздничных дней.

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

На основе анализа стратегии можно выделить следующие направления оптимизации:

  1. Добавление механизма подтверждения: можно рассмотреть возможность добавления дополнительных условий подтверждения после прорыва цены, таких как прорыв объема сделки, сохранение цепочки K в направлении прорыва, чтобы уменьшить убытки, вызванные ложными прорывами.
  2. Динамическое управление капиталомВ зависимости от рыночной волатильности и динамики размеров счетов, размер позиции может быть скорректирован с целью оптимизации рисково-возмездного отношения.
  3. Фильтрация рыночной среды: введение индикатора волатильности или индикатора силы тренда, приостановка торговли в рыночных условиях, не подходящих для стратегии прорыва.
  4. Подтверждение многократного цикла: направление тенденции в сочетании с более длительным временным циклом, торгуйте только в направлении, соответствующем большому тренду.
  5. Оптимизация времени выхода на поле: можно рассмотреть возможность использования ценового отклонения к ключевой поддержке / сопротивлению, а не прямо в точку прорыва, чтобы получить лучшую стоимость.
  6. Добавление фильтра времениАнализируйте историческую производительность в разные торговые дни и периоды времени, избегайте периодов, когда она была низкой.
  7. Анализ многовидовой корреляцииУчитывайте взаимосвязь между различными видами торговли и избегайте одновременного владения несколькими позициями с высокой взаимосвязью.

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

Стратегия количественного трейдинга с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с трейдингом с

Исходный код стратегии
/*backtest
start: 2024-04-27 00:00:00
end: 2025-04-25 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/

//@version=6
strategy("ORB-LD-NY-Trail Strategy", overlay=true,
     default_qty_type=strategy.fixed, default_qty_value=1,
     calc_on_order_fills=true, calc_on_every_tick=true)

// =========================
// USER INPUTS
// =========================
riskReward      = input.float(2.0, "Risk-Reward Ratio", minval=1.0)
minBoxSize      = input.float(2.0, "Minimum Box Size (points)")
trailStopTicks  = input.int(8, "Trailing Stop (ticks)", minval=1)
useEmaFilter    = input.bool(false, "Use 5-min EMA Filter?")

tickSize        = syminfo.mintick         // auto-detect min tick for symbol
trailStopOffset = trailStopTicks * tickSize
emaSource       = request.security(syminfo.tickerid, "5", ta.ema(close, 200))  // 5-min chart EMA

// =========================
// SESSION TIMES
// =========================
londonStart = timestamp("America/New_York", year, month, dayofmonth, 3, 0)
londonEnd   = timestamp("America/New_York", year, month, dayofmonth, 3, 15)
nyStart     = timestamp("America/New_York", year, month, dayofmonth, 9, 30)
nyEnd       = timestamp("America/New_York", year, month, dayofmonth, 9, 45)

inLondon = time >= londonStart and time <= londonEnd
inNY     = time >= nyStart and time <= nyEnd

// =========================
// ONE TRADE PER SESSION FLAGS
// =========================
var bool londonTraded = false
var bool nyTraded     = false

// =========================
// LONDON BOX
// =========================
var float londonHigh    = na
var float londonLow     = na
var float londonBoxHigh = na
var float londonBoxLow  = na

if inLondon
    if na(londonHigh)
        londonBoxHigh := na
        londonBoxLow  := na
        londonTraded  := false
    londonHigh := na(londonHigh) ? high : math.max(londonHigh, high)
    londonLow  := na(londonLow)  ? low  : math.min(londonLow,  low)

if not inLondon and na(londonBoxHigh) and not na(londonHigh) and not na(londonLow)
    londonBoxHigh := londonHigh
    londonBoxLow  := londonLow
    londonHigh    := na
    londonLow     := na

if time > londonEnd and not na(londonBoxHigh) and not londonTraded
    boxRange = londonBoxHigh - londonBoxLow
    if boxRange >= minBoxSize
        // Standard SL/TP logic
        longSL  = londonBoxHigh - boxRange
        longTP  = londonBoxHigh + boxRange * riskReward
        shortSL = londonBoxLow  + boxRange
        shortTP = londonBoxLow  - boxRange * riskReward

        // === LONDON LONG ===
        condLong1 = close[1] <= londonBoxHigh
        condLong2 = close > londonBoxHigh
        condLong3 = (not useEmaFilter) or (close > emaSource)

        if condLong1 and condLong2 and condLong3
            strategy.entry("London Long", strategy.long)
            strategy.exit("Exit London Long", from_entry="London Long",
                          stop=longSL, limit=longTP,
                          trail_points=trailStopOffset)
            londonTraded := true

        // === LONDON SHORT ===
        condShort1 = close[1] >= londonBoxLow
        condShort2 = close < londonBoxLow
        condShort3 = (not useEmaFilter) or (close < emaSource)

        if not londonTraded and condShort1 and condShort2 and condShort3
            strategy.entry("London Short", strategy.short)
            strategy.exit("Exit London Short", from_entry="London Short",
                          stop=shortSL, limit=shortTP,
                          trail_points=trailStopOffset)
            londonTraded := true

// =========================
// NY BOX
// =========================
var float nyHigh    = na
var float nyLow     = na
var float nyBoxHigh = na
var float nyBoxLow  = na

if inNY
    if na(nyHigh)
        nyBoxHigh := na
        nyBoxLow  := na
        nyTraded  := false
    nyHigh := na(nyHigh) ? high : math.max(nyHigh, high)
    nyLow  := na(nyLow)  ? low  : math.min(nyLow,  low)

if not inNY and na(nyBoxHigh) and not na(nyHigh) and not na(nyLow)
    nyBoxHigh := nyHigh
    nyBoxLow  := nyLow
    nyHigh    := na
    nyLow     := na

if time > nyEnd and not na(nyBoxHigh) and not nyTraded
    boxRange = nyBoxHigh - nyBoxLow
    if boxRange >= minBoxSize
        longSL  = nyBoxHigh - boxRange
        longTP  = nyBoxHigh + boxRange * riskReward
        shortSL = nyBoxLow  + boxRange
        shortTP = nyBoxLow  - boxRange * riskReward

        // === NY LONG ===
        condNYLong1 = close[1] <= nyBoxHigh
        condNYLong2 = close > nyBoxHigh
        condNYLong3 = (not useEmaFilter) or (close > emaSource)

        if condNYLong1 and condNYLong2 and condNYLong3
            strategy.entry("NY Long", strategy.long)
            strategy.exit("Exit NY Long", from_entry="NY Long",
                          stop=longSL, limit=longTP,
                          trail_points=trailStopOffset)
            nyTraded := true

        // === NY SHORT ===
        condNYShort1 = close[1] >= nyBoxLow
        condNYShort2 = close < nyBoxLow
        condNYShort3 = (not useEmaFilter) or (close < emaSource)

        if not nyTraded and condNYShort1 and condNYShort2 and condNYShort3
            strategy.entry("NY Short", strategy.short)
            strategy.exit("Exit NY Short", from_entry="NY Short",
                          stop=shortSL, limit=shortTP,
                          trail_points=trailStopOffset)
            nyTraded := true

// Visual session background
bgcolor(inLondon ? color.new(color.fuchsia, 85) : na)
bgcolor(inNY     ? color.new(color.green,   85) : na)