VAWSI와 동적 길이 계산을 결합한 추세 지속성 반전 전략을 결합한 다중 지표 종합 분석 시스템

VAWSI ATR RSI WMA SMA RMA
생성 날짜: 2024-06-21 15:36:43 마지막으로 수정됨: 2024-06-21 15:36:43
복사: 4 클릭수: 567
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

VAWSI와 동적 길이 계산을 결합한 추세 지속성 반전 전략을 결합한 다중 지표 종합 분석 시스템

개요

이 전략은 여러 지표들을 결합한 종합적인 분석 시스템으로, 주로 VAWSI (대량 및 ATR 가중 강도 지수), 트렌드 지속성 지표, 그리고 수정된 ATR을 기반으로 시장의 추세와 가능한 반전점을 판단한다. 이 전략은 또한 다양한 시장 조건에 적응하기 위해 동적 길이를 계산한다. 동적의 중지 및 이익을 설정하여 위험을 관리하고 잠재적인 반전 신호를 식별할 때 거래를 한다.

이 전략의 핵심은 시장 추세의 강도, 지속 기간 및 변동성을 측정하는 여러 사용자 정의 지표를 통해 최적의 거래 시점을 찾는 것입니다. 그것은 특히 명백한 추세가있는 시장에 적합하지만 다른 시장 상태를 다루는 적응 메커니즘을 포함합니다.

전략 원칙

  1. VAWSI 지표: 이것은 RSI와 비슷한 원시 지표이지만 RMA 대신 VAWMA를 사용한다. 이는 신흥 트렌드의 강도를 측정한다.

  2. 트렌드 지속성 지표: 트렌드가 지속되는 시간을 측정하는 또 다른 원시 지표. 소스 데이터와 지정된 길이의 최고/최저 지점의 최대 오차를 계산하고 그 오차를 축적하여 강도 지수를 만듭니다.

  3. 수정 버전 ATR: 높은-저한 및 소원-전 1 소원의 소원의 최대값을 취하고, 그 변화의 절대값을 취하고 소스 데이터로 통합한다.

  4. 동적 길이 계산: BlackCat1402의 동적 길이 계산 방법을 사용하여, 시장 조건에 따라 지표의 길이 파라미터를 조정한다.

  5. 종합 분석: VAWSI, 트렌드 지속성 및 ATR의 판독을 결합하여 종합 지표를 생성한다. 낮은 최종 값은 반전이 임박하고, 높은 값은 시장의 불안정성 또는 흔들림을 나타냅니다.

  6. 동적 손실/이익: 종합 지표와 현재 트렌드 방향에 기초하여 계산된 동적 손실과 이득 수준.

  7. 거래 신호: 가격이 계산된 하락선을 완전히 통과했을 때, 시스템은 교차를 확인하고 거래 신호를 생성한다.

전략적 이점

  1. 다차원 분석: 여러 지표를 결합하여 전략은 다양한 관점에서 시장을 분석하여 판단의 정확성을 높일 수 있습니다.

  2. 자기 적응성: 동적 연장 계산은 전략이 다른 시장 조건에 적응할 수 있도록 해 전략의 유연성을 강화한다.

  3. 위험 관리: 동적 중지 및 이익 설정은 위험을 더 잘 통제하고 시장 변화에 적응하는 데 도움이됩니다.

  4. 독창적인 지표: VAWSI와 트렌드 지속성 지표는 독특한 시장 통찰력을 제공하며, 전통적인 지표가 무시하는 신호를 잡을 수 있습니다.

  5. 다시 그리는 것을 방지: barstate.isconfirmed를 사용하여 신호가 다시 그리지 않도록 하여 재측정 정확도를 높인다.

  6. 사용자 정의: 여러 파라미터를 조정하여 전략이 다른 거래 종류와 시간 프레임에 맞게 조정할 수 있습니다.

전략적 위험

  1. 과도한 최적화: 많은 변수들로 인해 과도한 최적화가 발생할 수 있으며, 실판 거래에서 좋지 않은 성능을 나타낼 수 있다.

  2. 시장 적응성: 일부 시장에서 잘 작동하지만, 모든 시장 조건에 적용되지 않을 수 있습니다. 특히 변동성이 낮은 시장에서.

  3. 복잡성: 전략의 복잡성은 이해와 유지보수를 어렵게 만들 수 있으며, 운영 오류의 위험을 증가시킵니다.

  4. 컴퓨팅 밀도: 여러 사용자 정의 지표와 동적 계산으로 인해 높은 컴퓨팅 부하가 발생하여 실행 속도에 영향을 미칠 수 있습니다.

  5. 역사 데이터 의존: 전략은 많은 역사 데이터를 사용하여 계산을 수행하며, 경우에 따라서는 지연으로 이어질 수 있습니다.

