리소스 로딩... 로딩...

다중 SMA 구역의 파업과 동적 수익 잠금 양적 거래 전략

저자:차오장, 날짜: 2024-12-20 16:28:54
태그:SMA

img

전반적인 설명

이 전략은 SMA 지표에 기반한 동적 트렌드-추천 거래 전략으로, 가격 영역, 스토카스틱 지표 및 여러 이익 보호 메커니즘을 결합합니다. 전략은 서로 다른 영역에서 가격 움직임을 모니터링하고, 단기 및 장기 이동 평균 크로스오버 신호를 통합하고, 효율적인 트렌드 포착을 위해 시장 조건과 트렌드 강도를 결정하기 위해 스토카스틱 지표를 사용합니다. 전략은 수익과 위험을 효과적으로 균형을 맞추기 위해 비율 기반 및 고정 포인트 수익 취득 메커니즘을 모두 통합합니다.

전략 원칙

핵심 논리는 몇 가지 핵심 요소를 포함합니다.

  1. 트렌드 프레임을 구축하기 위해 19주기 및 74주기 SMA를 사용합니다.
  2. 시장 조건을 판단하기 위해 60 기간 스토카스틱 인디케이터를 사용하여 SMA 색상을 노란색, 녹색, 빨간색 및 주황색 상태로 분류합니다.
  3. 가격 강도를 결정하기 위해 가격 구역을 5가지 중요한 수준으로 나눈다.
  4. 입국 조건은 다음을 요한다.
    • 녹색 또는 노란색 상태의 SMA
    • 오렌지 구역 이상 가격 돌파
    • 단기 SMA보다 높은 종료 가격
  5. 이윤을 취득하는 두 가지 메커니즘을 구현합니다.
    • 가장 높은 가격에 대한 비율 기반의 수요 보호
    • 고정점 수익금속

전략적 장점

  1. 다중 확인 메커니즘은 잘못된 신호를 줄입니다.
  2. 동적 구역 분할은 다른 시장 환경에 적응합니다.
  3. 이중 이윤 취득 메커니즘은 더 나은 위험 통제를 제공합니다
  4. 명확한 시장 상태 분류는 시장 리듬을 파악하는 데 도움이됩니다.
  5. 실시간 거래 상태 모니터링은 전략 디버깅을 촉진
  6. 기술 지표와 가격 행동 분석을 결합합니다.

전략 위험

  1. 다양한 시장에서 과도한 거래를 일으킬 수 있습니다.
  2. 고정점 수익은 더 큰 추세를 놓칠 수 있습니다.
  3. 매개 변수 최적화는 과도한 적합으로 이어질 수 있습니다.
  4. 급격한 시장 변동으로 인한 잠재적 이익 손실
  5. 여러 확인 조건이 거래 기회를 놓칠 수 있습니다. 해결책:
  • 변동성 필터를 추가합니다
  • 수익 매개 변수를 동적으로 조정합니다.
  • 시장 환경 인식 강화
  • 출구 타이밍 결정 최적화

전략 최적화 방향

  1. 동적 매개 변수 조정을 위한 변동성 지표를 도입
  2. 시장 상태에 따라 수익을 취하는 조건을 조정
  3. 볼륨 확인 메커니즘 추가
  4. 트렌드 강도 필터를 포함
  5. 시장 특성을 고려하여 구역 분할 방법을 최적화
  6. 다음을 포함한 위험 관리 메커니즘을 강화합니다.
    • 일일 스톱 로스
    • 최대 채용 통제
    • 포지션 보유 시간 제한

요약

이 전략은 여러 가지 기술 지표와 가격 행동 분석 방법을 통합적으로 사용하여 포괄적인 거래 시스템을 구축합니다. 이 전략의 강점은 여러 가지 확인 메커니즘과 유연한 이익 취득 시스템이며, 시장 환경이 전략 성과에 미치는 영향에주의를 기울여야합니다. 지속적인 최적화 및 향상된 위험 관리로 인해 전략은 다른 시장 조건에서 안정적인 성과를 유지할 가능성을 보여줍니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="SMA Color Strategy", 
     overlay=true, 
     initial_capital=10000,
     max_bars_back=5000,
     max_labels_count=500,
     max_boxes_count=500,
     default_qty_type=strategy.fixed,
     default_qty_value=1,
     currency=currency.NONE,
     process_orders_on_close=true)

