변동성 필터로서의 볼링거 밴드: 상단역 = MA + (K * StdDev) 하위 대역 = MA - (K * StdDev)
입국 조건: - 긴: 가격이 느린 VIDYA 이상으로 상승하는 빠른 VIDYA 추세와 상부 볼링거 밴드 이상의 가격을 깨고 - 짧은: 가격이 느린 VIDYA 아래로 깨고 하향적인 빠른 VIDYA 추세와 낮은 볼링거 밴드 아래로 가격
다단계 수익제도는 다음을 포함합니다. 1. ATR 기반의 수익 2. 이윤 취득 비율 3. 단기 거래 수익 비율의 증배자
이 전략은 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")