다중 기술 지표 동적 손절매 선물 거래 전략

EMA ATR FVG BOS HTF ORDER BLOCK Liquidity Sweep
생성 날짜: 2025-04-02 09:41:48 마지막으로 수정됨: 2025-04-02 09:41:48
복사: 0 클릭수: 381
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

다중 기술 지표 동적 손절매 선물 거래 전략 다중 기술 지표 동적 손절매 선물 거래 전략

전략 개요

이 전략은 여러 기술 조건과 더 높은 시간 프레임 분석을 결합하여 높은 확률의 거래 기회를 식별하는 고급 선물 거래 시스템입니다. 이 전략은 여러 기술 조건이 동시에 충족되어야 거래에 진입할 수 있도록 여러 기술 조건에 기반한 방법을 사용합니다.

전략 원칙

이 전략의 핵심은 여러 가지 기술적 분석 방법을 사용하여 여러 지표가 동시에 신호를 제공 할 때만 거래가 이루어지도록 보장하는 것입니다. 구체적으로, 이 전략은 다음과 같은 몇 가지 핵심 구성 요소를 포함합니다.

  1. 공정한 가치 틈 (FVG)- 두 사이에 뚜렷한 가격 격차가 발생했을 때, 시장에서 채우지 않은 공간이 존재할 수 있음을 나타냅니다.
  2. 주문 블록- 이 지역은 가격의 반전으로 결정적인 지역이며, 종종 강력한 거부 으로 나타납니다. 이후 지원 또는 저항 지역이 됩니다.
  3. 유동성 스캔- 시장이 초고기 또는 하락을 통과한 후 반전되는 경우를 식별합니다. 이것은 일반적으로 대형 기관이 유동성을 모으는 것을 나타냅니다.
  4. 구조적 돌파구 (BOS)- 가격이 초기 구조를 깨고 더 높은 고점을 형성하거나 더 낮은 낮은 점을 형성할 때 나타납니다.
  5. 높은 시간 주기 경향 확인- 15분 및 60분 시간 주기 에 EMA (지수 이동 평균) 를 사용하여 전체 경향 방향을 확인 .

전략은 적어도 두 가지 기본 조건 (개발 모드에서는 하나) 과 구조적 돌파 신호가 더해져 더 높은 시간 주기의 경향과 일치하는 경우에만 입문 신호를 생성한다.

위험 관리 측면에서, 이 전략은 ATR (平均真實波幅) 를 사용하여 동적 중지 위치를 설정하며, 중지 거리는 일반적으로 ATR의 1.5배입니다. 이 방법은 높은 파동시 중지 거리를 늘리고 낮은 파동시 거리 줄여서 중단을 더 똑똑하게 만듭니다.

