এই কৌশলটি মূল্যের প্রবণতা নির্ধারণ এবং ব্রেকআউটগুলি অনুসরণ করার জন্য মাধ্যাকর্ষণ কেন্দ্রের সূচক এবং এসএসএল চ্যানেল সূচককে একত্রিত করে, যা প্রবণতা অনুসরণকারী কৌশল বিভাগের অন্তর্গত। এটি ঝুঁকি নিয়ন্ত্রণের জন্য গতিশীল এটিআর স্টপ লসও ব্যবহার করে।
উচ্চতর এবং নিম্নমুখী প্রবণতার সীমা হিসাবে উপরের এবং নীচের ব্যান্ডগুলির সাথে মাধ্যাকর্ষণ কেন্দ্রের সূচক গণনা করুন।
এসএসএল চ্যানেল সূচক গণনা করুন, যার মধ্যে পরিসীমা, বাইরে প্রবণতা দিক।
যখন মূল্য উপরের ব্যান্ড বা চ্যানেলটি ভেঙে যায়, তখন আপট্রেন্ড নির্ধারণ করুন এবং লং যান। যখন মূল্য নিম্ন ব্যান্ড বা চ্যানেলটি ভেঙে যায়, তখন ডাউনট্রেন্ড নির্ধারণ করুন এবং শর্ট যান।
ডায়নামিক এটিআর স্টপ লস ব্যবহার করে স্টপ লস লেভেল ট্রেইল করুন এবং বড় ক্ষতি এড়ান।
প্রকৃত ট্রেডিং সংকেত তৈরি করতে ব্যাকটেস্ট সময়ের সাথে সংযুক্ত করুন।
কৌশলটি প্রবণতা নির্ধারণের জন্য দুটি সূচক ব্যবহার করে, একটি ব্রেকআউট সনাক্ত করতে এবং অন্যটি প্রবণতা নিশ্চিত করার জন্য, তাদের সংমিশ্রণ সঠিকতা উন্নত করতে পারে। গতিশীল স্টপ লস বাজার অস্থিরতার উপর ভিত্তি করে সামঞ্জস্য করে, এটি একটি খুব ব্যবহারিক ঝুঁকি নিয়ন্ত্রণ পদ্ধতি করে তোলে।
দুইটি সূচক ব্যবহার করে প্রবণতা নির্ধারণে নির্ভুলতা বৃদ্ধি পায়।
মাধ্যাকর্ষণ কেন্দ্র প্রবণতা পরিবর্তন সংবেদনশীল, এসএসএল চ্যানেল স্পষ্টভাবে প্রবণতা দিক নির্ধারণ করে।
ডায়নামিক এটিআর স্টপ লস মার্কেটের অস্থিরতার উপর ভিত্তি করে নমনীয়ভাবে সামঞ্জস্য করে।
সহজ এবং পরিষ্কার কৌশল নিয়ম, সহজেই বোঝা এবং বাস্তবায়ন।
প্যারামিটারগুলির জন্য বড় অপ্টিমাইজেশান স্পেস, বিভিন্ন বাজারের জন্য সামঞ্জস্য করা যেতে পারে।
কৌশল কার্যকারিতা যাচাই করার জন্য ব্যাকটেস্ট কার্যকারিতা সম্পূর্ণ করুন।
মাধ্যাকর্ষণ কেন্দ্র এবং এসএসএল উভয়ই কিছু ক্ষেত্রে ব্যর্থ হতে পারে, যা ভুল সংকেতের দিকে পরিচালিত করে। নিশ্চিতকরণের জন্য অন্যান্য সূচক যুক্ত করতে পারে।
ডায়নামিক স্টপ লস খুব আক্রমণাত্মক হতে পারে, স্টপ লসের পরিসীমা শিথিল করতে পারে।
ভুল ব্যাকটেস্টের সময়কাল বেছে নেওয়ার ফলে কৌশলগত ফলাফল খারাপ হতে পারে, বিভিন্ন বাজারের পর্যায়ে ব্যাকটেস্টের প্রয়োজন হতে পারে।
বাণিজ্যিক ব্যয়ের প্রভাব পুরোপুরি বিবেচনা করা দরকার।
সর্বোত্তম জোড়া খুঁজে পেতে বিভিন্ন প্যারামিটার সমন্বয় পরীক্ষা করুন।
ডায়নামিক স্টপ লস এটিআর পিরিয়ড এবং মাল্টিপ্লায়ার প্যারামিটার অপ্টিমাইজ করুন।
সিগন্যাল ফিল্টারিংয়ের জন্য অন্যান্য সূচক প্রবর্তন করুন, যেমন MACD, KDJ।
প্রবণতা দিকনির্দেশনা সাহায্য করার জন্য মেশিন লার্নিং মডেল যোগ করুন।
অর্থ ব্যবস্থাপনা অপ্টিমাইজ করুন, পজিশনের আকার নির্ধারণের নিয়ম নির্ধারণ করুন।
নির্দিষ্ট পণ্যের জন্য সূক্ষ্ম সুরক্ষা পরামিতি।
এই কৌশলটি প্রবণতা নির্ধারণের জন্য মাধ্যাকর্ষণ কেন্দ্র এবং এসএসএল চ্যানেলকে একত্রিত করে এবং ঝুঁকি নিয়ন্ত্রণের জন্য গতিশীল এটিআর স্টপ লস ব্যবহার করে। এটি একটি কার্যকর প্রবণতা অনুসরণকারী কৌশল। প্যারামিটার অপ্টিমাইজেশান, অন্যান্য সূচক এবং মেশিন লার্নিং ইত্যাদি প্রবর্তনের মাধ্যমে আরও উন্নতি করা যেতে পারে। সামগ্রিকভাবে এটি একটি অত্যন্ত ব্যবহারিক এবং প্রসারিত কৌশল, যা অ্যালগরিদমিক ট্রেডিংয়ের জন্য একটি মূল্যবান রেফারেন্স হিসাবে কাজ করে।
/*backtest start: 2023-08-19 00:00:00 end: 2023-09-13 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // Thanks to HPotter for the original code for Center of Gravity Backtest strategy("CoG SSL BF 🚀", overlay=true, 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 /////////////// _0 = input(false, "════════ Test Period ═══════") 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 /////////////// SSL Channels /////////////// _1 = input(false, "═════════ SSL ══════════") len1=input(title="SMA Length 1", defval=12) len2=input(title="SMA Length 2", defval=13) smaHigh = sma(high, len1) smaLow = sma(low, len2) Hlv = 0 Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1] sslDown = Hlv < 0 ? smaHigh : smaLow sslUp = Hlv < 0 ? smaLow : smaHigh ///////////// Center of Gravity ///////////// _2 = input(false, "═════════ CoG ══════════") Length = input(25, minval=1) m = input(5, minval=0) Percent = input(6, minval=0, title="COG %") xLG = linreg(close, Length, m) xLG1r = xLG + ((close * Percent) / 100) xLG1s = xLG - ((close * Percent) / 100) pos = 0.0 pos := iff(close > xLG1r, 1, iff(close < xLG1s, -1, nz(pos[1], 0))) possig = iff(pos == 1, 1, iff(pos == -1, -1, pos)) ///////////// Rate Of Change ///////////// _3 = input(false, "══════ Rate of Change ══════") source = close roclength = input(2, "ROC Length", minval=1) pcntChange = input(10, "ROC % Change", minval=1) roc = 100 * (source - source[roclength]) / source[roclength] emaroc = ema(roc, roclength / 2) isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2)) /////////////// Srategy /////////////// long = possig == 1 or (sslUp > sslDown and isMoving()) short = possig == -1 or (sslUp < sslDown 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]) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) /////////////// Dynamic ATR Stop Losses /////////////// _4 = input(false, "════════ Stop Loss ═══════") atrLkb = input(1, minval=1, title='ATR Stop Period') atrMult = input(2, step=0.25, title='ATR Stop Multiplier') atr1 = atr(atrLkb) longStop = 0.0 longStop := short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1] shortStop = 0.0 shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1] /////////////// Execution /////////////// if testPeriod() strategy.entry("L", strategy.long, when=long) strategy.entry("S", strategy.short, when=short) strategy.exit("L SL", "L", stop=longStop, when=since_longEntry > 0) strategy.exit("S SL", "S", stop=shortStop, when=since_shortEntry > 0) /////////////// Plotting /////////////// p1 = plot(sslDown, linewidth = 1, color=color.red, title="SSL down") p2 = plot(sslUp, linewidth = 1, color=color.lime, title="SSL up") fill(p1, p2, color = not isMoving() ? color.white : sslDown < sslUp ? color.lime : color.red, transp=80) plot(xLG1r, color=color.lime, title="LG1r") plot(xLG1s, color=color.red, title="LG1s") plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=1) plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=1) bgcolor(long ? color.green : short ? color.red : not isMoving() ? color.white : na, transp=80) bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)