최적화 방향

  1. 변수 최적화: 다양한 무게와 길이 변수를 최적화하기 위해 기계 학습 알고리즘을 사용하여 다양한 시장 조건에서 전략의 성능을 향상시킵니다.

  2. 시장 상태 인식: 시장 상태 인식 모듈을 추가하여 다양한 시장 환경에서 전략 매개 변수를 자동으로 조정할 수 있습니다.

  3. 신호 필터링: 가짜 신호를 줄이기 위해 트렌드 강도 값과 같은 추가 필터링 메커니즘을 도입한다.

  4. 거래량 분석: 거래량에 대한 분석을 심화하고, 거래량 형태를 인식하여 신호의 신뢰성을 강화할 수 있다.

  5. 다중 시간 프레임 분석: 거래 결정의 안정성을 높이기 위해 여러 시간 프레임의 신호를 통합합니다.

  6. 리스크 관리 최적화: 동적 포지션 사이징과 다단계 손실 중단과 같은 더 복잡한 리스크 관리 전략을 구현합니다.

  7. 컴퓨팅 효율성: 특히 많은 양의 역사 데이터를 처리할 때, 컴퓨팅 효율성을 높이기 위해 코드를 최적화하십시오.

요약하다

VAWSI와 트렌드 지속 역전 전략은 여러 가지 혁신적인 지표와 동적 변수 조정을 결합한 복잡하고 포괄적인 거래 시스템입니다. 그것의 장점은 다차원 시장 분석과 자기 적응성이므로 다양한 시장 조건에서 잠재적인 역전 기회를 찾을 수 있습니다. 그러나 전략의 복잡성은 과도한 최적화와 적응성에 대한 도전을 가져옵니다.

추가적인 최적화, 특히 매개 변수 조정, 시장 상태 인식 및 위험 관리에서 이 전략은 강력한 거래 도구가 될 잠재력을 가지고 있습니다. 그러나 사용자는 어떤 전략도 완벽하지 않으며 지속적인 모니터링과 조정이 필요하다는 것을 유의해야합니다. 실제 응용에서는 시뮬레이션 계정에서 충분한 테스트를 수행하고 다른 분석 도구와 시장 지식과 결합하여 거래 결정을 내리는 것이 좋습니다.

