伦敦纽约双时段突破追踪止损量化交易策略

ORB EMA SL TP RRR 交易会话 追踪止损 价格突破 风险管理
创建日期: 2025-04-27 11:32:24 最后修改: 2025-04-27 11:32:24
复制: 1 点击次数: 43
avatar of ianzeng123 ianzeng123
2
关注
50
关注者

伦敦纽约双时段突破追踪止损量化交易策略 伦敦纽约双时段突破追踪止损量化交易策略

概述

双时段开盘区间突破追踪止损量化交易策略是一种基于伦敦和纽约交易时段开盘前15分钟价格区间的突破交易系统。该策略通过捕捉这两个主要金融中心开盘初期的价格动量,在价格突破首15分钟形成的高点或低点时进入相应方向的交易。策略的核心特点是采用追踪止损机制,在保护盈利的同时,能够让利润持续增长。该策略同时提供了可选的均线过滤条件,以提高交易质量。

策略原理

该策略的运行机制围绕两个关键时间段展开:伦敦市场开盘(纽约时间3:00-3:15)和纽约市场开盘(纽约时间9: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)
相关推荐