이윤이 끝나는 경우, 전략은 분할 이윤 방식을 채택하여, 위험과 동등한 이익 ((1R) 을 달성했을 때 50%의 지위를 이득으로 삼고, 나머지 지위의 정지를 보금자리로 이동시켜서 위험없는 거래를 할 수 있는 기회를 만듭니다. 또한, 시간 기반의 퇴출 메커니즘이 있으며, 거래가 지정된 시간 (설정된 30 분) 내에 유리한 방향으로 움직이지 않으면 자동으로 폐쇄됩니다.

또한, 이 전략에는 계정 관리 기능이 포함되어 있으며, 계정 수익이 기본 목표 (~ \( 3,000) 에 도달하거나 후속 손실을 유발하면 (~ \) 2,500의 수익을 초과한 계정으로 추적하기 시작하면) 모든 포지션을 자동으로 종료합니다.

전략적 이점

코드의 심층적인 분석을 통해 다음과 같은 몇 가지 분명한 장점을 정리할 수 있습니다.

  1. 다중 인증 시스템- 여러 기술 조건이 동시에 충족되어야 입장이 가능하며, 가짜 신호를 줄이고 거래 품질을 향상시킵니다.
  2. 지능형 위험 관리- ATR 기반의 동적 스톱을 사용하여 고정 점수 또는 퍼센트 스톱보다 시장의 변동성에 더 잘 적응합니다.
  3. 높은 시간 주기 경향 필터- 상위 시간 사이클의 트렌드 방향을 이용해서 트렌드 방향으로만 거래하고 역동적인 거래를 피한다.
  4. 분기 수익 전략- 이윤을 분할하여 수익을 창출하고 손실을 보호 위치로 이동하여 수익의 일부를 고정하고 나머지 포지션에 대한 위험없는 기회를 제공합니다.
  5. 시간 기반 탈퇴 메커니즘- 무효 거래에서 자동으로 탈퇴하고, 동기가 없는 거래에 오랫동안 갇히지 않도록하십시오.
  6. 전체 계정 관리- 수익 목표와 후속 손실을 설정하여 전체 계정 수익을 보호하고 건전한 자금 관리를 달성하십시오.
  7. 매우 적응력이 좋다- 다양한 변수를 통해 높은 유연성을 제공하며, 다양한 시장 상황과 거래 스타일에 따라 조정할 수 있습니다.
  8. 전문 기술 지표 통합- 여러 고급 기술 분석 개념과 결합하여 일반적으로 전문 거래자 만 사용할 수 있습니다.

전략적 위험

이 전략은 훌륭하게 설계되었지만, 다음과 같은 몇 가지 잠재적인 위험이 있습니다.

  1. 매개변수 최적화 위험- 전략은 여러 파라미터 설정에 의존하며, 과잉 최적화가 과잉 적합으로 이어질 수 있다면, 미래 시장 조건에서 좋지 않은 성능을 나타냅니다. 해결책은 충분히 긴 테스트 사이클을 사용하고, 전향 테스트를 수행하는 것입니다.
  2. 시장환경의존성- 이 전략은 트렌드 시장에서 잘 작동할 수 있지만, 간격적인 흔들림 시장에서 더 많은 가짜 신호를 생성할 수 있습니다. 해결책은 시장 환경 필터를 추가하고, 흔들림 시장으로 인식되면 거래 주파수를 조정하거나 거래를 완전히 중단하는 것입니다.
  3. 지점 리스크 실행- 높은 변동성 기간 동안, 입구 및 출구 가격이 예상과 큰 차이가 있을 수 있으며, 전략의 성과에 영향을 미칩니다. 해결책은 재검토에서 실제 슬라이드 포인트를 모의하고 실제 거래에서 시장 가격 대신 제한 가격을 사용하는 것입니다.
  4. 기술 실패의 위험- 자동 거래 시스템은 기술 장애나 네트워크 중단에 직면할 수 있습니다. 해결책은 백업 시스템과 수동 개입 장치를 구축하는 것입니다.
  5. 복잡성 관리- 전략의 복잡성으로 인해 문제를 진단하거나 특정 거래가 왜 실패했는지 이해하는 데 어려움을 겪을 수 있습니다.
  6. 시장 유동성 위험- 특정 시장 조건에서 유동성이 급속히 감소하여 더 큰 슬라이드 또는 포지션에서 벗어날 수 없습니다. 중요한 경제 데이터가 발표되는 동안 거래를 피하거나 포지션 규모를 줄이는 것이 해결책입니다.

전략 최적화 방향

코드의 분석을 바탕으로 몇 가지 잠재적인 최적화 방향은 다음과 같습니다.

  1. 트렌드 인식 강화- 현재 전략은 트렌드를 확인하기 위해 간단한 EMA 교차를 사용하며, 강한 트렌드 시장이 일반적으로 더 나은 거래 기회를 제공하기 때문에 ADX (평균 방향 지수) 와 같은 다른 트렌드 지표를 추가하는 것을 고려할 수 있습니다.
  2. 시장 상태 적응- 시장 상태를 인식하는 메커니즘을 추가하여 다양한 시장 환경 (트렌드, 범위, 높은 변동, 낮은 변동) 에서 전략 매개 변수를 자동으로 조정합니다. 이것은 전략을 더 유연하게 만들어 다른 시장 조건에 적응 할 수 있습니다.
  3. 입학 시점을 최적화- RSI 또는 무작위 지표와 같은 동력 지표를 추가하는 것을 고려하여 트렌드 방향으로 진입하는 것을 보장하고 과도한 과매매 또는 과매매의 경우 진입하는 것을 피하여 역전 위험을 줄이십시오.
  4. 이윤 창출 전략의 개선- 현재 고정된 1R 이익이 너무 보수적이거나 너무 급진적일 수 있으며, 수익 목표가 변동성이나 지지/저항 수준에 따라 동적으로 조정되는 것을 고려할 수 있으며, 변동성이 더 큰 경우 더 먼 목표를 설정할 수 있습니다.
  5. 위험 관리의 정교화- 역동적인 포지션 크기 조정 메커니즘을 도입하여 최근 전략 성과와 시장의 변동성에 따라 자동으로 리스크 을 조정하여 전략이 잘 작동하면 위험을 증가시키고, 좋지 않은 경우 위험을 감소시킵니다.
  6. 시간 필터를 추가하세요- 선물 시장은 다른 기간에 다른 특성을 가지고 있으며, 시간 필터를 추가하면 유동성이 떨어지거나 방향성이 없는 시기를 피할 수 있습니다.
  7. 시장 감정 지표 통합- VIX와 같은 시장 감정 지표를 추가하고, 극단적인 감정의 경우 전략 파라미터를 조정하거나 거래를 중지합니다.
  8. 코드 효율성을 최적화- 현재 코드에 실행 효율성에 영향을 줄 수 있는 몇 가지 순환 작업이 있습니다. 특히 더 작은 시간 프레임에서 이러한 순환을 최적화하면 전략의 응답 속도를 향상시킬 수 있습니다.

요약하다

이것은 잘 설계된 다중 지표 선물 거래 전략으로, 여러 가지 첨단 기술 분석 개념을 통합하고 있으며, 리스크 관리 및 자금 관리 기능을 완벽하게 갖추고 있습니다. 그것은 여러 조건을 동시에 충족시키고 높은 시간 주기 트렌드를 확인하도록 요구하여 가짜 신호를 줄이고, ATR 기반의 동적 중지 손실 및 분기 수익 전략을 사용하여 리스크 수익률을 최적화합니다.

이 전략의 주요 장점은 여러 계층의 확인 시스템과 지능적인 위험 관리로 인해 낮은 위험을 유지하면서 높은 확률의 거래 기회를 잡을 수 있습니다. 그러나 전략의 복잡성은 또한 매개 변수 최적화와 시장 적응성에 대한 도전을 가져오고 지속적인 모니터링과 정기적 인 조정으로 효과를 유지해야합니다.

제안된 최적화 조치를 실행함으로써, 특히 시장 상태에 대한 적응력을 강화하고 위험 관리 시스템을 개선함으로써, 이 전략은 다양한 시장 환경에서 안정적인 성능을 유지할 잠재력을 가지고 있다.

전략 소스 코드
/*backtest
start: 2024-04-02 00:00:00
end: 2025-04-01 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// @version=5
strategy("NQ Futures Trading Strategy", overlay=true, initial_capital=50000, default_qty_type=strategy.cash, default_qty_value=5000)

// ==========================================
// Parameters
// ==========================================

// Account Parameters
accountSize = 50000
profitGoal = 3000
trailingThreshold = 2500
stopsTrailing = 52650

// Trading Parameters
atrLength = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.5, "ATR Multiplier for SL", minval=0.5, maxval=3.0, step=0.1)
timeoutPeriod = input.int(30, "Exit after X minutes if trade doesn't move favorably", minval=5, maxval=120)

// FVG (Fair Value Gap) Parameters
fvgLength = input.int(5, "FVG Look-back Period", minval=2, maxval=20)
fvgThreshold = input.float(0.1, "FVG Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Order Block Parameters
obLength = input.int(5, "Order Block Look-back Period", minval=2, maxval=20)
obThreshold = input.float(0.1, "Order Block Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Liquidity Sweep Parameters
sweepLength = input.int(5, "Liquidity Sweep Look-back Period", minval=2, maxval=20)
sweepThreshold = input.float(0.05, "Sweep Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Break of Structure Parameters
bosLength = input.int(5, "BOS Look-back Period", minval=2, maxval=20)
bosThreshold = input.float(0.05, "BOS Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Debug Mode
debugMode = input.bool(false, "Debug Mode (more signals)")

// Higher Timeframe Trend Parameters
htfPeriod1 = input.timeframe("15", "First Higher Timeframe")
htfPeriod2 = input.timeframe("60", "Second Higher Timeframe")

// ==========================================
// Indicators & Calculations
// ==========================================

// ATR Calculation
atr = ta.atr(atrLength)

// Higher Timeframe EMAs for Trend Determination
htf1_ema20 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf1_ema50 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema20 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema50 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)

// Higher Timeframe Trend
htf1_bullish = htf1_ema20 > htf1_ema50
htf1_bearish = htf1_ema20 < htf1_ema50
htf2_bullish = htf2_ema20 > htf2_ema50
htf2_bearish = htf2_ema20 < htf2_ema50

// ==========================================
// Entry Conditions
// ==========================================

// 1. Fair Value Gap (FVG)
bullishFVG = false
bearishFVG = false

for i = 1 to fvgLength
    if low[i] > high[i+2] and (low[i] - high[i+2]) / high[i+2] > fvgThreshold
        bullishFVG := true
    if high[i] < low[i+2] and (low[i+2] - high[i]) / high[i] > fvgThreshold
        bearishFVG := true

// 2. Inverse Fair Value Gap
inverseBullishFVG = false
inverseBearishFVG = false

for i = 1 to fvgLength
    if high[i+1] < low[i+2] and close[i] > open[i] and close[i] > high[i+1]
        inverseBullishFVG := true
    if low[i+1] > high[i+2] and close[i] < open[i] and close[i] < low[i+1]
        inverseBearishFVG := true

// 3. Order Block / Breaker Block
bullishOrderBlock = false
bearishOrderBlock = false

for i = 1 to obLength
    if close[i+1] < open[i+1] and (open[i+1] - close[i+1]) / close[i+1] > obThreshold and close[i] > open[i]
        bullishOrderBlock := true
    if close[i+1] > open[i+1] and (close[i+1] - open[i+1]) / open[i+1] > obThreshold and close[i] < open[i]
        bearishOrderBlock := true

// 4. Liquidity Sweep
bullishSweep = false
bearishSweep = false

lowestLow = ta.lowest(low, sweepLength+1)
highestHigh = ta.highest(high, sweepLength+1)

if low[1] < lowestLow[2] and close > open
    bullishSweep := true
if high[1] > highestHigh[2] and close < open
    bearishSweep := true

// 5. Break of Structure (BOS)
bullishBOS = false
bearishBOS = false

prevHigh = high[2]
prevLow = low[2]

if high > prevHigh and low[1] < low[2]
    bullishBOS := true
if low < prevLow and high[1] > high[2]
    bearishBOS := true

// Simpler version for debug mode
if debugMode
    bullishBOS := close > open and close > close[1]
    bearishBOS := close < open and close < close[1]

// ==========================================
// Signal Generation
// ==========================================

// Count valid entry conditions
bullishConditions = bullishFVG ? 1 : 0
bullishConditions := bullishConditions + (inverseBullishFVG ? 1 : 0)
bullishConditions := bullishConditions + (bullishOrderBlock ? 1 : 0)
bullishConditions := bullishConditions + (bullishSweep ? 1 : 0)

bearishConditions = bearishFVG ? 1 : 0
bearishConditions := bearishConditions + (inverseBearishFVG ? 1 : 0)
bearishConditions := bearishConditions + (bearishOrderBlock ? 1 : 0)
bearishConditions := bearishConditions + (bearishSweep ? 1 : 0)

// Entry signals (need at least 2 conditions + BOS confirmation)
// In debug mode, require only 1 condition
minConditions = debugMode ? 1 : 2
longSignal = bullishConditions >= minConditions and bullishBOS and (htf1_bullish or htf2_bullish)
shortSignal = bearishConditions >= minConditions and bearishBOS and (htf1_bearish or htf2_bearish)

// Debug mode override for testing
if debugMode
    longSignal := longSignal or (bullishBOS and htf1_bullish)
    shortSignal := shortSignal or (bearishBOS and htf1_bearish)

// ==========================================
// Risk Management
// ==========================================

// Calculate dynamic stop loss based on ATR
longStopDistance = atr * atrMultiplier
shortStopDistance = atr * atrMultiplier

// Default fixed values for testing
if debugMode
    longStopDistance := close * 0.01  // 1% stop
    shortStopDistance := close * 0.01  // 1% stop

// Calculate position size based on risk
nqPointValue = 20  // Each point is $20 for NQ
longPositionSize = math.floor(2000 / (longStopDistance * nqPointValue))
shortPositionSize = math.floor(2000 / (shortStopDistance * nqPointValue))

// Ensure at least 1 contract
longPositionSize := math.max(longPositionSize, 1)
shortPositionSize := math.max(shortPositionSize, 1)

// Variables to track entry time
var int entryTime = 0
var float equityCurve = accountSize

// ==========================================
// Strategy Execution
// ==========================================

// Make sure we don't get multiple signals on the same bar
var longEnteredThisBar = false
var shortEnteredThisBar = false

longEnteredThisBar := false
shortEnteredThisBar := false

// Entry conditions
if longSignal and not longEnteredThisBar and strategy.position_size <= 0
    strategy.close_all()
    strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEnteredThisBar := true
    entryTime := time

if shortSignal and not shortEnteredThisBar and strategy.position_size >= 0
    strategy.close_all()
    strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEnteredThisBar := true
    entryTime := time

// Take profit and stop loss orders
if strategy.position_size > 0
    stopPrice = strategy.position_avg_price - longStopDistance
    takeProfitPrice1 = strategy.position_avg_price + longStopDistance
    strategy.exit("Long TP1", "Long", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if high >= takeProfitPrice1
        strategy.exit("Long BE", "Long", stop=strategy.position_avg_price)

if strategy.position_size < 0
    stopPrice = strategy.position_avg_price + shortStopDistance
    takeProfitPrice1 = strategy.position_avg_price - shortStopDistance
    strategy.exit("Short TP1", "Short", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if low <= takeProfitPrice1
        strategy.exit("Short BE", "Short", stop=strategy.position_avg_price)

// Time-based exit
if strategy.position_size != 0
    currentTime = time
    if (currentTime - entryTime) >= timeoutPeriod * 60000  // Convert minutes to milliseconds
        strategy.close_all(comment="Time Exit")

// ==========================================
// Trailing Stop for Account Management
// ==========================================

// Update equity curve
equityCurve := strategy.equity

// Check if profit target is reached or trailing stop is hit
if strategy.equity >= accountSize + profitGoal
    strategy.close_all(comment="Profit Goal")

if strategy.equity >= accountSize + trailingThreshold
    trailingStop = math.max(accountSize, strategy.equity - trailingThreshold)
    if strategy.equity <= trailingStop
        strategy.close_all(comment="Trailing Stop")

// Stop trailing if account reaches the stop trailing threshold
if strategy.equity >= stopsTrailing
    strategy.close_all(comment="Stop Trailing")

// ==========================================
// Plotting
// ==========================================

// Plot entry conditions
plotshape(longSignal, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortSignal, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot current position
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : strategy.position_size < 0 ? color.new(color.red, 90) : na)

// Alert conditions
alertcondition(longSignal, title="Long Entry Signal", message="NQ LONG ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(shortSignal, title="Short Entry Signal", message="NQ SHORT ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and high >= strategy.position_avg_price + longStopDistance, title="Long Take Profit", message="NQ LONG TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and low <= strategy.position_avg_price - shortStopDistance, title="Short Take Profit", message="NQ SHORT TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and low <= strategy.position_avg_price - longStopDistance, title="Long Stop Loss", message="NQ LONG SL: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and high >= strategy.position_avg_price + shortStopDistance, title="Short Stop Loss", message="NQ SHORT SL: {{ticker}}, Price: {{close}}")