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

VAWSI 및 동적 길이 계산 다중 지표 분석 시스템과 트렌드 지속 역전 전략

저자:차오장, 날짜: 2024-06-21 15:36:43
태그:VAWSIATRRSIWMASMARMA

소스 - 이전 소스를 나타내고, 그 다음 그 변화의 절대 값을 가져와 소스와 정상화합니다.

  1. 동적 길이 계산: 시장 조건에 따라 지표 길이 매개 변수를 조정하기 위해 BlackCat1402의 동적 길이 계산 방법을 사용합니다.

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

  3. 동적 스톱 로스/트레이프: 종합 지표와 현재 트렌드 방향에 기초하여 동적 스톱 로스 및 트레이프 로프 수준을 계산합니다.

  4. 트레이드 신호: 크로스오버를 확인하고 가격이 계산된 임계선을 완전히 넘으면 트레이드 신호를 생성합니다.

전략적 장점

  1. 다차원 분석: 여러 지표를 결합함으로써 전략은 다른 각도에서 시장을 분석하여 의사 결정의 정확성을 향상시킬 수 있습니다.

  2. 적응력: 동적 길이 계산은 전략이 다른 시장 조건에 적응하여 유연성을 높일 수 있습니다.

  3. 리스크 관리: 동적인 스톱 로스 및 리프트 취득 설정은 리스크를 더 잘 제어하고 시장 변화에 적응하도록 돕습니다.

  4. 원래 지표: VAWSI와 트렌드 지속 지표는 전통적인 지표에서 간과되는 신호를 포착 할 수있는 독특한 시장 통찰력을 제공합니다.

  5. 반 회색: barstate.isconfirmed를 사용하면 신호가 회색되지 않도록 보장하여 백테스팅 정확성을 향상시킵니다.

  6. 사용자 정의성: 여러 가지 조정 가능한 매개 변수로 전략이 다른 거래 도구와 시간 프레임에 맞게 조정될 수 있습니다.

전략 위험

  1. 과도한 최적화: 많은 수의 매개 변수가 과도한 최적화로 이어질 수 있으며 라이브 거래에서 잠재적으로 성능이 떨어질 수 있습니다.

  2. 시장 적응력: 특정 시장에서 좋은 성과를 거두지만, 특히 낮은 변동성 시장에서 모든 시장 조건에 적합하지 않을 수 있습니다.

  3. 복잡성: 전략의 복잡성 때문에 이해와 유지가 어려워지고 운영 오류의 위험이 증가할 수 있습니다.

  4. 컴퓨팅 집중: 여러 사용자 지정 지표와 동적 계산은 높은 컴퓨팅 부하로 이어질 수 있으며 실행 속도에 영향을 줄 수 있습니다.

  5. 역사적인 데이터에 의존: 전략은 계산에 많은 양의 역사적인 데이터를 사용합니다. 이는 일부 상황에서 지연을 초래할 수 있습니다.

최적화 방향

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

  2. 시장 상태 인식: 다른 시장 환경에서 전략 매개 변수를 자동으로 조정하기 위해 시장 상태 인식 모듈을 추가합니다.

  3. 신호 필터링: 잘못된 신호를 줄이기 위해 트렌드 강도 기준과 같은 추가 필터링 메커니즘을 도입하십시오.

  4. 볼륨 분석: 볼륨 분석을 심화하고 신호 신뢰성을 높이기 위해 볼륨 패턴 인식을 도입 할 수 있습니다.

  5. 멀티 타임프레임 분석: 여러 시간 프레임에서 신호를 통합하여 거래 결정의 안정성을 향상시킵니다.

  6. 리스크 관리 최적화: 더 정교한 리스크 관리 전략, 예를 들어 동적 위치 크기와 다단계 스톱 로스 (stop-loss) 를 구현합니다.

  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))



관련

더 많은