// === INPUTS ===
zoneLength = input.int(20, "Price Zone Length", minval=5)
profitLockPct = input.float(50, "Profit Lock Percentage", minval=1, maxval=100, step=5) / 100
ticksToLock = input.int(12, "Ticks to Activate Lock", minval=1, tooltip="Number of ticks price must move up to activate tick-based lock")
ticksToSecure = input.int(10, "Ticks to Secure", minval=1, tooltip="Number of ticks to lock in once activated")

// Calculate tick values
tickSize = syminfo.mintick
ticksToLockPoints = ticksToLock * tickSize
ticksToSecurePoints = ticksToSecure * tickSize

// Calculate price zones
h = ta.highest(high, zoneLength)
l = ta.lowest(low, zoneLength)
priceRange = h - l
lvl5 = h
lvl4 = l + (priceRange * 0.75)  // Orange line
lvl3 = l + (priceRange * 0.50)  // Yellow line
lvl2 = l + (priceRange * 0.25)  // Green line
lvl1 = l

// Calculate SMAs
sma19 = ta.sma(close, 19)
sma74 = ta.sma(close, 74)

// Stochastic calculation for color logic
k = ta.stoch(close, high, low, 60)
d = ta.sma(k, 10)

// SMA Color Logic with state tracking
var color currentSMAColor = color.orange
var color previousSMAColor = color.orange
var string currentColorName = "ORANGE"
var string previousColorName = "ORANGE"

smaColor = if d >= 80 or d <= 20
    color.rgb(255, 215, 0)
else if d > d[1]
    color.green
else if d < d[1]
    color.red
else
    color.orange

// Update color state and names
if smaColor != currentSMAColor
    previousSMAColor := currentSMAColor
    currentSMAColor := smaColor
    previousColorName := currentColorName
    currentColorName := if smaColor == color.rgb(255, 215, 0)
        "YELLOW"
    else if smaColor == color.green
        "GREEN"
    else if smaColor == color.red
        "RED"
    else
        "ORANGE"

// Color logic for SMA74
sma74Color = if smaColor == color.rgb(255, 215, 0)
    color.rgb(255, 215, 0)                          
else if sma74 < sma19                               
    color.green
else                                                
    color.red

// === ENTRY CONDITIONS ===
smaIsGreen = smaColor == color.green
greenCandle = close > open
candleAboveOrange = close > lvl4
candleAboveSMA = close > sma19
crossedAboveOrange = ta.crossover(close, lvl4)
smaIsYellow = smaColor == color.rgb(255, 215, 0)

longCondition1 = smaIsGreen and greenCandle and candleAboveOrange and candleAboveSMA and crossedAboveOrange
longCondition2 = smaIsYellow and crossedAboveOrange and candleAboveSMA

// === PROFIT LOCK SYSTEM ===
var float entryPrice = na
var float maxPrice = na
var float profitLockLevel = na
var bool tickLockActivated = false
var float tickBasedLockLevel = na

// Reset variables on new trade entry
if (longCondition1 or longCondition2)
    entryPrice := close
    maxPrice := close
    profitLockLevel := close * (1 - profitLockPct)
    tickLockActivated := false
    tickBasedLockLevel := na

// Update maximum price and profit locks when in a trade
if strategy.position_size > 0
    maxPrice := math.max(maxPrice, high)
    profitLockLevel := math.max(profitLockLevel, maxPrice * (1 - profitLockPct))
    
    // Check if price has moved up enough to activate tick-based lock
    if not tickLockActivated and (maxPrice - entryPrice) >= ticksToLockPoints
        tickLockActivated := true
        tickBasedLockLevel := entryPrice + ticksToSecurePoints

// === EXIT CONDITIONS ===
exitOnYellowLine = close < lvl3
exitOnProfitLock = low < profitLockLevel and strategy.position_size > 0
exitOnTickLock = tickLockActivated and low < tickBasedLockLevel

// === TRADE MANAGEMENT ===
if (longCondition1 or longCondition2)
    strategy.entry("Long", strategy.long)

if strategy.position_size > 0
    if exitOnYellowLine
        strategy.close("Long", comment="Close below yellow")
    if exitOnProfitLock
        strategy.close("Long", comment="Profit lock triggered")
    if exitOnTickLock
        strategy.close("Long", comment="Tick-based lock triggered")

