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

동적 지원 및 저항 거래 시스템과 함께 적응 채널 브레이크업 전략

저자:차오장, 날짜: 2025-01-06 11:40:35
태그:SRATRRRSLTPMA

img

전반적인 설명

이 전략은 지원 및 저항 수준을 기반으로 한 고급 거래 시스템으로, 동적 트렌드 채널과 위험 관리 기능을 결합합니다. 전략은 특정 뷰백 기간 동안 가격 변동 최고 및 최저치를 분석하여 주요 지원 및 저항 수준을 식별하고, 동적 거래 범위를 구축하기 위해 채널 너비 매개 변수를 활용하여 거래자에게 명확한 시장 구조 관점과 정확한 거래 신호를 제공합니다.

전략 원칙

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

  1. 지원 및 저항 레벨은 사용자 정의 후보 기간 내 가장 낮은 가격과 가장 높은 가격에 기초하여 계산됩니다.
  2. 동적 채널 너비는 지지 및 저항 수준에 기초하여 상부 및 하부 채널을 구축하는 비율 매개 변수를 통해 설정됩니다
  3. 구매 신호는 가격이 지원 수준에 접근할 때 발사됩니다. (거리가 1% 이내)
  4. 이 시스템은 사용자가 정의한 비율을 기반으로 자동으로 스톱 로스 및 트레이프 레벨을 계산합니다.
  5. 거래는 지정된 백테스팅 시간 범위 내에서만 실행됩니다.
  6. 리스크/이익 비율은 실시간으로 계산되고 표시되어 거래자가 리스크에 대한 잠재적 수익을 평가하는 데 도움이 됩니다.

전략적 장점

  1. 높은 적응력: 지원 및 저항 수준은 시장 변화에 동적으로 조정되며 다른 시장 환경에 적응합니다.
  2. 포괄적 리스크 관리: 스톱 로스, 테이크 노프트, 리스크 리워드 비율 계산을 시각화와 통합합니다.
  3. 명확한 거래 신호: 주관적 판단의 영향을 줄이는 명확한 입시 신호를 제공합니다.
  4. 우수한 시각화: 다양한 가격 수준은 다양한 색상 라인과 라벨을 통해 직관적으로 표시됩니다.
  5. 유연한 매개 변수: 개인 거래 스타일과 시장 특성에 따라 매개 변수를 조정할 수 있습니다.

전략 위험

  1. 시장 변동성 위험: 매우 변동적인 시장에서 과도한 거래 신호를 유발할 수 있습니다.
  2. 가짜 브레이크 위험: 가격 지원 수준에 접근하면 잘못된 신호로 이어지는 잘못된 브레이크로 이어질 수 있습니다.
  3. 매개 변수 민감도: 전략 성능은 룩백 기간과 채널 너비 설정에 크게 의존합니다.
  4. 단방향 거래 제한: 현재는 긴 포지션만 지원하고, 잠재적으로 짧은 기회를 놓치고 있습니다.
  5. 시간 의존성 (Time Dependence): 전략의 효과는 지정된 백트테스팅 시간 범위로 제한됩니다.

전략 최적화 방향

  1. 트렌드 필터를 추가: 반 트렌드 신호를 필터링하기 위해 이동 평균 또는 추진력 표시기를 포함
  2. 완전한 거래 방향: 전략의 포괄성을 향상시키기 위해 짧은 거래 논리를 추가
  3. 신호 생성 최적화: 가격 파업 유효성을 확인하기 위해 볼륨 지표를 통합
  4. 동적 스톱 로스 설정: ATR 또는 변동성에 따라 동적으로 스톱 로스 거리를 조정합니다.
  5. 포지션 관리 개선: 위험/이익 비율 및 시장 변동성에 따라 포지션 크기를 동적으로 조정합니다.

요약

이 전략은 논리적으로 엄격하고 위험 통제 된 거래 시스템을 구축하기 위해 주요 기술 분석 개념 - 지원 / 저항 수준 및 트렌드 채널을 결합합니다. 전략의 강점은 적응력과 포괄적 인 위험 관리에 있습니다. 그러나 거래자는 여전히 시장 조건과 개인 위험 관용에 따라 매개 변수를 신중하게 조정해야합니다. 제안된 최적화 방향을 통해 전략은 추가 개선의 여지가 있으며 더 포괄적이고 견고한 거래 시스템으로 발전 할 수 있습니다.


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

