
이 전략은 기술 지표 거리 측정과 MACD 역전 신호를 결합한 혼합량화 거래 방법이다. 그것은 현재 시장 상태와 사전 정의된 황소 시장과 곰 시장의 중심점 사이의 오케리드 거리를 계산하고, 동시에 MACD 지표의 교차 신호를 결합하여, 트렌드 동력을 포착하고 잠재적인 역전을 식별 할 수있는 복합 전략을 형성한다. 이 전략의 특징은 여러 기술 지표 (EMA, 변동률, 동력, RSI 및 MACD) 의 특징 벡터를 조합하여, 시장 상태와 전제 조건의 유사성을 수학적으로 측정하여 더 정확한 거래 신호를 생성하는 것이다.
이 전략의 핵심은 두 가지 주요 메커니즘에 기반합니다.
거리 측정 장치전략은 우선 가격 EMA, 변동률, 동력, RSI, MACD 라인 및 MACD 기둥 도표를 포함한 6 가지 기술 지표로 구성 된 특징 벡터를 구축합니다. 동시에, 시장이 상승 및 하락 추세에있을 때 시장의 이상적인 상태를 나타내는 황소 시장과 곰 시장의 두 가지 중심 지점 벡터를 미리 정의합니다.
MACD 교차 신호 메커니즘두 번째 계층 확인으로, 전략은 MACD 지표의 교차 신호를 사용하여 시장의 동력 변화를 판단한다. MACD 선 상의 신호 선은 구매 신호로 간주되며, MACD 선 아래의 신호 선은 판매 신호로 간주된다.
이 두 가지 메커니즘의 결합은 쌍중 확인 시스템을 형성합니다: 한편으로는 거리를 측정하여 시장의 전반적인 경향을 판단하고, 한편으로는 MACD를 교차하여 단기 동력의 변화를 판단합니다. 전략은 두 메커니즘의 공동 확인을 활용할 수 있습니다 (거리를 측정하고 MACD는 동시에 동일한 신호를 제공합니다) 또는 양쪽 메커니즘에서 독립적으로 생성 된 신호를 기반으로 거래를 할 수 있습니다.
다차원 시장 상태 평가: 여러 기술 지표를 특징 벡터로 조합함으로써, 전략은 단일 지표에 의존하는 대신 여러 차원에서 시장 상태를 평가할 수 있으며, 이로 인해 거짓 신호의 위험을 줄일 수 있습니다.
유연한 신호 생성 메커니즘전략은 동시에 거리를 측정하고 MACD를 교차하는 두 가지 메커니즘을 사용하여 신호를 생성합니다. 이는 추세적인 행동에서 지속적인 동력을 포착 할 수 있으며 잠재적인 반전점을 제때 발견 할 수 있으며, 더 적응성이 강합니다.
수학 모델의 객관성유클리드 거리 계산은 시장 상태를 평가하는 객관적이고 수학적인 방법을 제공하며 주관적인 판단 요소의 영향을 줄입니다.
자동 평형 메커니즘: 전략은 새로운 신호가 발생했을 때 자동으로 반대 방향으로의 지분을 청산합니다. 이는 신속한 변화하는 시장에 적응하기 위해 적시에 손실을 멈추고 지위 방향을 전환하는 데 도움이됩니다.
성능 모니터링 기능: 전략은 거래의 수익과 손실을 추적하고 표시하는 기능을 내장하여 전략의 성과를 실시간으로 평가하고 필요한 매개 변수를 조정할 수 있습니다.
매개변수 민감도 위험전략에 사용되는 EMA, RSI, MACD 등의 지표는 특정 파라미터 설정에 의존합니다. 이러한 파라미터가 현재 시장 조건에 적합하지 않으면 잘못된 신호가 발생할 수 있습니다. 해결책은 재검토를 통해 최적의 파라미터 조합을 찾고 매번 파라미터의 유효성을 재평가하는 것입니다.
과도한 거래의 위험: 전략이 두 가지 다른 메커니즘을 기반으로 독립적으로 신호를 생성할 수 있기 때문에, 변동성이 높은 시장에서 과도한 거래 신호가 생성되어 거래 비용이 증가할 수 있습니다. 신호 필터링 메커니즘을 추가하거나 신호 생성 논리를 조정하여 불필요한 거래를 줄일 수 있습니다.
추세와 역설의 충돌: 특정 시장 조건에서, 거리 측정과 MACD 신호는 서로 상반된 지시를 줄 수 있으며, 이는 전략적 행동의 불일치를 초래한다. 명확한 신호 우선 순위 규칙을 구축하거나 추가 확인 메커니즘을 도입하는 것이 좋습니다.
중심점 설정의 정동성: 현재 전략의 황소 곰시장 중심점 일부 파라미터는 정적 설정 (RSI 값과 같은) 이며 모든 시장 환경에 적응할 수 없습니다. 역사 데이터에 따라 중심점의 위치를 동적으로 조정하는 적응 장치를 도입하는 것을 고려할 수 있습니다.
단일 시간 프레임의 한계: 전략은 단일 시간 프레임에서만 작동하며, 더 큰 시간 프레임이나 더 작은 시간 프레임의 중요한 신호를 놓칠 수 있습니다. 다중 시간 프레임 전략으로 확장하는 것을 고려하면 신호의 신뢰성을 높일 수 있습니다.
적응형 중심점 디자인: 현재 황소와 곰 시장의 중심점 부분 파라미터는 고정되어 있으며, 역사적 데이터를 기반으로 자동으로 계산되는 동적 중심점으로 개선할 수 있다. 예를 들어, 지난 N주기의 데이터를 사용하여 이상적인 황소와 곰 시장 상태를 결정할 수 있으며, 중심점이 시장 조건에 자동으로 조정할 수 있다.
신호 우선순위 및 필터링 메커니즘: 시장 환경에 기반한 신호 우선 순위 시스템을 도입한다. 예를 들어, 높은 파동률 환경에서 역전 신호를 우선 순위로 하고, 낮은 파동률 추세가 뚜렷한 환경에서 거리 측정 신호를 우선 순위로 한다. 동시에, 파동률이나 거래량에 기반한 신호 필터를 추가하여 노이즈 신호를 줄일 수 있다.
스톱로스 및 수익 목표 메커니즘: 현재 전략은 명확한 중지 및 수익 목표 설정이 없으며, ATR 또는 고정 비율에 기반한 중지 장치와 지지 / 저항 수준 또는 리스크 수익률에 기반한 수익 목표 설정이 추가 될 수 있습니다.
다중 시간 프레임 분석 통합: 더 큰 시간 프레임의 트렌드 정보를 현재의 전략에 통합하는 것, 예를 들어 일선 트렌드 방향이 일치하는 경우에만 시간 단위의 거래 신호를 실행하는 것, 신호의 신뢰성을 높이기 위해.
특징중력 동적조정: 특성의 벡터에서 다른 지표에 동적으로 무게를 배분, 각 지표의 다양한 시장 조건에 대한 예측 능력에 따라 자동으로 영향력을 조정, 거리 계산의 정확성을 향상.
기계 학습 강화: 간단한 기계 학습 알고리즘을 도입하여 중심점 위치 또는 특징 무게를 최적화 할 수 있으며, 심지어는 클러그링 알고리즘을 사용하여 시장의 여러 상태의 중심점을 자동으로 발견 할 수 있습니다.
기술 지표 거리 측정과 MACD 역전 혼합 양적 거래 전략은 유로클리드 거리를 계산하는 기술을 통해 여러 일반적인 기술 지표를 통합하여 시장 상태 평가 시스템으로 통합하고 MACD 교차 신호와 결합하여 쌍용 확인 메커니즘을 형성하는 혁신적인 양적 거래 방법입니다.이 방법은 지속적인 추세에서 동력을 포착하고 잠재적인 시장 역전을 식별 할 수 있으며 강한 적응력과 유연성을 가지고 있습니다.
이 전략의 핵심 장점은 다차원 시장 평가 능력과 수학적 모델의 객관성이지만, 파라미터 민감성, 과도한 거래 및 신호 충돌 등의 위험에 직면해 있다. 자율적 중심점 디자인을 도입하고, 신호 우선 순위 시스템을 최적화하고, 스톱 메커니즘을 추가하고, 다중 시간 프레임 분석을 통합하고, 기계 학습 기술을 적용함으로써, 전략에는 큰 최적화 및 향상 공간이 있다.
양적 거래자들에게는 전통적인 기술 분석 방법과 수학 모델을 결합하는 이 전략은 탐구할 가치가 있는 새로운 방향을 제공하며, 특히 전략의 해석성을 유지하면서 거래 의사 결정의 객관성을 높이고자 하는 거래자들에게 적합하다.
/*backtest
start: 2024-04-15 00:00:00
end: 2024-12-31 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("Bysq-Distance Reversal Entry - BTCUSDT (v6)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10, margin_long=0, margin_short=0)
// ========== FEATURE ENGINEERING ==========
price = close
priceNorm = ta.ema(price, 5)
volatility = ta.stdev(price, 20)
momentum = ta.ema(close - close[5], 5)
rsi = ta.rsi(close, 14)
macdLine = ta.ema(close, 12) - ta.ema(close, 26)
signalLine = ta.ema(macdLine, 9)
macdHist = macdLine - signalLine
// Fitur sebagai vector
featureVector = array.new_float(6)
array.set(featureVector, 0, priceNorm)
array.set(featureVector, 1, volatility)
array.set(featureVector, 2, momentum)
array.set(featureVector, 3, rsi)
array.set(featureVector, 4, macdLine)
array.set(featureVector, 5, macdHist)
// Centroid bullish
bullishCentroid = array.new_float(6)
array.set(bullishCentroid, 0, price)
array.set(bullishCentroid, 1, volatility)
array.set(bullishCentroid, 2, momentum)
array.set(bullishCentroid, 3, 60.0)
array.set(bullishCentroid, 4, macdLine)
array.set(bullishCentroid, 5, macdHist)
// Centroid bearish
bearishCentroid = array.new_float(6)
array.set(bearishCentroid, 0, price)
array.set(bearishCentroid, 1, volatility)
array.set(bearishCentroid, 2, momentum)
array.set(bearishCentroid, 3, 40.0)
array.set(bearishCentroid, 4, macdLine)
array.set(bearishCentroid, 5, macdHist)
// Fungsi Euclidean Distance
euclideanDistance(arr1, arr2) =>
dist = 0.0
for i = 0 to array.size(arr1) - 1
a = array.get(arr1, i)
b = array.get(arr2, i)
dist += math.pow((a - b), 2)
math.sqrt(dist)
// Hitung jarak ke centroid
distToBullish = euclideanDistance(featureVector, bullishCentroid)
distToBearish = euclideanDistance(featureVector, bearishCentroid)
// ========== SINYAL ==========
// Original distance strategy signals
isDistanceBuySignal = distToBullish < distToBearish and ta.crossover(macdLine, signalLine)
isDistanceSellSignal = distToBearish < distToBullish and ta.crossunder(macdLine, signalLine)
// Reversal strategy signals
isReversalBuySignal = ta.crossover(macdLine, signalLine)
isReversalSellSignal = ta.crossunder(macdLine, signalLine)
// Combined signals - using both strategies
isBuySignal = isDistanceBuySignal or isReversalBuySignal
isSellSignal = isDistanceSellSignal or isReversalSellSignal
// ========== EKSEKUSI ==========
if isBuySignal
strategy.close("Sell") // Close any sell position first (from reversal strategy)
strategy.entry("Buy", strategy.long)
if isSellSignal
strategy.close("Buy") // Close any buy position first (from reversal strategy)
strategy.entry("Sell", strategy.short)
// ========== METRIK KINERJA ==========
float lastOpenTradeProfit = na
if strategy.opentrades > 0
lastOpenTradeProfit := strategy.opentrades.profit(strategy.opentrades - 1)
float lastClosedTradeProfit = na
if strategy.closedtrades > 0
lastClosedTradeProfit := strategy.closedtrades.profit(strategy.closedtrades - 1)
// Plot info
plot(lastOpenTradeProfit, title="Last Open Trade Profit", color=color.blue)
plot(lastClosedTradeProfit, title="Last Closed Trade Profit", color=color.orange)