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

보린거 밴드 및 촛불 패턴에 기초한 고급 트렌드 거래 전략

저자:차오장, 날짜: 2024-11-27
태그:BBATRRRPSRMASDWBR

img

전반적인 설명

이 전략은 볼링거 밴드 및 촛불 패턴 분석을 기반으로하는 트렌드-추천 전략이다. 이 전략은 주로 가격이 볼링거 밴드에 닿을 때 촛불 패턴을 관찰함으로써 잠재적인 시장 반전 지점을 식별하며, 빗과 몸 사이의 비율 관계와 결합합니다. 또한 이 전략은 거래 당 노출을 제어하기 위해 고정 리스크 모델을 사용하고 거래 정확성을 향상시키기 위해 여러 시간 프레임 분석을 사용합니다.

전략 원칙

전략의 핵심 논리는 몇 가지 핵심 요소에 기반합니다. 첫째, 가격 변동성 범위를 결정하기 위해 20 기간 동안 볼링거 밴드를 계산합니다. 둘째, 가격이 볼링거 밴드에 닿을 때, 비율이 설정된 임계치를 초과 할 때 잠재적 인 역전 신호로 간주하여 상부 / 하부 빗자루와 촛불 몸 사이의 비율을 분석합니다. 셋째, 스톱 로스 배치에 대한 주요 지원 및 저항 수준을 계산합니다. 마지막으로, 동적 리스크 관리를 구현하여 계정 잔액의 일정한 비율 (1%) 을 기반으로 각 거래에 대한 위치 크기를 계산합니다. 전략은 또한 폐쇄 가격, 개시 가격, 일일 최고 및 일일 낮은 입점 가격을 포함한 다양한 타이밍 옵션을 제공합니다.

전략적 장점

  1. 정확한 위험 관리: 거래당 통제된 위험 노출을 보장하는 고정 비율의 위험 관리 모델을 사용합니다.
  2. 유연한 입시점: 다양한 거래 스타일을 수용하기 위해 여러 입시 가격 옵션을 제공합니다.
  3. 기술 지표 조합: 신호 신뢰성을 향상시키기 위해 볼링거 밴드와 촛불 패턴 분석을 결합합니다.
  4. 합리적인 스톱 로스 배치: 주요 지원 및 저항 수준에 따라 스톱 로스를 설정하고 시장 역동에 맞춰
  5. 종합적인 거래 관리: 잘못된 신호를 피하기 위한 주문 만료 메커니즘을 포함합니다.

전략 위험

  1. 급격한 시장 변동 위험: 위크 비율은 변동성 시장에서 잘못된 신호를 생성 할 수 있습니다.
  2. 자금 관리 위험: 고정 비율 위험 모델은 연속 손실 후 부적절한 포지션으로 이어질 수 있습니다.
  3. 스톱 로스 투입 위험: 특정 시장 조건에서 지원 및 저항 계산이 정확하지 않을 수 있습니다.
  4. 시간적 의존성: 주로 일일 시간적 틀에 기반을 둔 전략은 더 작은 시간적 틀에서 기회를 놓칠 수 있습니다.

전략 최적화 방향

  1. 부피 지표를 포함: 신뢰성을 향상시키기 위해 신호 확인을 위해 부피 분석을 추가
  2. 스톱 로스 메커니즘을 최적화: 시장 변동성에 따라 조정되는 동적 스톱 로스 구현을 고려하십시오.
  3. 시장 환경 필터를 추가합니다. 다른 시장 조건에서 전략 매개 변수를 조정하기 위해 트렌드 강도 지표를 포함합니다.
  4. 포지션 관리 개선: 시장 변동성에 기초한 동적 포지션 크기를 구현하는 것을 고려
  5. 시간 필터를 추가합니다. 매우 변동적인 시장 세션에서 거래를 피하기 위해 시간 필터를 포함합니다.

요약

이 전략은 비교적 포괄적인 거래 시스템을 구축하기 위해 고전적인 기술 분석 도구와 현대적인 위험 관리 방법을 결합합니다. 핵심 장점은 엄격한 위험 통제와 유연한 진입 메커니즘에 있으며, 실제 응용 분야에서의 시장 환경 변화와 신호 신뢰성 검증에주의를 기울여야합니다. 제안된 최적화 방향을 통해 특히 신호 필터링 및 위험 관리 측면에서 추가 개선의 여지가 있습니다.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-11-26 00:00:00
period: 12h
basePeriod: 12h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trade Entry Detector, based on Wick to Body Ratio when price tests Bollinger Bands", overlay=true, default_qty_type=strategy.fixed)

// Input for primary analysis time frame
timeFrame = "D"  // Daily time frame

