গতি সূচক সিদ্ধান্ত ট্রেডিং কৌশল একটি প্রবণতা অনুসরণকারী কৌশল। এটি ডাবল এক্সপোনেনশিয়াল চলমান গড় ব্যবহার করে একটি গতি সূচক তৈরি করে এবং ট্রেডিং সংকেত তৈরি করতে মূল্য পরিবর্তনের হারের সূচকের সাথে এটি একত্রিত করে। যখন গতি সূচকটি উপরে যায়, এটি দীর্ঘ সংকেত উত্পন্ন করে। যখন গতি সূচকটি নিচে যায়, এটি সংক্ষিপ্ত সংকেত উত্পন্ন করে। এই কৌশলটি ব্যবসায়ীদের জন্য উপযুক্ত যারা বাজারে মধ্যমেয়াদী প্রবণতা ট্র্যাক করতে চান।
কৌশলটি গতির পরিমাপের জন্য ডাবল এক্সপোনেনশিয়াল মুভিং এভারেজের উপর ভিত্তি করে সিদ্ধান্ত পয়েন্ট দোলক ব্যবহার করে। প্রথমে এটি দৈনিক মূল্য পরিবর্তনের হার গণনা করে, তারপরে 31-দিন এবং 20-দিনের ডাবল এক্সপোনেনশিয়াল মুভিং এভারেজগুলি ব্যবহার করে মূল্য পরিবর্তনের হার পৃথকভাবে মসৃণ করে। অবশেষে এটি ট্রেডিং সংকেত ইস্যু করতে 9-দিনের মসৃণ মুভিং এভারেজ ব্যবহার করে। যখন দ্রুত লাইনটি ধীর লাইনের উপরে থাকে, তখন এটি একটি ষাঁড়ের বাজারকে নির্দেশ করে। যখন দ্রুত লাইনটি ধীর লাইনের নীচে থাকে, তখন এটি একটি ভালুকের বাজারকে নির্দেশ করে।
কৌশলটি পাশের বাজারে ভুল সংকেত এড়ানোর জন্য মূল্য পরিবর্তনের হার সূচকও প্রবর্তন করে। বিশেষত, এটি গত 30 দিনের মধ্যে শতাংশ মূল্য পরিবর্তন গণনা করে এবং বাজারের চলমান গড়ের মাধ্যমে এটি সক্রিয় কিনা তা বিচার করে। কেবলমাত্র যখন বাজার সক্রিয় থাকে তখনই ট্রেডিং সংকেত জারি করা হয়।
কৌশলটি গতির সূচক এবং মূল্য পরিবর্তনের হারের সূচককে একত্রিত করে, যা কার্যকরভাবে মধ্যমেয়াদী প্রবণতা সনাক্ত করতে পারে এবং অস্থির বাজারে ঘন ঘন ট্রেডিং এড়াতে পারে। চলমান গড়ের মতো সহজ প্রবণতা অনুসরণকারী কৌশলগুলির তুলনায়, এটি ভুল ব্যবসায়ের সম্ভাবনাকে ব্যাপকভাবে হ্রাস করতে পারে। উপরন্তু, সময়মতো ক্ষতি কমানোর জন্য স্টপ লস পয়েন্ট সেট করে এবং কার্যকরভাবে প্রতি বাণিজ্য ক্ষতি নিয়ন্ত্রণ করে ঝুঁকি নিয়ন্ত্রণ করা হয়।
কৌশলটি মূলত মাঝারি-দীর্ঘমেয়াদী প্রবণতা ট্রেডিংয়ের উপর নির্ভর করে, স্বল্পমেয়াদী দামের ওঠানামা ক্যাপচার করতে অক্ষম। যখন একটি ধারালো বাজারের চলাচল হয়, তখন স্টপ লস পয়েন্টটি ভেঙে যেতে পারে, যা বৃহত্তর ক্ষতির দিকে পরিচালিত করে। এছাড়াও, অনুপযুক্ত পরামিতি সেটিংগুলিও কৌশলটিকে প্রভাবিত করতে পারে। উদাহরণস্বরূপ, যদি ডাবল এক্সপোনেন্সিয়াল চলমান গড় পরামিতিগুলি খুব কম সেট করা হয় তবে ভুল ব্যবসায়ের সম্ভাবনা বাড়বে।
ঝুঁকি প্রতিরোধের জন্য, স্টপ লস পয়েন্টগুলি স্টপ লস পরিসীমা প্রসারিত করার জন্য যথাযথভাবে সামঞ্জস্য করা যেতে পারে। যখন একটি ধারালো বাজারের আন্দোলন ঘটে, স্টপ লসের সম্ভাব্যতা ভেঙে যাওয়ার সম্ভাবনা এড়াতে কৌশলটি সাময়িকভাবে বন্ধ করা যেতে পারে। প্যারামিটার টিউনিংয়ের জন্য, সর্বোত্তম প্যারামিটারগুলি নির্বাচন করতে বিস্তারিত ব্যাকটেস্টিং সম্পাদন করা উচিত।
কৌশলটি নিম্নলিখিত দিকগুলিতে অপ্টিমাইজ করা যেতে পারেঃ
বাজারের তীব্র ওঠানামা চলাকালীন ট্রেডিং এড়াতে ভোল্টেবিলিটি সূচকের মতো অন্যান্য ফিল্টারিং সূচক যুক্ত করুন।
প্রবণতা দিক এবং শক্তি বিচার করতে মেশিন লার্নিং মডেল যুক্ত করুন, যা সংকেতের নির্ভুলতা উন্নত করতে পারে।
বিভিন্ন গতির সূচক যেমন আপেক্ষিক শক্তি সূচক, স্টোকাস্টিক দোলক ব্যবহার করে প্রবেশ এবং প্রস্থান সময়কে অনুকূল করতে পারেন।
লাইভ ট্রেডিংয়ের সময়, সর্বোত্তম প্যারামিটার সমন্বয় সাধনের জন্য সাম্প্রতিক বাজারের অবস্থার সাথে সংযুক্ত প্যারামিটারগুলিকে গতিশীলভাবে সামঞ্জস্য করুন।
গতি সূচক সিদ্ধান্ত ট্রেডিং কৌশল সাধারণত একটি স্থিতিশীল মাঝারি দীর্ঘমেয়াদী প্রবণতা অনুসরণ কৌশল। এটি কার্যকরভাবে প্রবণতা সনাক্ত করে এবং ডাবল এক্সপোনেনশিয়াল চলমান গড় গতি সূচক এবং মূল্য পরিবর্তনের হারের সূচককে একত্রিত করে ভুল ট্রেডগুলি এড়ায়। এদিকে, এটি স্টপ লস পয়েন্ট সেট করে ঝুঁকি নিয়ন্ত্রণ করে। যদি পরামিতিগুলি সঠিকভাবে সেট করা হয় এবং ব্যাকটেস্টের ফলাফল ভাল হয় তবে এটি মধ্যমেয়াদী বিনিয়োগকারীদের জন্য উপযুক্ত যারা অতিরিক্ত রিটার্নের সন্ধান করে। অবশ্যই, ব্যবসায়ীদের এখনও কৌশলটিতে তীব্র বাজারের ওঠানামা দ্বারা আনা ঝুঁকি সম্পর্কে সচেতন হওয়া দরকার।
/*backtest start: 2022-12-08 00:00:00 end: 2023-11-10 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Decision BF", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075) /////////////// Time Frame /////////////// testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true /////////////// Decision /////////////// src = input(ohlc4, title="Source") length1 = input(31, title="First Smoothing") length2 = input(20, title="Second Smoothing") siglength = input(9, title="Signal Smoothing") fr = input(true, title="Fill Region") calc_csf(src, length) => sm = 2.0 / length csf = 0.0 csf := (src - nz(csf[1])) * sm + nz(csf[1]) csf i = (src / nz(src[1], src)) * 100 pmol2 = calc_csf(i - 100, length1) pmol = calc_csf(10 * pmol2, length2) pmols = ema(pmol, siglength) d = pmol - pmols duml = plot(fr ? (d > 0 ? pmol : pmols) : na, style=plot.style_circles, color=color.yellow, linewidth=0, title="DummyL") hc = d > 0 ? d > d[1] ? color.lime : color.green : d < d[1] ? color.red : color.orange ///////////// Rate Of Change ///////////// source = close roclength = input(30, minval=1) pcntChange = input(7, minval=1) roc = 100 * (source - source[roclength]) / source[roclength] emaroc = ema(roc, roclength / 2) isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2)) /////////////// Strategy /////////////// long = d > 0 and isMoving() short = d < 0 and isMoving() last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = 0.0 last_open_short_signal = 0.0 last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = 0.0 last_short_signal = 0.0 last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = 0.0 last_low = 0.0 last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) sl_inp = input(2.0, title='Stop Loss %') / 100 tp_inp = input(5000.0, title='Take Profit %') / 100 take_level_l = strategy.position_avg_price * (1 + tp_inp) take_level_s = strategy.position_avg_price * (1 - tp_inp) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na slShort = strategy.position_avg_price * (1 + sl_inp) long_sl = in_long_signal ? slLong : na short_sl = in_short_signal ? slShort : na /////////////// Execution /////////////// if testPeriod() strategy.entry("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short) strategy.exit("L Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0) strategy.exit("S Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0) /////////////// Plotting /////////////// sigl = plot(false ? na : pmols, title="PMO Signal", color=color.gray, linewidth=2, title="Signal") mdl = plot(false ? na : pmol, title="PMO", color=color.black, linewidth=2, title="PMO") fill(duml, sigl, color.green, transp=20, title="PosFill") fill(duml, mdl, color.red, transp=20, title="NegFill") bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70) bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)