//@version=5
strategy("Support and Resistance with Trend Lines and Channels", overlay=true)

// Inputs
lookback = input.int(20, title="Lookback Period for Support/Resistance", minval=1)
channelWidth = input.float(0.01, title="Channel Width (%)", minval=0.001) / 100
startDate = input(timestamp("2023-01-01 00:00"), title="Backtesting Start Date")
endDate = input(timestamp("2023-12-31 23:59"), title="Backtesting End Date")

// Check if the current bar is within the testing range
inTestingRange = true

// Support and Resistance Levels
supportLevel = ta.lowest(low, lookback)  // Swing low (support)
resistanceLevel = ta.highest(high, lookback)  // Swing high (resistance)

// Trend Lines and Channels
var line supportLine = na
var line resistanceLine = na
var line upperChannelLine = na
var line lowerChannelLine = na

// Calculate channel levels
upperChannel = resistanceLevel * (1 + channelWidth)  // Upper edge of channel
lowerChannel = supportLevel * (1 - channelWidth)  // Lower edge of channel

// Create or update the support trend line
// if na(supportLine)
//     supportLine := line.new(bar_index, supportLevel, bar_index + 1, supportLevel, color=color.green, width=2, extend=extend.right)
// else
//     line.set_y1(supportLine, supportLevel)
//     line.set_y2(supportLine, supportLevel)

// // Create or update the resistance trend line
// if na(resistanceLine)
//     resistanceLine := line.new(bar_index, resistanceLevel, bar_index + 1, resistanceLevel, color=color.red, width=2, extend=extend.right)
// else
//     line.set_y1(resistanceLine, resistanceLevel)
//     line.set_y2(resistanceLine, resistanceLevel)

// // Create or update the upper channel line
// if na(upperChannelLine)
//     upperChannelLine := line.new(bar_index, upperChannel, bar_index + 1, upperChannel, color=color.blue, width=1, style=line.style_dashed, extend=extend.right)
// else
//     line.set_y1(upperChannelLine, upperChannel)
//     line.set_y2(upperChannelLine, upperChannel)

// // Create or update the lower channel line
// if na(lowerChannelLine)
//     lowerChannelLine := line.new(bar_index, lowerChannel, bar_index + 1, lowerChannel, color=color.purple, width=1, style=line.style_dashed, extend=extend.right)
// else
//     line.set_y1(lowerChannelLine, lowerChannel)
//     line.set_y2(lowerChannelLine, lowerChannel)

// Buy Condition: When price is near support level
buyCondition = close <= supportLevel * 1.01 and inTestingRange
if buyCondition
    strategy.entry("Buy", strategy.long)

// Stop Loss and Take Profit
stopLossPercentage = input.float(1.5, title="Stop Loss Percentage", minval=0.0) / 100
takeProfitPercentage = input.float(3.0, title="Take Profit Percentage", minval=0.0) / 100

var float longStopLoss = na
var float longTakeProfit = na
if strategy.position_size > 0
    longStopLoss := strategy.position_avg_price * (1 - stopLossPercentage)
    longTakeProfit := strategy.position_avg_price * (1 + takeProfitPercentage)
    strategy.exit("Exit Buy", "Buy", stop=longStopLoss, limit=longTakeProfit)

// Visualize Entry, Stop Loss, and Take Profit Levels
var float entryPrice = na
if buyCondition
    entryPrice := close
if not na(entryPrice)
    label.new(bar_index, entryPrice, text="Entry: " + str.tostring(entryPrice, "#.##"), style=label.style_label_up, color=color.green, textcolor=color.white)

if strategy.position_size > 0
    line.new(bar_index, longStopLoss, bar_index + 1, longStopLoss, color=color.red, width=1, extend=extend.right)
    line.new(bar_index, longTakeProfit, bar_index + 1, longTakeProfit, color=color.blue, width=1, extend=extend.right)

// Risk-to-Reward Ratio (Optional)
if not na(entryPrice) and not na(longStopLoss) and not na(longTakeProfit)
    riskToReward = (longTakeProfit - entryPrice) / (entryPrice - longStopLoss)
    label.new(bar_index, entryPrice, text="R:R " + str.tostring(riskToReward, "#.##"), style=label.style_label_up, color=color.yellow, textcolor=color.black, size=size.small)

관련

더 많은