전략 소스 코드
/*backtest
start: 2024-05-21 00:00:00
end: 2024-06-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("VAWSI and Trend Persistance Reversal", overlay=true, max_bars_back = 4999, process_orders_on_close = true)


//INPUTS
sltp = input.float(title = "Minimum SL/TP", defval = 5.0)
rsi_weight = input.float(title = "Wawsi weight", defval = 100.0)
half_weight= input.float(title = "Trend Persistence Weight", defval = 79.0)
atr_weight = input.float(title = "ATR Weight", defval = 20.0)
com_mult = input.float(title = "Combination Mult", defval = 1, step = .001)
smoothing = input.int(title = "Trend Persistence smooth length", defval = 3)
CycPart = input.float(1.1, step = .001, title = "Length Cycle Decimal")
src = close
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)

//BlackCat1402's Dynamic Length Calculation
EhlersHoDyDC(Price, CycPart) =>
    // Vars: 
    Smooth = 0.00
    Detrender = 0.00
    I1 = 0.00
    Q1 = 0.00
    jI = 0.00
    jQ = 0.00
    I2 = 0.00
    Q2 = 0.00
    Re = 0.00
    Im = 0.00
    Period = 0.00
    SmoothPeriod = 0.00
    pi = 2 * math.asin(1)
    DomCycle = 0.0

    //Hilbert Transform
    Smooth := bar_index > 5 ? (4 * Price + 3 * nz(Price[1]) + 2 * nz(Price[2]) + nz(Price[3])) / 10 : Smooth
    Detrender := bar_index > 5 ? (.0962 * Smooth + .5769 * nz(Smooth[2]) - .5769 * nz(Smooth[4]) - .0962 * nz(Smooth[6])) * (.075 * nz(Period[1]) + .54) : Detrender
    //Compute InPhase and Quadrature components
    Q1 := bar_index > 5 ? (.0962 * Detrender + .5769 * nz(Detrender[2]) - .5769 * nz(Detrender[4]) - .0962 * nz(Detrender[6])) * (.075 * nz(Period[1]) + .54) : Q1
    I1 := bar_index > 5 ? nz(Detrender[3]) : I1

    //Advance the phase of I1 and Q1 by 90 degrees
    jI := (.0962 * I1 + .5769 * nz(I1[2]) - .5769 * nz(I1[4]) - .0962 * nz(I1[6])) * (.075 * nz(Period[1]) + .54)
    jQ := (.0962 * Q1 + .5769 * nz(Q1[2]) - .5769 * nz(Q1[4]) - .0962 * nz(Q1[6])) * (.075 * nz(Period[1]) + .54)

    //Phasor addition for 3 bar averaging
    I2 := I1 - jQ
    Q2 := Q1 + jI

    //Smooth the I and Q components before applying the discriminator
    I2 := .2 * I2 + .8 * nz(I2[1])
    Q2 := .2 * Q2 + .8 * nz(Q2[1])

    //Homodyne Discriminator
    Re := I2 * nz(I2[1]) + Q2 * nz(Q2[1])
    Im := I2 * nz(Q2[1]) - Q2 * nz(I2[1])
    Re := .2 * Re + .8 * nz(Re[1])
    Im := .2 * Im + .8 * nz(Im[1])

    Period := Im != 0 and Re != 0 ? 2 * pi / math.atan(Im / Re) : Period
    Period := Period > 1.5 * nz(Period[1]) ? 1.5 * nz(Period[1]) : Period
    Period := Period < .67 * nz(Period[1]) ? .67 * nz(Period[1]) : Period
    //Limit Period to be within the bounds of 6 bar and 50 bar cycles
    Period := Period < 6 ? 6 : Period
    Period := Period > 50 ? 50 : Period
    Period := .2 * Period + .8 * nz(Period[1])
    SmoothPeriod := .33 * Period + .67 * nz(SmoothPeriod[1])
    //it can add filter to Period here
    DomCycle := math.ceil(CycPart * SmoothPeriod) > 34 ? 34 : math.ceil(CycPart * SmoothPeriod) < 1 ? 1 : math.ceil(CycPart * SmoothPeriod)
    DomCycle

wma(src, length) =>
    wma = 0.0
    sum = 0.0
    norm = length * (length + 1) / 2
    for i = 0 to length - 1
        sum := sum + src[i] * (length - i)
    wma := sum / norm


length = math.round(math.ceil(EhlersHoDyDC(hclose,CycPart)))

// Traditional Function initialization
highest_custom(src, length) =>
    x = src
    for i = 0 to math.min(length, 4999)
        if src[i] > x
            x := src[i]
    x
lowest_custom(src, length) => 
    x = src
    for i = 0 to math.min(length, 4999)
        if src[i] < x
            x := src[i]
    x

rma(src, len) =>
    sum = 0.0
    for i = 0 to len - 1
        math.min(1, len)
        sum += src[i]
    rma = sum / len
    rma := nz(rma[1]) * (len - 1) / len + src / len
    
sma(src, length) =>
    math.sum(src, length) / length

hln(src, length) =>
    TR = math.max(math.abs(src - src[1]), high - low)
    TR := src / math.abs(ta.change(rma(TR, length)))
    TR := (1 / TR) * 100

vawma(src, length) =>
    atr = ta.atr(1)
    aavg = sma(atr, length)
    vavg = sma(volume, length)
    weighted_sum = 0.0
    sum_weights = 0.0
    weighted = 0.0
    for i = 0 to length
        weight = ((volume[i] / vavg + (atr[i]) / aavg) / 2)
        weighted_sum += src[i] * weight
        sum_weights += weight
    a = (weighted_sum / sum_weights)

vawsi(src, len) =>
    rmaUp = vawma(math.max(ta.change(src), 0), len)
    rmaDown = vawma(-math.min(ta.change(src), 0), len)
    rsi = 100 - (100 / (1 + rmaUp / rmaDown))

trendPersistence(src, length, smoothing) =>
    trendu = math.abs(src - highest_custom(src, length))
    trendd = math.abs(src - lowest_custom(src, length))
    trendu := wma(trendu, smoothing)
    trendd := wma(trendd, smoothing)
    trendu := ta.change(ta.cum(trendu))
    trendd := ta.change(ta.cum(trendd))
    trend = wma(math.max(trendu, trendd), smoothing)
    rmaUp = rma(math.max(ta.change(trend), 0), length)
    rmaDown = rma(-math.min(ta.change(trend), 0), length)
    rsi = 100 - (100 / (1 + rmaUp / rmaDown))

//Strategy Calculations
sl = ((100 - sltp) / 100) * close
tp = ((100 + sltp) / 100) * close

var bool crossup = na
var bool crossdown = na
var float dir = na
var float BearGuy = 0

BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
    BearGuy += 1
else
    BearGuy := math.min(BullGuy, 4999)


rsiw = rsi_weight / 100
cew = half_weight / 100
atrw = atr_weight / 100

atr = hln(hclose, length) * atrw
ce = 1 / trendPersistence(hclose, length, smoothing)
com = 1 / math.max(math.abs(vawsi(hclose, length) - 50) * 2, 20)

comfin = (((com * rsiw) + (ce * cew) - atr)) * com_mult

lower = highest_custom(math.min((math.max(highest_custom(src, BearGuy) * (1 - comfin), sl)), src[1]), BearGuy)
upper = lowest_custom(math.max((math.min(lowest_custom(src, BearGuy) * (1 + comfin), tp)), src[1]), BearGuy)

var float thresh = na

if na(thresh)
    thresh := lower
if na(dir)
    dir := 1
if crossdown
    dir := -1
if crossup
    dir := 1
if dir == 1
    thresh := lower
if dir == -1
    thresh := upper

crossup := ta.crossover(hclose, thresh) and barstate.isconfirmed
crossdown := ta.crossunder(hclose, thresh) and barstate.isconfirmed

//STRATEGY
if crossup
    strategy.entry("long", strategy.long)
if crossdown
    strategy.entry("Short", strategy.short)

//PLOTTING
col = hclose > thresh ? color.lime : color.red
plot(thresh, linewidth = 2, color = color.new(col[1], 0))