변동성 필터로서의 볼링거 밴드: 상단역 = MA + (K * StdDev) 하위 대역 = MA - (K * StdDev)
입국 조건:
다단계 수익제도는 다음을 포함합니다.
이 전략은 VIDYA 지표의 동적 적응력을 볼링거 밴드 (Bollinger Bands) 변동성 필터링과 결합하여 포괄적인 트렌드 추적 시스템을 만듭니다. 다단계 수익 취득 메커니즘과 차별화된 장기/단기 취급은 강력한 수익 잠재력과 위험 통제를 제공합니다. 그러나 사용자는 시장 환경 변화를 모니터링하고 그에 따라 매개 변수를 조정하고 강력한 돈 관리 시스템을 구축해야합니다. 추가 전략 최적화는 매개 변수 적응, 시장 환경 인식 및 위험 통제 강화에 초점을 맞추어야합니다.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-10 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © PresentTrading // This strategy, "VIDYA ProTrend Multi-Tier Profit," is a trend-following system that utilizes fast and slow VIDYA indicators // to identify entry and exit points based on the direction and strength of the trend. // It incorporates Bollinger Bands as a volatility filter and features a multi-step take profit mechanism, // with adjustable ATR-based and percentage-based profit targets for both long and short positions. // The strategy allows for more aggressive take profit settings for short trades, making it adaptable to varying market conditions. //@version=5 strategy("VIDYA ProTrend Multi-Tier Profit", overlay=true, 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) // User-defined inputs tradeDirection = input.string(title="Trading Direction", defval="Both", options=["Long", "Short", "Both"]) fastVidyaLength = input.int(10, title="Fast VIDYA Length", minval=1) slowVidyaLength = input.int(30, title="Slow VIDYA Length", minval=1) minSlopeThreshold = input.float(0.05, title="Minimum VIDYA Slope Threshold", step=0.01) // Bollinger Bands Inputs bbLength = input.int(20, title="Bollinger Bands Length", minval=1) bbMultiplier = input.float(1.0, title="Bollinger Bands Multiplier", step=0.1) // Multi-Step Take Profit Settings group_tp = "Multi-Step Take Profit" useMultiStepTP = input.bool(true, title="Enable Multi-Step Take Profit", group=group_tp) tp_direction = input.string(title="Take Profit Direction", defval="Both", options=["Long", "Short", "Both"], group=group_tp) atrLengthTP = input.int(14, title="ATR Length", group=group_tp) // ATR-based Take Profit Steps atrMultiplierTP1 = input.float(2.618, title="ATR Multiplier for TP 1", group=group_tp) atrMultiplierTP2 = input.float(5.0, title="ATR Multiplier for TP 2", group=group_tp) atrMultiplierTP3 = input.float(10.0, title="ATR Multiplier for TP 3", group=group_tp) // Short Position Multiplier for Take Profit Percentages shortTPPercentMultiplier = input.float(1.5, title="Short TP Percent Multiplier", group=group_tp) // Percentage-based Take Profit Steps (Long) tp_level_percent1 = input.float(title="Take Profit Level 1 (%)", defval=3.0, group=group_tp) tp_level_percent2 = input.float(title="Take Profit Level 2 (%)", defval=8.0, group=group_tp) tp_level_percent3 = input.float(title="Take Profit Level 3 (%)", defval=17.0, group=group_tp) // Percentage-based Take Profit Allocation (Long) tp_percent1 = input.float(title="Take Profit Percent 1 (%)", defval=12.0, group=group_tp) tp_percent2 = input.float(title="Take Profit Percent 2 (%)", defval=8.0, group=group_tp) tp_percent3 = input.float(title="Take Profit Percent 3 (%)", defval=10.0, group=group_tp) // ATR-based Take Profit Percent Allocation (Long) tp_percentATR1 = input.float(title="ATR TP Percent 1 (%)", defval=10.0, group=group_tp) tp_percentATR2 = input.float(title="ATR TP Percent 2 (%)", defval=10.0, group=group_tp) tp_percentATR3 = input.float(title="ATR TP Percent 3 (%)", defval=10.0, group=group_tp) // Short position percentage allocations using the multiplier tp_percent1_short = tp_percent1 * shortTPPercentMultiplier tp_percent2_short = tp_percent2 * shortTPPercentMultiplier tp_percent3_short = tp_percent3 * shortTPPercentMultiplier tp_percentATR1_short = tp_percentATR1 * shortTPPercentMultiplier tp_percentATR2_short = tp_percentATR2 * shortTPPercentMultiplier tp_percentATR3_short = tp_percentATR3 * shortTPPercentMultiplier // VIDYA Calculation Function calcVIDYA(src, length) => alpha = 2 / (length + 1) momm = ta.change(src) m1 = momm >= 0.0 ? momm : 0.0 m2 = momm < 0.0 ? -momm : 0.0 sm1 = math.sum(m1, length) sm2 = math.sum(m2, length) chandeMO = nz(100 * (sm1 - sm2) / (sm1 + sm2)) k = math.abs(chandeMO) / 100 var float vidya = na vidya := na(vidya[1]) ? src : (alpha * k * src + (1 - alpha * k) * vidya[1]) vidya // Calculate VIDYAs fastVIDYA = calcVIDYA(close, fastVidyaLength) slowVIDYA = calcVIDYA(close, slowVidyaLength) // Bollinger Bands Calculation [bbUpper, bbBasis, bbLower] = ta.bb(close, bbLength, bbMultiplier) // Manual Slope Calculation (price difference over time) calcSlope(current, previous, length) => (current - previous) / length // Slope of fast and slow VIDYA (comparing current value with value 'length' bars ago) fastSlope = calcSlope(fastVIDYA, fastVIDYA[fastVidyaLength], fastVidyaLength) slowSlope = calcSlope(slowVIDYA, slowVIDYA[slowVidyaLength], slowVidyaLength) // Conditions for long entry with Bollinger Bands filter longCondition = close > slowVIDYA and fastVIDYA > slowSlope and fastSlope > minSlopeThreshold and slowSlope > 1/2*minSlopeThreshold and close > bbUpper // Conditions for short entry with Bollinger Bands filter shortCondition = close < slowVIDYA and fastSlope < slowSlope and fastSlope < -minSlopeThreshold and slowSlope < -1/2*minSlopeThreshold and close < bbLower // Exit conditions (opposite crossovers or flat slopes) exitLongCondition = fastSlope < -minSlopeThreshold and slowSlope < -1/2*minSlopeThreshold or shortCondition exitShortCondition = fastSlope > minSlopeThreshold and slowSlope > 1/2*minSlopeThreshold or longCondition // Entry and Exit logic with trading direction if (longCondition) and (strategy.position_size == 0) and (tradeDirection == "Long" or tradeDirection == "Both") strategy.entry("Long", strategy.long) if (exitLongCondition) and strategy.position_size > 0 and (tradeDirection == "Long" or tradeDirection == "Both") strategy.close("Long") if (shortCondition) and (strategy.position_size == 0) and (tradeDirection == "Short" or tradeDirection == "Both") strategy.entry("Short", strategy.short) if (exitShortCondition) and strategy.position_size < 0 and (tradeDirection == "Short" or tradeDirection == "Both") strategy.close("Short") if useMultiStepTP if strategy.position_size > 0 and (tp_direction == "Long" or tp_direction == "Both") // ATR-based Take Profit (Long) tp_priceATR1_long = strategy.position_avg_price + atrMultiplierTP1 * ta.atr(atrLengthTP) tp_priceATR2_long = strategy.position_avg_price + atrMultiplierTP2 * ta.atr(atrLengthTP) tp_priceATR3_long = strategy.position_avg_price + atrMultiplierTP3 * ta.atr(atrLengthTP) // Percentage-based Take Profit (Long) tp_pricePercent1_long = strategy.position_avg_price * (1 + tp_level_percent1 / 100) tp_pricePercent2_long = strategy.position_avg_price * (1 + tp_level_percent2 / 100) tp_pricePercent3_long = strategy.position_avg_price * (1 + tp_level_percent3 / 100) // Execute ATR-based exits for Long strategy.exit("TP ATR 1 Long", from_entry="Long", qty_percent=tp_percentATR1, limit=tp_priceATR1_long) strategy.exit("TP ATR 2 Long", from_entry="Long", qty_percent=tp_percentATR2, limit=tp_priceATR2_long) strategy.exit("TP ATR 3 Long", from_entry="Long", qty_percent=tp_percentATR3, limit=tp_priceATR3_long) // Execute Percentage-based exits for Long strategy.exit("TP Percent 1 Long", from_entry="Long", qty_percent=tp_percent1, limit=tp_pricePercent1_long) strategy.exit("TP Percent 2 Long", from_entry="Long", qty_percent=tp_percent2, limit=tp_pricePercent2_long) strategy.exit("TP Percent 3 Long", from_entry="Long", qty_percent=tp_percent3, limit=tp_pricePercent3_long) if strategy.position_size < 0 and (tp_direction == "Short" or tp_direction == "Both") // ATR-based Take Profit (Short) - using the same ATR levels as long tp_priceATR1_short = strategy.position_avg_price - atrMultiplierTP1 * ta.atr(atrLengthTP) tp_priceATR2_short = strategy.position_avg_price - atrMultiplierTP2 * ta.atr(atrLengthTP) tp_priceATR3_short = strategy.position_avg_price - atrMultiplierTP3 * ta.atr(atrLengthTP) // Percentage-based Take Profit (Short) - using the same levels, but more aggressive percentages tp_pricePercent1_short = strategy.position_avg_price * (1 - tp_level_percent1 / 100) tp_pricePercent2_short = strategy.position_avg_price * (1 - tp_level_percent2 / 100) tp_pricePercent3_short = strategy.position_avg_price * (1 - tp_level_percent3 / 100) // Execute ATR-based exits for Short (using the percentage multiplier for short) strategy.exit("TP ATR 1 Short", from_entry="Short", qty_percent=tp_percentATR1_short, limit=tp_priceATR1_short) strategy.exit("TP ATR 2 Short", from_entry="Short", qty_percent=tp_percentATR2_short, limit=tp_priceATR2_short) strategy.exit("TP ATR 3 Short", from_entry="Short", qty_percent=tp_percentATR3_short, limit=tp_priceATR3_short) // Execute Percentage-based exits for Short strategy.exit("TP Percent 1 Short", from_entry="Short", qty_percent=tp_percent1_short, limit=tp_pricePercent1_short) strategy.exit("TP Percent 2 Short", from_entry="Short", qty_percent=tp_percent2_short, limit=tp_pricePercent2_short) strategy.exit("TP Percent 3 Short", from_entry="Short", qty_percent=tp_percent3_short, limit=tp_pricePercent3_short) // Plot VIDYAs plot(fastVIDYA, color=color.green, title="Fast VIDYA") plot(slowVIDYA, color=color.red, title="Slow VIDYA")