// Bollinger Band settings
length = input.int(20, title="Bollinger Band Length", minval=1)
mult = input.float(2.0, title="Standard Deviation Multiplier", minval=0.1)
source = input(close, title="Source")

// Entry ratio settings
wickToBodyRatio = input.float(1.0, title="Minimum Wick-to-Body Ratio", minval=0)

// Order Fill Timing Option
fillOption = input.string("Daily Close", title="Order Fill Timing", options=["Daily Close", "Daily Open", "HOD", "LOD"])

// Account and risk settings
accountBalance = 100000  // Account balance in dollars
riskPercentage = 1.0     // Risk percentage per trade
riskAmount = (riskPercentage / 100) * accountBalance // Fixed 1% risk amount

// Request daily data for calculations
dailyHigh = request.security(syminfo.tickerid, timeFrame, high)
dailyLow = request.security(syminfo.tickerid, timeFrame, low)
dailyClose = request.security(syminfo.tickerid, timeFrame, close)
dailyOpen = request.security(syminfo.tickerid, timeFrame, open)

// Calculate Bollinger Bands on the daily time frame
dailyBasis = request.security(syminfo.tickerid, timeFrame, ta.sma(source, length))
dailyDev = mult * request.security(syminfo.tickerid, timeFrame, ta.stdev(source, length))
dailyUpperBand = dailyBasis + dailyDev
dailyLowerBand = dailyBasis - dailyDev

// Calculate the body and wick sizes on the daily time frame
dailyBodySize = math.abs(dailyOpen - dailyClose)
dailyUpperWickSize = dailyHigh - math.max(dailyOpen, dailyClose)
dailyLowerWickSize = math.min(dailyOpen, dailyClose) - dailyLow

// Conditions for a candle with an upper wick or lower wick that touches the Bollinger Bands
upperWickCondition = (dailyUpperWickSize / dailyBodySize >= wickToBodyRatio) and (dailyHigh > dailyUpperBand)
lowerWickCondition = (dailyLowerWickSize / dailyBodySize >= wickToBodyRatio) and (dailyLow < dailyLowerBand)

// Define the swing high and swing low for stop loss placement
var float swingLow = na
var float swingHigh = na

if (ta.pivothigh(dailyHigh, 5, 5))
    swingHigh := dailyHigh[5]

if (ta.pivotlow(dailyLow, 5, 5))
    swingLow := dailyLow[5]

// Determine entry price based on chosen fill option
var float longEntryPrice = na
var float shortEntryPrice = na

if lowerWickCondition
    longEntryPrice := fillOption == "Daily Close" ? dailyClose :
                      fillOption == "Daily Open" ? dailyOpen :
                      fillOption == "HOD" ? dailyHigh : dailyLow

if upperWickCondition
    shortEntryPrice := fillOption == "Daily Close" ? dailyClose :
                       fillOption == "Daily Open" ? dailyOpen :
                       fillOption == "HOD" ? dailyHigh : dailyLow

// Execute the long and short entries with expiration
var int longOrderExpiry = na
var int shortOrderExpiry = na

if not na(longEntryPrice)
    longOrderExpiry := bar_index + 2  // Order expires after 2 days

if not na(shortEntryPrice)
    shortOrderExpiry := bar_index + 2  // Order expires after 2 days

// Check expiration and execute orders
if (longEntryPrice and bar_index <= longOrderExpiry and high >= longEntryPrice)
    longStopDistance = close - nz(swingLow, close)
    longPositionSize = longStopDistance > 0 ? riskAmount / longStopDistance : na
    if (not na(longPositionSize))
        strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEntryPrice := na  // Reset after entry

if (shortEntryPrice and bar_index <= shortOrderExpiry and low <= shortEntryPrice)
    shortStopDistance = nz(swingHigh, close) - close
    shortPositionSize = shortStopDistance > 0 ? riskAmount / shortStopDistance : na
    if (not na(shortPositionSize))
        strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEntryPrice := na  // Reset after entry

// Exit logic: hit the opposing Bollinger Band
if (strategy.position_size > 0) // Long position
    strategy.exit("Exit Long", "Long", limit=dailyUpperBand)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Exit Short", "Short", limit=dailyLowerBand)

if (strategy.position_size > 0) // Long position
    strategy.exit("Stop Loss Long", "Long", stop=swingLow)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Stop Loss Short", "Short", stop=swingHigh)

// Plot daily Bollinger Bands and levels on the chosen time frame
plot(dailyUpperBand, color=color.blue, linewidth=1, title="Daily Upper Bollinger Band")
plot(dailyLowerBand, color=color.blue, linewidth=1, title="Daily Lower Bollinger Band")
plot(dailyBasis, color=color.gray, linewidth=1, title="Daily Middle Bollinger Band")


관련

더 많은