소스 - 이전 소스를 나타내고, 그 다음 그 변화의 절대 값을 가져와 소스와 정상화합니다.
동적 길이 계산: 시장 조건에 따라 지표 길이 매개 변수를 조정하기 위해 BlackCat1402의 동적 길이 계산 방법을 사용합니다.
복합 분석: VAWSI, 트렌드 지속성 및 ATR의 판독을 결합하여 복합 지표를 생성합니다. 낮은 최종 값은 임박한 반전을 나타냅니다. 높은 값은 불안정하거나 불안한 시장을 나타냅니다.
동적 스톱 로스/트레이프: 종합 지표와 현재 트렌드 방향에 기초하여 동적 스톱 로스 및 트레이프 로프 수준을 계산합니다.
트레이드 신호: 크로스오버를 확인하고 가격이 계산된 임계선을 완전히 넘으면 트레이드 신호를 생성합니다.
다차원 분석: 여러 지표를 결합함으로써 전략은 다른 각도에서 시장을 분석하여 의사 결정의 정확성을 향상시킬 수 있습니다.
적응력: 동적 길이 계산은 전략이 다른 시장 조건에 적응하여 유연성을 높일 수 있습니다.
리스크 관리: 동적인 스톱 로스 및 리프트 취득 설정은 리스크를 더 잘 제어하고 시장 변화에 적응하도록 돕습니다.
원래 지표: VAWSI와 트렌드 지속 지표는 전통적인 지표에서 간과되는 신호를 포착 할 수있는 독특한 시장 통찰력을 제공합니다.
반 회색: barstate.isconfirmed를 사용하면 신호가 회색되지 않도록 보장하여 백테스팅 정확성을 향상시킵니다.
사용자 정의성: 여러 가지 조정 가능한 매개 변수로 전략이 다른 거래 도구와 시간 프레임에 맞게 조정될 수 있습니다.
과도한 최적화: 많은 수의 매개 변수가 과도한 최적화로 이어질 수 있으며 라이브 거래에서 잠재적으로 성능이 떨어질 수 있습니다.
시장 적응력: 특정 시장에서 좋은 성과를 거두지만, 특히 낮은 변동성 시장에서 모든 시장 조건에 적합하지 않을 수 있습니다.
복잡성: 전략의 복잡성 때문에 이해와 유지가 어려워지고 운영 오류의 위험이 증가할 수 있습니다.
컴퓨팅 집중: 여러 사용자 지정 지표와 동적 계산은 높은 컴퓨팅 부하로 이어질 수 있으며 실행 속도에 영향을 줄 수 있습니다.
역사적인 데이터에 의존: 전략은 계산에 많은 양의 역사적인 데이터를 사용합니다. 이는 일부 상황에서 지연을 초래할 수 있습니다.
매개 변수 최적화: 기계 학습 알고리즘을 사용하여 다양한 무게 및 길이 매개 변수를 최적화하여 다른 시장 조건에서 전략 성능을 향상시킵니다.
시장 상태 인식: 다른 시장 환경에서 전략 매개 변수를 자동으로 조정하기 위해 시장 상태 인식 모듈을 추가합니다.
신호 필터링: 잘못된 신호를 줄이기 위해 트렌드 강도 기준과 같은 추가 필터링 메커니즘을 도입하십시오.
볼륨 분석: 볼륨 분석을 심화하고 신호 신뢰성을 높이기 위해 볼륨 패턴 인식을 도입 할 수 있습니다.
멀티 타임프레임 분석: 여러 시간 프레임에서 신호를 통합하여 거래 결정의 안정성을 향상시킵니다.
리스크 관리 최적화: 더 정교한 리스크 관리 전략, 예를 들어 동적 위치 크기와 다단계 스톱 로스 (stop-loss) 를 구현합니다.
계산 효율성: 특히 많은 양의 역사 데이터를 처리할 때 계산 효율성을 향상시키기 위해 코드를 최적화합니다.
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))