궁극적인 균형 오시레이터 거래 전략

저자:차오장, 날짜: 2024-01-12 14:08:33
태그:

img

전반적인 설명

궁극적 균형 오시일레이터 거래 전략은 여러 기술적 지표의 신호를 현명하게 결합하는 양적 거래 전략입니다. 변화율 (ROC), 상대 강도 지표 (RSI), 상품 채널 지표 (CCI), 윌리엄스 %R 및 평균 방향 지표 (ADX) 과 같은 지표의 힘을 활용하여 복합 오시일레이터를 계산하여 시장 트렌드를 결정하고 거래 신호를 생성합니다.

이 전략의 가장 큰 장점은 최적의 진입 및 출구 지점을 식별하기 위해 객관적이고 체계적으로 시장을 평가 할 수있는 능력에 있습니다. 오시레이터 라인이 0.75 과잉 구매 수준을 넘을 때 구매 신호를 유발하고 0.25 과잉 판매 수준을 넘을 때 출구 신호를 유발합니다.

전략 논리

궁극적 균형 오시일레이터 거래 전략의 핵심은 복합 오시일레이터 지표의 계산입니다. 이 지표를 계산하는 단계는 다음과 같습니다.

  1. 각 기술 지표의 값을 계산합니다: ROC, RSI, CCI, Williams %R, ADX

  2. 비교를 가능하게 하기 위해 이 지표 값들을 0-1 범위로 표준화

  3. 복합 오시일레이터 값을 계산하기 위해 가중 평균 방법론을 사용한다. 각 지표는 조정 가능한 가중치를 가지고 있으며, ROC에 2가, RSI에 0.5가, CCI에 2가, %R에 0.5가, ADX에 0.5가 기본 값이다. 각 표준 지표를 그 무게로 곱하고 합쳐서 전체 무게로 나누면 0-1 복합 값을 얻을 수 있다.

  4. 이 복합 오시일레이터가 적절하게 설정된 과잉 구매 및 과잉 판매 수준을 넘을 때 트레이드 신호를 트리거합니다.

명백한 것처럼 전략은 여러 지표에서 신호를 유연하게 활용하고 체계적으로 처리하여 시장 트렌드를 결정하고 거래 결정을 내립니다. 이것은 단일 지표에서 시장 소음을 피하고 다양한 상황에서 견고한 결정을 유지하는 데 도움이됩니다.

장점

궁극적 균형 오시레이터 거래 전략은 몇 가지 주요 장점을 가지고 있습니다:

  1. 객관적이고 체계적인 시장 분석 방법론을 제공하여 여러 지표를 사용하여 단일 도구의 한계를 극복하고 실행 가능한 양자 기반 신호를 생성합니다.

  2. 진입 및 출구 타이밍 / 정밀을 최적화하여 오시레이터의 정확한 값과 표준화를 통해

  3. 고도로 사용자 정의 가능하고 조정 가능한 지표 가중량 및 매개 변수를 통해 개별 거래 스타일과 시장 조건에 맞게 적응 할 수 있습니다.

  4. 실시간 알림 시스템으로 신규 구매/출출 신호에 대해 거래자에게 알리고 최신 시장 발전에 대한 인식을 보장합니다.

  5. 엄격한 백테스팅 및 최적화 전 실시간 거래 역사 데이터에 대한 성능을 평가하고 전략 개선에 대한 매개 변수를 정밀 조정합니다.

위험성

그 장점에도 불구하고, 실제 적용에서 몇 가지 주요 위험은 다음을 포함합니다:

  1. 이상적 인 매개 변수를 발견하기 위해 광범위한 백테스팅이 필요합니다.

  2. 더 넓은 시장 조건과 감정에 대한 부적절한 범위 설정으로 인해 과판/대입 수준 위험이 있습니다.

  3. 분산 지표는 복합 오시레이터 값을 왜곡 할 위험이 있습니다. 오류 지표의 가중을 제거하거나 낮추는 것을 고려하십시오.

  4. 특정 시장 조건이 성능을 저하시킬 수 있는 양자 모델의 한계

위험을 줄이기 위해 포괄적인 백테스팅, 모델의 한계를 이해하는 캘리브레이션, 라이브 성능을 추적하고 변화하는 조건에 따라 매개 변수 또는 무게를 조정하는 유연성을 강력히 권장합니다. 수동 오버라이드는 때때로 귀중한 것으로 나타납니다.

더 나은 기회

전략을 더 이상 최적화 할 수있는 몇 가지 방법은 다음과 같습니다.

  1. 예측 정확성을 높이기 위해 더 다양한 기술 지표로 다인자 모델을 확장합니다.

  2. 뇌신경망과 같은 기계학습 기술을 적용하여 잠복된 신호를 발견하고 예측 지표 값을 예측합니다.

  3. 수익 보고서와 경제 지표와 같은 기본 데이터를 통합하여 양적 요인을 증가시킵니다.

  4. 변화하는 시장 풍경을 기반으로 가중량 및 설정을 동적으로 변경하기 위해 적응적 매개 변수 조정 도입.

  5. 스톱 로즈 메커니즘을 구축하여 개별 거래의 하락을 적극적으로 제어합니다.

  6. 수량화 된 자본 관리에 대한 계정 크기에 기반한 포지션 사이즈 모델 통합.

