এই কৌশলটি কেডিজে সূচকের উপর ভিত্তি করে একটি উন্নত ট্রেডিং সিস্টেম, যা কে-লাইন, ডি-লাইন এবং জে-লাইন ক্রসওভার প্যাটার্নগুলির গভীর বিশ্লেষণের মাধ্যমে বাজারের প্রবণতা ক্যাপচার করে। কৌশলটি একটি কাস্টম বিসিডব্লিউএসএমএ মসৃণকরণ অ্যালগরিদমকে সংহত করে, স্টোকাস্টিক সূচকগুলির অনুকূলিত গণনার মাধ্যমে সংকেতের নির্ভরযোগ্যতা উন্নত করে। সিস্টেমটি শক্তিশালী অর্থ পরিচালনা অর্জনের জন্য স্টপ-লস এবং ট্রেলিং স্টপ বৈশিষ্ট্যগুলি সহ কঠোর ঝুঁকি নিয়ন্ত্রণ প্রক্রিয়া ব্যবহার করে।
কৌশলটির মূল যুক্তি বেশ কয়েকটি মূল উপাদানের উপর ভিত্তি করেঃ
কৌশলটি উদ্ভাবনী প্রযুক্তিগত সূচক সংমিশ্রণ এবং কঠোর ঝুঁকি নিয়ন্ত্রণের মাধ্যমে একটি সম্পূর্ণ ট্রেডিং সিস্টেম তৈরি করে। মূল সুবিধাগুলি একাধিক সংকেত নিশ্চিতকরণ প্রক্রিয়া এবং বিস্তৃত ঝুঁকি নিয়ন্ত্রণ ব্যবস্থায় রয়েছে, তবে প্যারামিটার অপ্টিমাইজেশন এবং বাজার পরিবেশের অভিযোজনযোগ্যতার প্রতি মনোযোগ দিতে হবে। ক্রমাগত অপ্টিমাইজেশন এবং উন্নতির মাধ্যমে কৌশলটির বিভিন্ন বাজারের পরিবেশে স্থিতিশীল কর্মক্ষমতা বজায় রাখার সম্ভাবনা রয়েছে।
/*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