이 전략은 KDJ 지표를 기반으로 한 고급 거래 시스템으로, K-라인, D-라인 및 J-라인 크로스오버 패턴의 심층 분석을 통해 시장 추세를 파악합니다. 이 전략은 사용자 정의 BCWSMA 매끄러운 알고리즘을 통합하여 스토카스틱 지표의 최적화된 계산을 통해 신호 신뢰성을 향상시킵니다. 시스템은 강력한 돈 관리를 달성하기 위해 스톱 로스 및 트레일링 스톱 기능을 포함한 엄격한 리스크 제어 메커니즘을 사용합니다.
전략의 핵심 논리는 몇 가지 핵심 요소에 기반합니다.
이 전략은 혁신적인 기술 지표 조합과 엄격한 위험 통제를 통해 완전한 거래 시스템을 구축합니다. 핵심 장점은 여러 신호 확인 메커니즘과 포괄적인 위험 제어 시스템에서 있지만 매개 변수 최적화 및 시장 환경 적응성에주의를 기울여야합니다. 지속적인 최적화 및 개선을 통해 전략은 다른 시장 환경에서 안정적인 성능을 유지할 수 있습니다.
/*backtest start: 2024-01-06 00:00:00 end: 2025-01-05 00:00:00 period: 4h basePeriod: 4h 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/ // © hexu90 //@version=6 // Date Range // STEP 1. Create inputs that configure the backtest's date range useDateFilter = input.bool(true, title="Filter Date Range of Backtest", group="Backtest Time Period") backtestStartDate = input(timestamp("1 Jan 2020"), title="Start Date", group="Backtest Time Period", tooltip="This start date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") backtestEndDate = input(timestamp("15 Dec 2024"), title="End Date", group="Backtest Time Period", tooltip="This end date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") // STEP 2. See if current bar falls inside the date range inTradeWindow = true //KDJ strategy // indicator("My Customized KDJ", shorttitle="KDJ") strategy("My KDJ Strategy", overlay = false) // Input parameters ilong = input(90, title="Period") k_isig = input(3, title="K Signal") d_isig = input(30, title="D Signal") // Custom BCWSMA calculation outside the function bcwsma(source, length, weight) => var float prev = na // Persistent variable to store the previous value if na(prev) prev := source // Initialize on the first run prev := (weight * source + (length - weight) * prev) / length prev // Calculate KDJ c = close h = ta.highest(high, ilong) l = ta.lowest(low, ilong) RSV = 100 * ((c - l) / (h - l)) pK = bcwsma(RSV, k_isig, 1) pD = bcwsma(pK, d_isig, 1) pJ = 3 * pK - 2 * pD pJ1 = 0 pJ2 = 80 pJ5 = (pJ-pK)-(pK-pD) // Plot the K, D, J lines with colors plot(pK, color=color.rgb(251, 121, 8), title="K Line") // Orange plot(pD, color=color.rgb(30, 0, 255), title="D Line") // Blue plot(pJ, color=color.new(color.rgb(251, 0, 255), 10), title="J Line") // Pink with transparency plot(pJ5, color=#6f03f3e6, title="J Line") // Pink with transparency // Background color and reference lines // bgcolor(pJ > pD ? color.new(color.green, 75) : color.new(color.red, 75)) // hline(80, "Upper Band", color=color.gray) // hline(20, "Lower Band", color=color.gray) // Variables to track the conditions var bool condition1_met = false var int condition2_met = 0 // Condition 1: pJ drops below pJ5 if ta.crossunder(pJ, pJ5) condition1_met := true condition2_met := 0 // Reset condition 2 if pJ drops below pJ5 again if ta.crossover(pJ, pD) condition2_met += 1 to_long = ta.crossover(pJ, pD) var int consecutiveDays = 0 // Update the count of consecutive days if pJ > pD consecutiveDays += 1 else consecutiveDays := 0 // Check if pJ has been above pD for more than 3 days consPJacrossPD = false if consecutiveDays > 3 consPJacrossPD := true // Entry condition: After condition 2, pJ crosses above pD a second time // if condition1_met and condition2_met > 1 // strategy.entry("golden", strategy.long, qty=1000) // condition1_met := false // Reset the conditions for a new cycle // condition2_met = 0 // if ta.crossover(pJ, pD) // and pD < 40 and consPJacrossPD // consecutiveDays == 1 // consecutiveDays == 3 and strategy.entry("golden", strategy.long, qty=1) // to_short = // or ta.crossunder(pJ, 100) // Exit condition if ta.crossover(pD, pJ) strategy.close("golden", qty = 1) // Stop loss and trailing profit trail_stop_pct = input.float(0.5, title="Trailing Stop activation (%)", group="Exit Lonng", inline="LTS", tooltip="Trailing Treshold %") trail_offset_pct = input.float(0.5, title="Trailing Offset (%)", group="Exit Lonng", inline="LTS", tooltip="Trailing Offset %") trail_stop_tick = trail_stop_pct * close/100 trail_offset_tick = trail_offset_pct * close/100 sl_pct = input.float(5, title="Stop Loss", group="SL and TP", inline="LSLTP") // tp_pct = input.float(9, title="Take Profit", group="SL and TP", inline="LSLTP") long_sl_price = strategy.position_avg_price * (1 - sl_pct/100) // long_tp_price = strategy.position_avg_price * (1 + tp_pct/100) strategy.exit('golden Exit', 'golden', stop = long_sl_price) // trail_points = trail_stop_tick, trail_offset=trail_offset_tick