런던과 뉴욕 듀얼 세션 돌파 트레일링 스톱로스 양적 거래 전략

ORB EMA SL TP RRR 交易会话 追踪止损 价格突破 风险管理
생성 날짜: 2025-04-27 11:32:24 마지막으로 수정됨: 2025-04-27 11:32:24
복사: 2 클릭수: 334
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

런던과 뉴욕 듀얼 세션 돌파 트레일링 스톱로스 양적 거래 전략 런던과 뉴욕 듀얼 세션 돌파 트레일링 스톱로스 양적 거래 전략

개요

양 시간대 오프닝 영역을 뚫고 스톱 손실을 추적하는 양적 거래 전략은 런던과 뉴욕 거래 시간대 오프닝 15분 전의 가격 영역을 기반으로 한 브레이크 거래 시스템이다. 이 전략은 두 주요 금융 센터의 오프닝 초반의 가격 동력을 포착하여 가격이 처음 15분 동안 형성된 최고점이나 낮은 시점에 진입하여 거래한다. 전략의 핵심 특징은 손실을 추적하는 스톱 메커니즘을 적용하여 수익을 보호하면서 수익을 지속적으로 증가시킬 수 있습니다. 이 전략은 동시에 거래 품질을 높이기 위해 선택 가능한 균일 선 필터링 조건을 제공합니다.

전략 원칙

이 전략의 작동 메커니즘은 두 가지 중요한 시간대에 걸쳐 진행됩니다. 런던 시장이 열립니다 (뉴욕 시간 3시 ~ 3시 15분) 그리고 뉴욕 시장이 열립니다 (뉴욕 시간 9시 30분 ~ 9시 45분). 전략 작업 과정은 다음과 같습니다.

  1. 런던과 뉴욕의 상장 15분 동안의 최고점과 최저점을 각각 기록하여 “가격 구간”을 형성합니다.
  2. 가격 범위가 형성되면, 전략은 범위의 크기가 최소 요구 사항을 충족하는지 확인합니다.
  3. 가격이 하향에서 범위를 돌파하고 EMA 필터 조건을 충족하면 더 많은 포지션을 열 수 있습니다.
  4. 가격이 상향에서 하향으로 하위 하위 하위점을 돌파하고 EMA 필터 조건을 충족하면 (-) 가 활성화되면 포지션을 공백합니다.
  5. 스톱 손실은 파격 방향에 반대되는 가격 범위의 경계 바깥에 있는 1개의 범위 높이의 위치에 설정됩니다.
  6. 스톱 목표값은 리스크 수익률 (default 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)