멀티 코어 회귀 동적 추세 추종 거래 전략

DR MKR ATR SMA MA200 TP SL
생성 날짜: 2025-02-24 09:27:50 마지막으로 수정됨: 2025-02-24 09:27:50
복사: 0 클릭수: 805
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

멀티 코어 회귀 동적 추세 추종 거래 전략 멀티 코어 회귀 동적 추세 추종 거래 전략

개요

이것은 동적 트렌드 반응기와 다중 커널 회귀를 결합한 트렌드 추적 거래 전략이다. 이 전략은 ATR과 SMA를 통해 동적 지원/저항선을 계산하고 고스커널과 에파네치니코프의 조합 회귀를 사용하여 시장의 흐름을 식별한다. 동시에 MA200 평선을 장기적인 트렌드 필터로 결합하고 3 배의 수익 목표와 손실 차단 장치를 설정한다.

전략 원칙

이 전략은 크게 네 가지 핵심 요소로 구성되어 있습니다.

  1. 동적 트렌드 반응기 ((DR): ATR와 SMA를 사용하여 동적 지원/저항대를 구성하고, 가격 위치에 따라 트렌드 방향을 판단한다. 상승 트렌드에서 하위 대역을 지원으로 사용하고, 하향 트렌드에서 상위 대역을 저항으로 사용합니다.

  2. 다중 핵심 회귀 (MKR): 고스 핵과 에파네치니코프 핵과 결합한 가격 회귀를 수행하여 조정 가능한 무게 매개 변수를 통해 두 가지 핵심 함수의 최적화된 조합을 구현한다. 이 방법은 가격 움직임의 동적 특성을 더 잘 포착한다.

  3. MA200 트렌드 필터: 200 일간 평균선을 장기 트렌드 지표로 사용하여, 가격이 MA200과 명확한 트렌드를 형성했을 때만 거래가 허용되며, ConsolidationRange 파라미터로 정리 기간을 식별한다.

  4. 자금 관리 시스템: 세 가지 수익 목표 ( 1.5%, 3.0%, 4.5%) 및 1%의 손실을 막는 설정을 사용하여 33% -33% -34%의 비율로 포지션을 배분하여 수익을 극대화하면서 위험을 제어하십시오.

전략적 이점

  1. 트렌드 식별의 신뢰성: DR와 MKR의 이중 확인을 통해 트렌드 판단의 정확도를 높였다.
  2. 리스크 관리의 완전성: 분기된 수익과 통일된 손실을 막는 조합을 사용하여 수익을 보호하고 손실을 제한합니다.
  3. 적응성: 다중핵 회귀 방법은 다른 시장 조건에 더 잘 적응할 수 있다.
  4. 트레이딩 신호는 명확하다: 트렌드 전환점이 명확한 그래픽으로 표시된다.
  5. 필터 메커니즘 개선: MA200 및 정리 기간을 통해 불리한 시장 환경을 제거한다.

전략적 위험

  1. 매개 변수 최적화 위험: 과도한 최적화는 전략의 실제 성능을 떨어뜨리는 과도한 적합성을 초래할 수 있습니다.
  2. 지연 위험: 평균선과 회귀 지표는 지연성이 있어 중요한 전환점을 놓칠 수 있다.
  3. 시장 환경 의존성: 급격한 변동이나 상반된 시장에서 좋지 않은 성과를 낼 수 있다.
  4. 실행 위험: 유동성 문제로 인해 다중 정지 손실 주문이 완전히 실행되지 않을 수 있습니다.

전략 최적화 방향

  1. 동적 파라미터 조정: 시장의 변동에 따라 ATR 곱셈과 회귀 주기를 자동으로 조정할 수 있다.
  2. 신호 확인 강화: 신호 신뢰성을 높이기 위해 교통량, 변동률 등의 보조 지표를 추가할 수 있다.
  3. 포지션 관리 최적화: 변동률에 기반한 동적 포지션 관리를 구현할 수 있다.
  4. 시장 환경 분류: 시장 상태 식별 모듈을 추가하여 다른 시장 환경에서 다른 파라미터 설정을 사용합니다.

요약하다

이 전략은 여러 가지 기술 지표와 첨단 통계 방법을 결합하여 완전한 거래 시스템을 구축한다. 전략의 장점은 트렌드를 정확하게 파악하고 완벽한 위험 관리 시스템이지만, 파라미터 최적화 및 시장 적응성에 대한 문제도 주의해야 한다. 제안된 최적화 방향을 통해 전략에는 더 많은 개선의 여지가 있다.

전략 소스 코드
/*backtest
start: 2024-02-25 00:00:00
end: 2024-08-07 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("DR + Multi Kernel Regression + Signals + MA200 with TP/SL (Optimized)", overlay=true, shorttitle="DR+MKR+Signals+MA200_TP_SL_Opt", pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// =====================================================================
// PARTEA 1: Dynamic Reactor – linie unică colorată în funcție de trend
// =====================================================================
// Parametri pentru Dynamic Reactor
atrLength  = input.int(14, title="Lungimea ATR", minval=1)
smaLength  = input.int(20, title="Lungimea SMA", minval=1)
multiplier = input.float(1.5, title="Multiplicator ATR", minval=0.1, step=0.1)
// Calculăm ATR și SMA
atrValue = ta.atr(atrLength)
smaValue = ta.sma(close, smaLength)
// Benzile de bază
basicUpper = smaValue + atrValue * multiplier
basicLower = smaValue - atrValue * multiplier
// Calculăm benzile finale (similar cu SuperTrend)
var float finalUpper = basicUpper
var float finalLower = basicLower
if bar_index > 0
    finalUpper := close[1] > finalUpper[1] ? math.max(basicUpper, finalUpper[1]) : basicUpper
    finalLower := close[1] < finalLower[1] ? math.min(basicLower, finalLower[1]) : basicLower
// Determinăm trendul curent:
// - Dacă prețul curent este peste finalUpper din bara anterioară → uptrend (1)
// - Dacă prețul este sub finalLower din bara anterioară → downtrend (-1)
// - Altfel, păstrăm trendul precedent.
var int trend = 1
if bar_index > 0
    trend := close > finalUpper[1] ? 1 : close < finalLower[1] ? -1 : nz(trend[1], 1)
// Linia Dynamic Reactor:
// - În uptrend se utilizează finalLower (nivel de suport)
// - În downtrend se utilizează finalUpper (nivel de rezistență)
drLine = trend == 1 ? finalLower : finalUpper
// Plotăm linia Dynamic Reactor
p_dr = plot(drLine, color=trend == 1 ? color.green : color.red, title="Dynamic Reactor", linewidth=2)


// =====================================================================
// PARTEA 2: Multi Kernel Regression
// =====================================================================
// Parametri pentru regresia cu kernel
regLength = input.int(50, title="Perioada regresiei", minval=1)
h1        = input.float(10.0, title="Bandă Gaussiană (h1)", minval=0.1)
h2        = input.float(10.0, title="Bandă Epanechnikov (h2)", minval=0.1)
alpha     = input.float(0.5, title="Pondere Kernel Gaussian (0-1)", minval=0, maxval=1)
// Funcție: regresie cu kernel Gaussian
f_gaussian_regression(bw) =>
    num = 0.0
    den = 0.0
    for i = 0 to regLength - 1
        // Kernel Gaussian: K(x) = exp(-0.5 * (i/bw)^2)
        weight = math.exp(-0.5 * math.pow(i / bw, 2))
        num += close[i] * weight
        den += weight
    num / (den == 0 ? 1 : den)
// Funcție: regresie cu kernel Epanechnikov
f_epanechnikov_regression(bw) =>
    num = 0.0
    den = 0.0
    for i = 0 to regLength - 1
        ratio = i / bw
        // Kernel Epanechnikov: K(u) = 1 - u^2 pentru |u| <= 1, altfel 0
        weight = math.abs(ratio) <= 1 ? (1 - math.pow(ratio, 2)) : 0
        num += close[i] * weight
        den += weight
    num / (den == 0 ? 1 : den)
// Calculăm regresiile pentru fiecare kernel
regGauss = f_gaussian_regression(h1)
regEpan  = f_epanechnikov_regression(h2)
// Combinăm rezultatele celor două regresii
multiKernelRegression = alpha * regGauss + (1 - alpha) * regEpan
// Plotăm linia Multi Kernel Regression
p_mkr = plot(multiKernelRegression, color=trend == 1 ? color.green : color.red, title="Multi Kernel Regression", linewidth=2)

// Adăugăm ceata (fill) între Dynamic Reactor și Multi Kernel Regression
fillColor = trend == 1 ? color.new(color.green, 80) : color.new(color.red, 80)
fill(p_dr, p_mkr, color=fillColor, title="Trend Fill")


// =====================================================================
// PARTEA 2.1: MA 200 și evidențierea consolidării
// =====================================================================
// Calculăm MA 200 pentru trend pe termen lung
ma200 = ta.sma(close, 200)
p_ma200 = plot(ma200, color=color.blue, title="MA 200", linewidth=2)
// Parametru pentru detectarea consolidării (cât de aproape trebuie să fie prețul de MA200, în %)
consolidationRange = input.float(1.0, title="Consolidation Range (%)", minval=0.1, step=0.1)
// Determinăm dacă suntem într-o fază de consolidare (prețul este în interiorul unui interval mic în jurul MA200)
isConsolidation = (math.abs(close - ma200) / ma200 * 100) < consolidationRange
// Colorăm fundalul graficului cu un gri translucid atunci când e consolidare
bgcolor(isConsolidation ? color.new(color.gray, 90) : na, title="Consolidation BG")


// =====================================================================
// PARTEA 3: Semnale Buy și Sell
// =====================================================================
// Semnale de intrare:
// - Buy Signal: când linia Multi Kernel Regression trece peste linia Dynamic Reactor
// - Sell Signal: când linia Multi Kernel Regression trece sub linia Dynamic Reactor
buySignal  = ta.crossover(multiKernelRegression, drLine)
sellSignal = ta.crossunder(multiKernelRegression, drLine)

// Plotăm semnalele pe grafic
plotshape(buySignal, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny, title="Buy Signal")
plotshape(sellSignal, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, title="Sell Signal")

// Setăm condiții de alertă
alertcondition(buySignal, title="Buy Alert", message="Buy Signal: Kernel is above Dynamic Reactor")
alertcondition(sellSignal, title="Sell Alert", message="Sell Signal: Kernel is below Dynamic Reactor")


// =====================================================================
// PARTEA 4: Trade Management – Intrări, 3 TP și 1 SL
// =====================================================================
// Parametrii pentru TP și SL (valori ajustate pentru un raport risc-recompensă mai favorabil)
tp1Perc = input.float(1.5, title="TP1 (%)", minval=0.1, step=0.1)
tp2Perc = input.float(3.0, title="TP2 (%)", minval=0.1, step=0.1)
tp3Perc = input.float(4.5, title="TP3 (%)", minval=0.1, step=0.1)
slPerc  = input.float(1.0, title="Stop Loss (%)", minval=0.1, step=0.1)

// ---- Intrări de tranzacționare cu filtrare suplimentară pe baza trendului MA200 și consolidării ----
// Pentru poziții long, intrăm doar când prețul este peste MA200 și nu este în consolidare.
// Pentru poziții short, intrăm doar când prețul este sub MA200 și nu este în consolidare.
if (buySignal and close > ma200 and not isConsolidation)
    strategy.entry("Long", strategy.long)

if (sellSignal and close < ma200 and not isConsolidation)
    strategy.entry("Short", strategy.short)

// ---- Gestionarea ordinelor pentru poziții long ----
if (strategy.position_size > 0)
    entryPrice = strategy.position_avg_price
    // Calculăm nivelurile de TP și SL pentru poziția long
    long_sl = entryPrice * (1 - slPerc / 100)
    long_tp1 = entryPrice * (1 + tp1Perc / 100)
    long_tp2 = entryPrice * (1 + tp2Perc / 100)
    long_tp3 = entryPrice * (1 + tp3Perc / 100)
    
    // Plasăm TP-urile (alocări: 33%, 33% și 34%)
    strategy.exit("Long_TP1", from_entry="Long", limit=long_tp1, qty_percent=33, comment="TP1")
    strategy.exit("Long_TP2", from_entry="Long", limit=long_tp2, qty_percent=33, comment="TP2")
    strategy.exit("Long_TP3", from_entry="Long", limit=long_tp3, qty_percent=34, comment="TP3")
    
    // Plasăm ordinul de SL pentru poziția long
    strategy.exit("Long_SL", from_entry="Long", stop=long_sl, comment="SL")

// ---- Gestionarea ordinelor pentru poziții short ----
if (strategy.position_size < 0)
    entryPrice = strategy.position_avg_price
    // Calculăm nivelurile de TP și SL pentru poziția short
    short_sl = entryPrice * (1 + slPerc / 100)
    short_tp1 = entryPrice * (1 - tp1Perc / 100)
    short_tp2 = entryPrice * (1 - tp2Perc / 100)
    short_tp3 = entryPrice * (1 - tp3Perc / 100)
    
    // Plasăm TP-urile (alocări: 33%, 33% și 34%)
    strategy.exit("Short_TP1", from_entry="Short", limit=short_tp1, qty_percent=33, comment="TP1")
    strategy.exit("Short_TP2", from_entry="Short", limit=short_tp2, qty_percent=33, comment="TP2")
    strategy.exit("Short_TP3", from_entry="Short", limit=short_tp3, qty_percent=34, comment="TP3")
    
    // Plasăm ordinul de SL pentru poziția short
    strategy.exit("Short_SL", from_entry="Short", stop=short_sl, comment="SL")