
고주파수 가격 회귀 기저 전략은 기술 지표 기반의 정량 거래 시스템으로, 황소 시장 환경에서의 가격 회귀를 위한 거래 기회를 제공합니다. 이 전략은 Coinrule가 2020년에 발표한 “Buy The Dips in Bull Market” 전략의 전체적인 최적화 및 다시 쓰기이며, Pine Script v6을 사용하여 재구성되었습니다. 비트코인의 2년 이상의 시간 단위의 데이터를 심층적으로 분석하여, 최적화된 버전은 원본 전략에 비해 312.6%의 추가 수익을 제공했으며, 74.8%의 승률을 달성했습니다.
핵심적 사고: 이 전략은 황소 시장 환경에서의 일시적인 가격 회전을 활용하여 RSI 지표가 과매매를 표시하고 시장 구조가 여전히 부진한 상태에서 더 많이 입사하고 가격이 중요한 이동 평균 위쪽으로 돌아가는 동안 퇴출합니다.
이 전략은 다중 조건 판단 시스템을 채택하고, 주로 다음과 같은 핵심 논리를 포함한다:
입력 논리: 다음의 모든 조건이 동시에 충족되면 전략은 다자리 포지션으로 들어갑니다:
출장 논리: 다음 두 가지 조건이 동시에 충족되면 전략 평지:
선택 가능한 공허 거래: 활성화되면, 전략은 반대 논리를 사용하여 공백 거래를 할 수 있습니다:
위험 관리: 이 전략은 ATR 기반의 Stop/Stop 설정을 채택하고, 변동율을 사용하여 위험 수준을 동적으로 결정한다. 기본으로 2:1의 위험-이익 비율을 사용하며, 완전히 사용자 정의 가능한 옵션을 제공합니다. 또한, 고정된 비율 기반의 위험 관리 옵션도 제공됩니다.
높은 승률: 최적화된 파라미터 설정을 통해 이 전략은 74.8%의 높은 승률을 달성했는데, 이는 양적 거래 전략에서 매우 상당한 수치이다. 높은 승률은 자금 곡선을 더 부드럽게 만들고 심리적 스트레스를 줄이는 데 도움이 된다.
동적 위험 관리: 전략은 ATR 기반의 중지 및 중지 메커니즘을 사용하여 시장의 변동성에 따라 위험 수준을 자동으로 조정할 수 있습니다. 이 방법은 고정된 퍼센트보다 더 과학적이며 다양한 변동률 환경에서 일관된 위험 관리를 유지할 수 있습니다.
최적화 된 변수 모음:
양방향 거래 능력: 전략은 선택 가능한 공허 거래 기능을 제공하여 단일 방향 거래에 국한되지 않고 다양한 시장 환경에 적응 할 수 있습니다.
전체적인 시각화: 전략은 거래 논리 및 위험 관리를 직관적으로 이해하는 데 도움이되는 위험 수준을 표시하는 것을 포함하여 향상된 차트화 기능을 제공합니다.
황소 시장의 의존성: 이 전략은 황소 시장 조건에 맞게 설계되었으며, 장기간 곰 시장 환경에서는 성능이 크게 떨어질 수 있다. 추세가 불확실하거나 수평 시장에서는 전략이 빈번하게 잘못된 신호를 생성할 수 있다.
트렌드를 따르는 특성: 트렌드를 따르는 전략으로서, 강력한 트렌드 역전 기간 동안 큰 회전을 경험할 수 있습니다. 특히 시장이 황소 시장에서 곰 시장으로 빠르게 전환 할 때, 전략은 적시에 조정 할 수 없습니다.
고주파 거래의 도전: 전략은 여러 신호를 생성하고 적극적인 모니터링이 필요하며 거래 비용과 운영 복잡성을 증가시킬 수 있습니다. 고주파 거래는 실제 수익에 영향을 미치는 슬라이드 포인트와 수수료의 증가로 이어질 수 있습니다.
매개변수 민감도: 전략적 성능은 파라미터 설정에 민감하며, 다른 시장과 시간 프레임에 따라 다른 파라미터 최적화가 필요할 수 있습니다. 잘못된 파라미터 선택은 과도한 적합성이나 신호 품질 저하로 이어질 수 있습니다.
위험 관리의 한계: ATR 리스크 관리가 우수한 방법이지만, 극단적인 시장 조건 (예: 플래시 또는 폭파) 에서, 스톱로스는 예상된 가격으로 실행되지 않을 수 있으며, 실제 손실이 예상보다 높을 수 있습니다.
적응성 변수 조정: 시장의 변동성과 트렌드 강도에 따라 RSI 마이너스 및 이동 평균 주기를 자동으로 조정하는 적응 변수 시스템을 구현하는 것이 고려 될 수 있습니다. 예를 들어, 높은 변동성 환경에서 더 낮은 RSI 마이너스 및 더 긴 이동 평균 주기를 사용하여 잘못된 신호를 줄일 수 있습니다.
시장 상태 분류: 더 복잡한 시장 상태 식별 알고리즘을 추가하여, 불시장, 곰시장, 가로시장을 명확하게 구분하고, 다른 시장 상태에 대해 다른 거래 논리를 사용합니다. ADX (평균 방향 지수) 와 같은 추가 지표가 트렌드 강도를 측정 할 수 있습니다.
기계 학습 최적화: 기계 학습 알고리즘을 사용하여 최적의 파라미터 조합을 자동으로 식별할 수 있으며, 신호 품질을 향상시키기 위해 동적 예측 모델을 만들 수도 있습니다. 이것은 역사적 데이터 훈련을 통해 가능하며, 시장 변화에 적응하기 위해 정기적으로 다시 훈련 할 수 있습니다.
다중 시간 프레임 확인: 여러 시간 프레임 분석을 추가하여 입력 신호가 동시에 더 큰 시간 프레임 트렌드에 의해 지원되는지 확인합니다. 이것은 여러 시간 주기 이동 평균 배열과 RSI 판독을 검사하여 가짜 신호를 줄일 수 있습니다.
변동율 필터: 변동률 필터링 메커니즘을 추가하여 매우 높은 변동률 환경에서 거래를 중지하거나 위험 매개 변수를 조정합니다. ATR의 역사적인 퍼센티지를 변동률의 측정 기준으로 사용할 수 있으며, 변동률이 특정 경계를 초과할 때 더 보수적인 거래 전략을 취할 수 있습니다.
자금 관리 최적화: 더 고급 자금 관리 시스템을 구현하여 계정 규모, 최근 전략 성과 및 시장 상황의 동성에 따라 위치 크기를 조정하십시오. 예를 들어, 연속적인 수익 후에 위치 크기를 점차적으로 증가시키고, 연속적인 손실 후에 위치 크기를 줄이십시오.
고주파수 가격 회귀 시사기술 (HFCP) 은 불시장 환경에 맞게 설계된 정량 거래 시스템으로, 과매매 조건을 식별하고 이동 평균 트렌드 확인과 결합하여 가격 회귀 기회를 포착합니다. 이 전략은 원본 버전과 비교하여 변수 최적화 및 강화된 위험 관리 기능을 통해 상당한 성능을 향상시켰으며, 312.6%의 추가 수익률과 74.8%의 승률을 달성했습니다.
이 전략의 핵심 장점은 동적 위험 관리 시스템과 높은 승률 성능으로 인해 불시장 환경에서 뛰어난 성능을 발휘합니다. 그러나, 전략은 시장 환경에 대한 의존성이 강하며, 트렌드 역전 기간 동안 큰 회수 등의 위험이 발생할 수 있습니다.
미래 최적화 방향은 주로 적응성 파라미터 조정, 시장 상태 분류, 기계 학습 응용, 다중 시간 프레임 분석 및 더 고급 자금 관리 시스템에 초점을 맞추고 있습니다. 이러한 최적화를 통해 전략은 다양한 시장 환경에서 안정적인 성능을 유지하여 안정성과 수익성을 더욱 향상시킬 수 있습니다.
어떤 최적화 조치가 적용되든, 거래자는 시장 위험을 염두에 두고, 충분한 재검토를 실시하고, 개인의 위험 감수성과 투자 목표에 따라 전략적 매개 변수와 자금 분배를 조정해야 한다.
/*backtest
start: 2025-06-13 00:00:00
end: 2025-07-13 00:00:00
period: 10m
basePeriod: 10m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":200000}]
*/
// === DESCRIPTION ===
// Buy The Dips Bull Market Strategy - Optimized
// Modified strategy based on the original 2020 strategy from Coinrule
// Optimized parameters based on 2+ years of BTC hourly data analysis
// Performance improvement: 312.6% better returns with 74.8% win rate
// Enters long when RSI is oversold and we're in a bull market structure
// Exits when price recovers above fast MA and fast MA > slow MA
// Quant Trading Pro
//@version=6
strategy(title="High Freq Buy The Dips Bull Market [Quant Trading]",
shorttitle="High Freq Buy The Dips BUll Market",
overlay=true,
initial_capital=1000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
commission_type=strategy.commission.percent,
commission_value=0.1,
slippage=3,
margin_long=0,
margin_short=0)
// === INPUT PARAMETERS ===
// RSI Settings
lengthRSI = input.int(14, "RSI Period", minval=1, maxval=50, group="📊 RSI Settings")
rsiBuySignal = input.int(45, "RSI Buy Signal", minval=20, maxval=50, group="📊 RSI Settings")
// Moving Average Settings
maFastLength = input.int(15, "Fast MA Length", minval=1, maxval=50, group="📈 Moving Averages")
maSlowLength = input.int(40, "Slow MA Length", minval=10, maxval=100, group="📈 Moving Averages")
maLongLength = input.int(150, "Long MA Length", minval=50, maxval=300, group="📈 Moving Averages")
// Trade Settings
allowShortTrades = input.bool(false, "Allow Short Trades?", group="🚫 Short Trades")
// Risk Management - ATR Based
enableATRRisk = input.bool(true, "Enable ATR Risk Management", group="🛡️ Risk Management")
atrLength = input.int(14, "ATR Period", minval=1, maxval=50, group="🛡️ Risk Management")
atrMultiplier = input.float(2.0, "ATR Stop Loss Multiplier", minval=0.5, maxval=5.0, step=0.1, group="🛡️ Risk Management")
riskRewardRatio = input.float(2.0, "Risk Reward Ratio", minval=1.0, maxval=10.0, step=0.1, group="🛡️ Risk Management")
// Optional Percentage-based Risk Management
usePercentageRisk = input.bool(false, "Use Percentage Instead of ATR", group="🛡️ Risk Management")
stopLossPercent = input.float(5.0, "Stop Loss (%)", minval=1.0, maxval=20.0, step=0.5, group="🛡️ Risk Management")
takeProfitPercent = input.float(10.0, "Take Profit (%)", minval=2.0, maxval=50.0, step=0.5, group="🛡️ Risk Management")
// === 1️⃣ CALCULATIONS ===
// RSI Calculation
rsiValue = ta.rsi(close, lengthRSI)
// Moving Averages
maFast = ta.sma(close, maFastLength)
maSlow = ta.sma(close, maSlowLength)
maLong = ta.sma(close, maLongLength)
// ATR Calculation for Risk Management
atrValue = ta.atr(atrLength)
// === 2️⃣ ENTRY & EXIT LOGIC ===
// Long Entry Conditions
rsiOversold = rsiValue < rsiBuySignal
bullMarketStructure = maLong < maSlow // Long MA below slow MA indicates bullish structure
longCondition = rsiOversold and bullMarketStructure
// Long Exit Conditions
priceRecovery = close > maFast
maAlignment = maFast > maSlow
longExitCondition = priceRecovery and maAlignment
// Short Entry Conditions (reverse logic)
rsiOverbought = rsiValue > (100 - rsiBuySignal) // If RSI buy signal is 35, short when RSI > 65
bearMarketStructure = maLong > maSlow // Long MA above slow MA indicates bearish structure
shortCondition = rsiOverbought and bearMarketStructure and allowShortTrades
// Short Exit Conditions (reverse logic)
priceDecline = close < maFast
maAlignmentBear = maFast < maSlow
shortExitCondition = priceDecline and maAlignmentBear and allowShortTrades
// === 3️⃣ TRADE EXECUTIONS ===
// Long Trades
if longCondition
strategy.entry("Long", strategy.long)
// Long Exits
if longExitCondition
strategy.close("Long")
// Short Trades (if enabled)
if shortCondition
strategy.entry("Short", strategy.short)
// Short Exits
if shortExitCondition
strategy.close("Short")
// ATR-Based Risk Management (if enabled)
if enableATRRisk and not usePercentageRisk
// Calculate ATR-based stop loss and take profit levels
longStopLoss = close - (atrValue * atrMultiplier)
longTakeProfit = close + (atrValue * atrMultiplier * riskRewardRatio)
shortStopLoss = close + (atrValue * atrMultiplier)
shortTakeProfit = close - (atrValue * atrMultiplier * riskRewardRatio)
// Long position risk management
strategy.exit("Long Exit", from_entry="Long",
stop=longStopLoss,
limit=longTakeProfit)
// Short position risk management
if allowShortTrades
strategy.exit("Short Exit", from_entry="Short",
stop=shortStopLoss,
limit=shortTakeProfit)
// Percentage-Based Risk Management (Alternative)
else if enableATRRisk and usePercentageRisk
strategy.exit("Long Exit", from_entry="Long",
stop=strategy.position_avg_price * (1 - stopLossPercent / 100),
limit=strategy.position_avg_price * (1 + takeProfitPercent / 100))
if allowShortTrades
strategy.exit("Short Exit", from_entry="Short",
stop=strategy.position_avg_price * (1 + stopLossPercent / 100),
limit=strategy.position_avg_price * (1 - takeProfitPercent / 100))
// === 4️⃣ VISUALIZATIONS ===
// Moving Averages - ensure they're properly connected to price data
plot(maFast, "Fast MA", color=color.new(color.purple, 0), linewidth=2, display=display.all)
plot(maSlow, "Slow MA", color=color.new(color.orange, 0), linewidth=2, display=display.all)
plot(maLong, "Long MA", color=color.new(color.blue, 0), linewidth=3, display=display.all)
// Entry/Exit Signals - ensure they're anchored to bars
//plotshape(longCondition, title="Long Entry", location=location.belowbar,
// color=color.new(color.green, 0), style=shape.triangleup, size=size.small)
//plotshape(longExitCondition, title="Long Exit", location=location.abovebar,
// color=color.new(color.red, 0), style=shape.triangledown, size=size.small)
// Short signals (if enabled)
//plotshape(shortCondition, title="Short Entry", location=location.abovebar,
// color=color.new(color.red, 0), style=shape.triangledown, size=size.small)
//plotshape(shortExitCondition, title="Short Exit", location=location.belowbar,
// color=color.new(color.green, 0), style=shape.triangleup, size=size.small)
// Risk Management Visualization
var float longSL = na
var float longTP = na
var float shortSL = na
var float shortTP = na
// Set risk levels only when entering new positions
if longCondition and enableATRRisk
if not usePercentageRisk
longSL := close - (atrValue * atrMultiplier)
longTP := close + (atrValue * atrMultiplier * riskRewardRatio)
else
longSL := close * (1 - stopLossPercent / 100)
longTP := close * (1 + takeProfitPercent / 100)
if shortCondition and enableATRRisk
if not usePercentageRisk
shortSL := close + (atrValue * atrMultiplier)
shortTP := close - (atrValue * atrMultiplier * riskRewardRatio)
else
shortSL := close * (1 + stopLossPercent / 100)
shortTP := close * (1 - takeProfitPercent / 100)
// Clear levels when positions are closed
if strategy.position_size == 0
longSL := na
longTP := na
shortSL := na
shortTP := na
// Plot risk levels only when in position
plot(strategy.position_size > 0 ? longSL : na, "Long Stop Loss", color=color.new(color.red, 0), style=plot.style_linebr, linewidth=2)
plot(strategy.position_size > 0 ? longTP : na, "Long Take Profit", color=color.new(color.green, 0), style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 ? shortSL : na, "Short Stop Loss", color=color.new(color.red, 50), style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 ? shortTP : na, "Short Take Profit", color=color.new(color.green, 50), style=plot.style_linebr, linewidth=2)