// Plot indicators
plot(sma19, "SMA 19", color=smaColor, linewidth=2)
plot(sma74, "SMA 74", color=sma74Color, linewidth=2)
plot(lvl5, "Upper Zone Top", color=color.red, linewidth=2)
plot(lvl4, "Upper Zone Bottom", color=color.orange, linewidth=2)
plot(lvl3, "Middle Line", color=color.yellow, linewidth=2)
plot(lvl2, "Lower Zone Top", color=color.green, linewidth=2)
plot(lvl1, "Lower Zone Bottom", color=color.blue, linewidth=2)

// Plot profit lock levels
plot(strategy.position_size > 0 ? profitLockLevel : na, "Profit Lock Level", color=color.purple, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 and tickLockActivated ? tickBasedLockLevel : na, "Tick Lock Level", color=color.fuchsia, style=plot.style_linebr, linewidth=2)

// Fill zones
var p1 = plot(lvl5, display=display.none)
var p2 = plot(lvl4, display=display.none)
var p3 = plot(lvl2, display=display.none)
var p4 = plot(lvl1, display=display.none)
fill(p1, p2, color=color.new(color.red, 90))
fill(p3, p4, color=color.new(color.green, 90))

// Debug Table
if barstate.islast
    var table debugTable = table.new(position.top_right, 2, 13, bgcolor=color.new(color.black, 70), frame_width=1)
    
    table.cell(debugTable, 0, 0, "Current Color", text_color=color.white)
    table.cell(debugTable, 1, 0, currentColorName, text_color=currentSMAColor)
    
    table.cell(debugTable, 0, 1, "Previous Color", text_color=color.white)
    table.cell(debugTable, 1, 1, previousColorName, text_color=previousSMAColor)
    
    table.cell(debugTable, 0, 2, "Entry 1 (Green)", text_color=color.white)
    table.cell(debugTable, 1, 2, str.tostring(longCondition1), text_color=color.white)
    
    table.cell(debugTable, 0, 3, "Entry 2 (Yellow)", text_color=color.white)
    table.cell(debugTable, 1, 3, str.tostring(longCondition2), text_color=color.white)
    
    table.cell(debugTable, 0, 4, "Current Position", text_color=color.white)
    table.cell(debugTable, 1, 4, str.tostring(strategy.position_size), text_color=color.white)
    
    table.cell(debugTable, 0, 5, "Entry Price", text_color=color.white)
    table.cell(debugTable, 1, 5, str.tostring(entryPrice), text_color=color.white)
    
    table.cell(debugTable, 0, 6, "Max Price", text_color=color.white)
    table.cell(debugTable, 1, 6, str.tostring(maxPrice), text_color=color.white)
    
    table.cell(debugTable, 0, 7, "Profit Lock Level", text_color=color.white)
    table.cell(debugTable, 1, 7, str.tostring(profitLockLevel), text_color=color.white)
    
    table.cell(debugTable, 0, 8, "Tick Lock Active", text_color=color.white)
    table.cell(debugTable, 1, 8, str.tostring(tickLockActivated), text_color=color.white)
    
    table.cell(debugTable, 0, 9, "Tick Lock Level", text_color=color.white)
    table.cell(debugTable, 1, 9, str.tostring(tickBasedLockLevel), text_color=color.white)
    
    table.cell(debugTable, 0, 10, "Price Move (Ticks)", text_color=color.white)
    table.cell(debugTable, 1, 10, str.tostring(strategy.position_size > 0 ? (maxPrice - entryPrice) / tickSize : 0), text_color=color.white)
    
    table.cell(debugTable, 0, 11, "Locked Profit %", text_color=color.white)
    table.cell(debugTable, 1, 11, str.tostring(strategy.position_size > 0 ? ((maxPrice - entryPrice) / entryPrice * 100) : 0.0) + "%", text_color=color.white)
    
    table.cell(debugTable, 0, 12, "Exit Signals", text_color=color.white)
    table.cell(debugTable, 1, 12, "Y:" + str.tostring(exitOnYellowLine) + " P:" + str.tostring(exitOnProfitLock) + " T:" + str.tostring(exitOnTickLock), text_color=color.white)

관련

더 많은