이 전략은 볼 베어 파워 (BBP) 지표와 볼륨 퍼센틸을 기반으로 한 다단계 동적 영리 시스템으로 결합합니다. 가격, 볼륨 및 모멘텀 데이터의 다차원 분석을 통해 적응적이고 위험 통제 된 거래 시스템을 만듭니다. 핵심 논리는 Z-Score 정상화된 BBP 값을 거래 신호 트리거로 사용하는 것을 포함하며, 동적 영리 조정을위한 볼륨 퍼센틸 분석을 통합합니다.
핵심 계산에는 몇 가지 핵심 요소가 포함됩니다.
이 전략은 전통적인 BBP 지표와 현대적인 양적 분석 방법을 결합하여 탄탄한 이론적 기초와 강력한 실용성을 갖춘 거래 시스템을 만듭니다. 다단계 수익 및 동적 조정 메커니즘을 통해 수익과 위험 사이의 좋은 균형을 달성합니다. 매개 변수 최적화는 몇 가지 과제를 제시하지만 전략 프레임워크의 확장성은 향후 개선에 대한 충분한 공간을 제공합니다. 실제 응용에서는 거래자가 시장 특성과 개별 위험 선호도에 따라 특정 조정을해야합니다.
/*backtest start: 2019-12-23 08:00:00 end: 2025-01-04 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © PresentTrading // The BBP Strategy with Volume-Percentile TP by PresentTrading emerges as a sophisticated approach that integrates multiple analytical layers to enhance trading precision and profitability. // Unlike traditional strategies that rely solely on price movements or volume indicators, this strategy synergizes Bollinger Bands Power (BBP) with volume percentile analysis to determine optimal entry and exit points. Additionally, it employs a dynamic take-profit mechanism based on ATR (Average True Range) multipliers adjusted by volume and percentile factors, ensuring adaptability to varying market conditions. // This multi-faceted approach not only enhances signal accuracy but also optimizes risk management, setting it apart from conventional trading methodologies. //@version=5 strategy("BBP Strategy with Volume-Percentile TP - Strategy [presentTrading] ", overlay=false, precision=3, commission_value= 0.1, commission_type=strategy.commission.percent, slippage= 1, currency=currency.USD, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, initial_capital=10000) // ———————— // Bull Bear Power Strategy Settings // ———————— lengthInput = input.int(21, "EMA Length") zLength = input.int(252, "Z-Score Length") zThreshold = input.float(1.618, "Z-Score Threshold") // ———————— // Take Profit Settings // ———————— tp_group = "Take Profit Settings" // Enable/disable take profit function useTP = input.bool(true, "Use Take Profit", group=tp_group) // === ATR Base Settings === // ATR calculation period for determining base price movement range baseAtrLength = input.int(20, "ATR Period", minval=1, group=tp_group, tooltip="ATR period for calculating base price movement range. Shorter periods are more sensitive to recent volatility") // === Take Profit Multiplier Settings === // First take profit ATR multiplier, usually the most conservative target atrMult1 = input.float(1.618, "TP1 ATR Multiplier", minval=0.1, step=0.1, group=tp_group, tooltip="First take profit level ATR multiplier, recommended 1.5-2.0") // Second take profit ATR multiplier, medium profit target atrMult2 = input.float(2.382, "TP2 ATR Multiplier", minval=0.1, step=0.1, group=tp_group, tooltip="Second take profit level ATR multiplier, recommended 2.5-3.0") // Third take profit ATR multiplier, most aggressive target atrMult3 = input.float(3.618, "TP3 ATR Multiplier", minval=0.1, step=0.1, group=tp_group, tooltip="Third take profit level ATR multiplier, recommended 4.0-5.0") // === Position Size Allocation === // First take profit position size, usually larger for securing basic profits tp1_size = input.float(13, "TP1 Position %", minval=1, maxval=100, group=tp_group, tooltip="Position size percentage for first take profit, recommended 30-40%") // Second take profit position size, medium allocation tp2_size = input.float(13, "TP2 Position %", minval=1, maxval=100, group=tp_group, tooltip="Position size percentage for second take profit, recommended 30-40%") // Third take profit position size, usually smaller for catching larger moves tp3_size = input.float(13, "TP3 Position %", minval=1, maxval=100, group=tp_group, tooltip="Position size percentage for third take profit, recommended 20-30%") // ———————— // Volume Analysis Settings // ———————— vol_group = "Volume Analysis Settings" // Volume MA period for determining relative volume levels vol_period = input.int(100, "Volume MA Period", minval=1, group=vol_group, tooltip="Period for calculating volume moving average, recommended 20-30") // === Volume Level Thresholds === // High volume threshold relative to MA vol_high = input.float(2.0, "High Volume Multiplier", minval=1.0, step=0.1, group=vol_group, tooltip="High volume threshold multiplier, typically 2x MA or above") // Medium volume threshold vol_med = input.float(1.5, "Medium Volume Multiplier", minval=1.0, step=0.1, group=vol_group, tooltip="Medium volume threshold multiplier, typically around 1.5x MA") // Low volume threshold vol_low = input.float(1.0, "Low Volume Multiplier", minval=0.5, step=0.1, group=vol_group, tooltip="Low volume threshold multiplier, typically around 1x MA") // === Volume Adjustment Factors === // High volume adjustment factor, usually extends take profit targets vol_high_mult = input.float(1.5, "High Volume Factor", minval=0.1, step=0.1, group=vol_group, tooltip="Take profit adjustment factor for high volume") // Medium volume adjustment factor vol_med_mult = input.float(1.3, "Medium Volume Factor", minval=0.1, step=0.1, group=vol_group, tooltip="Take profit adjustment factor for medium volume") // Low volume adjustment factor vol_low_mult = input.float(1.0, "Low Volume Factor", minval=0.1, step=0.1, group=vol_group, tooltip="Take profit adjustment factor for low volume") // ———————— // Percentile Analysis Settings // ———————— perc_group = "Percentile Analysis Settings" // Percentile calculation period for evaluating price position perc_period = input.int(100, "Percentile Period", minval=20, group=perc_group, tooltip="Historical period for percentile calculations, recommended 100-200") // === Percentile Thresholds === // High percentile threshold, typically indicates relative high levels perc_high = input.float(90, "High Percentile", minval=50, maxval=100, group=perc_group, tooltip="High level percentile threshold, typically above 90") // Medium percentile threshold perc_med = input.float(80, "Medium Percentile", minval=50, maxval=100, group=perc_group, tooltip="Medium level percentile threshold, typically around 80") // Low percentile threshold perc_low = input.float(70, "Low Percentile", minval=0, maxval=100, group=perc_group, tooltip="Low level percentile threshold, typically around 70") // === Percentile Adjustment Factors === // High percentile adjustment factor perc_high_mult = input.float(1.5, "High Percentile Factor", minval=0.1, step=0.1, group=perc_group, tooltip="Take profit adjustment factor for high percentile levels") // Medium percentile adjustment factor perc_med_mult = input.float(1.3, "Medium Percentile Factor", minval=0.1, step=0.1, group=perc_group, tooltip="Take profit adjustment factor for medium percentile levels") // Low percentile adjustment factor perc_low_mult = input.float(1.0, "Low Percentile Factor", minval=0.1, step=0.1, group=perc_group, tooltip="Take profit adjustment factor for low percentile levels") // ———————— // Core Bull Bear Power Calculations // ———————— emaClose = ta.ema(close, lengthInput) bullPower = high - emaClose bearPower = low - emaClose bbp = bullPower + bearPower bbp_mean = ta.sma(bbp, zLength) bbp_std = ta.stdev(bbp, zLength) zscore = (bbp - bbp_mean) / bbp_std // ———————— // Volume & Percentile Analysis // ———————— // 成交量分析 vol_sma = ta.sma(volume, vol_period) vol_mult = volume / vol_sma // 百分位數計算 calcPercentile(src) => var values = array.new_float(0) array.unshift(values, src) if array.size(values) > perc_period array.pop(values) array.size(values) > 0 ? array.percentrank(values, array.size(values)-1) * 100 : 50 price_perc = calcPercentile(close) vol_perc = calcPercentile(volume) // 止盈動態調整系數計算 getTpFactor() => vol_score = vol_mult > vol_high ? vol_high_mult : vol_mult > vol_med ? vol_med_mult : vol_mult > vol_low ? vol_low_mult : 0.8 price_score = price_perc > perc_high ? perc_high_mult :price_perc > perc_med ? perc_med_mult :price_perc > perc_low ? perc_low_mult : 0.8 math.avg(vol_score, price_score) // ———————— // Entry/Exit Logic // ———————— longCondition = ta.crossover(zscore, zThreshold) shortCondition = ta.crossunder(zscore, -zThreshold) exitLongCondition = ta.crossunder(zscore, 0) exitShortCondition = ta.crossover(zscore, 0) if (barstate.isconfirmed) if longCondition strategy.entry("Long", strategy.long) if shortCondition strategy.entry("Short", strategy.short) if exitLongCondition strategy.close("Long") if exitShortCondition strategy.close("Short") // ———————— // Take Profit Execution // ———————— if useTP and strategy.position_size != 0 base_move = ta.atr(baseAtrLength) tp_factor = getTpFactor() is_long = strategy.position_size > 0 entry_price = strategy.position_avg_price if is_long tp1_price = entry_price + (base_move * atrMult1 * tp_factor) tp2_price = entry_price + (base_move * atrMult2 * tp_factor) tp3_price = entry_price + (base_move * atrMult3 * tp_factor) strategy.exit("TP1", "Long", qty_percent=tp1_size, limit=tp1_price) strategy.exit("TP2", "Long", qty_percent=tp2_size, limit=tp2_price) strategy.exit("TP3", "Long", qty_percent=tp3_size, limit=tp3_price) else tp1_price = entry_price - (base_move * atrMult1 * tp_factor) tp2_price = entry_price - (base_move * atrMult2 * tp_factor) tp3_price = entry_price - (base_move * atrMult3 * tp_factor) strategy.exit("TP1", "Short", qty_percent=tp1_size, limit=tp1_price) strategy.exit("TP2", "Short", qty_percent=tp2_size, limit=tp2_price) strategy.exit("TP3", "Short", qty_percent=tp3_size, limit=tp3_price) // ———————— // Plotting // ———————— plot(bbp, color=bbp >= 0 ? color.new(color.green, 0) : color.new(color.red, 0), title="BBPower", style=plot.style_columns) hline(0, "Zero Line", color=color.gray, linestyle=hline.style_dotted) plot(zscore, title="Z-Score", color=color.blue, linewidth=2) hline(zThreshold, "Upper Threshold", color=color.orange, linestyle=hline.style_dashed) hline(-zThreshold, "Lower Threshold", color=color.orange, linestyle=hline.style_dashed)