결론

궁극적 균형 오시일레이터 거래 전략은 시장 평가에 대한 엄격한 방법론으로 여러 기술적 지표의 본질을 합성하는 탁월한 양적 접근법입니다. 개별 요구 사항에 맞게 엄청난 사용자 정의 가능성으로 소매 체계적 거래자에게 번영 할 수있는 청사진을 제공합니다. 모든 양적 전략과 마찬가지로 시장 환경에서 모델 견고성을 확장하기 위해 백테스팅, 최적화 및 혁신을 통해 끊임없는 향상은 핵심 추구로 남아 있습니다. 전반적으로 전략은 거래 도구 키트를 향상시키고자하는 양자에게 귀중한 지침과 학습을 제공합니다. 그리고 시간이 지남에 따라 모델과 시장의 성숙도가 높아지면 예외적인 성능을 제공해야합니다.


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

// © Julien_Eche

//@version=5
strategy("Ultimate Balance Oscillator Strategy", overlay=true)

// Indicator Weights
weightROC = input.float(2, "Rate of Change (ROC) Weight", group="Weightings")
weightRSI = input.float(0.5, "Relative Strength Index (RSI) Weight", group="Weightings")
weightCCI = input.float(2, "Commodity Channel Index (CCI) Weight", group="Weightings")
weightWilliamsR = input.float(0.5, "Williams %R Weight", group="Weightings")
weightADX = input.float(0.5, "Average Directional Index (ADX) Weight", group="Weightings")

// ROC Settings
rocLength = input.int(20, "Length", minval=1, group="ROC")

// RSI Settings
rsiLength = input.int(14, "Length", minval=1, group="RSI")

// CCI Settings
cciLength = input.int(20, "Length", minval=1, group="CCI")

// Williams %R Settings
williamsRLength = input.int(14, "Length", minval=1, group="Williams %R")

// ADX Settings
adxLength = input.int(14, "ADX Length", minval=1, group="ADX")
adxDiLength = input.int(14, "DI Length", minval=1, group="ADX")

// Source
source_options = input.string("hlc3", "Source", options=["open", "high", "low", "close", "hl2", "hlc3", "ohlc4"])

price_open = request.security(syminfo.tickerid, "D", open)
price_high = request.security(syminfo.tickerid, "D", high)
price_low = request.security(syminfo.tickerid, "D", low)
price_close = request.security(syminfo.tickerid, "D", close)
price_hl2 = request.security(syminfo.tickerid, "D", hl2)
price_hlc3 = request.security(syminfo.tickerid, "D", hlc3)
price_ohlc4 = request.security(syminfo.tickerid, "D", ohlc4)

get_source(source_option) =>
    price = price_close
    if source_option == "open"
        price := price_open
    else if source_option == "high"
        price := price_high
    else if source_option == "low"
        price := price_low
    else if source_option == "close"
        price := price_close
    else if source_option == "hl2"
        price := price_hl2
    else if source_option == "hlc3"
        price := price_hlc3
    else
        price := price_ohlc4
    price

src = get_source(source_options)

// Overbought/Oversold Levels
obLevel = input.float(0.75, "Overbought Level")
osLevel = input.float(0.25, "Oversold Level")

// Calculating the indicators
rocValue = ta.change(close, rocLength)
rsiValue = ta.rsi(close, rsiLength)
cciValue = (src - ta.sma(src, cciLength)) / (0.015 * ta.dev(src, cciLength))
williamsRValue = -100 * (ta.highest(high, williamsRLength) - close) / (ta.highest(high, williamsRLength) - ta.lowest(low, williamsRLength))

dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
    minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
    [plus, minus]

adx(dilen, adxlen) =>
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

adxValue = adx(adxDiLength, adxLength)

// Normalizing the values
normalize(value, min, max) =>
    (value - min) / (max - min)

normalizedROC = normalize(rocValue, ta.lowest(rocValue, rocLength), ta.highest(rocValue, rocLength))
normalizedRSI = normalize(rsiValue, 0, 100)
normalizedCCI = normalize(cciValue, ta.lowest(cciValue, cciLength), ta.highest(cciValue, cciLength))
normalizedWilliamsR = normalize(williamsRValue, ta.lowest(williamsRValue, williamsRLength), ta.highest(williamsRValue, williamsRLength))
normalizedADX = normalize(adxValue, 0, 50)

// Calculating the combined oscillator line
oscillatorLine = (normalizedROC * weightROC + normalizedRSI * weightRSI + normalizedCCI * weightCCI + normalizedWilliamsR * weightWilliamsR + normalizedADX * weightADX) / (weightROC + weightRSI + weightCCI + weightWilliamsR + weightADX)

// Strategy conditions
enterLong = ta.crossover(oscillatorLine, obLevel)
exitLong = ta.crossunder(oscillatorLine, osLevel)

// Strategy orders
if (enterLong)
    strategy.entry("Buy", strategy.long)
if (exitLong)
    strategy.close("Buy")

// Alert conditions
if (enterLong)
    alert("Buy signal")
if (exitLong)
    alert("Exit signal")


더 많은