এই কৌশলটি একটি রৈখিক রিগ্রেশন ফাংশন এবং সর্বনিম্ন বর্গক্ষেত্র পদ্ধতি ব্যবহার করে দুটি সবুজ এবং লাল রেখার সমন্বয়ে গঠিত একটি মূল্য চ্যানেল গণনা করে। এটি সাম্প্রতিক ATR এর উপর ভিত্তি করে একটি গতিশীল স্টপ লস ব্যবহার করে।
কৌশলটি দৈর্ঘ্য 25 এবং শিফট 5 এর সাথে রৈখিক রিগ্রেশন ব্যবহার করে কেন্দ্রীয় রেখা xLG গণনা করে। তারপরে এটি কেন্দ্রীয় রেখার উপরে এবং নীচে 6% চ্যানেল পরিসীমা হিসাবে নেয়, xLG1r উপরের লাইন এবং xLG1s নিম্ন লাইন হিসাবে।
যখন মূল্য xLG1r এর উপরে থাকে, তখন এটি দীর্ঘ হয়। যখন মূল্য xLG1s এর নীচে থাকে, তখন এটি সংক্ষিপ্ত হয়। এটি শেষ দীর্ঘ এবং সংক্ষিপ্ত সময় রেকর্ড করে। শেষ দীর্ঘ সময়টি শেষ সংক্ষিপ্ত সময়ের চেয়ে বড় হলে একটি দীর্ঘ সংকেত উত্পন্ন হয়। শেষ সংক্ষিপ্ত সময়টি শেষ দীর্ঘ সময়ের চেয়ে বড় হলে একটি সংক্ষিপ্ত সংকেত উত্পন্ন হয়।
ডায়নামিক এটিআর স্টপ লস এটিআর সময়কাল 1 এবং গুণক 2 ব্যবহার করে। দীর্ঘ ব্যবসার জন্য, স্টপ লস হ'ল বন্ধের মূল্য বিয়োগ এটিআর মান বার গুণক। সংক্ষিপ্ত ব্যবসার জন্য, স্টপ লস হ'ল বন্ধের মূল্য প্লাস এটিআর মান বার গুণক।
এই কৌশলটি একটি অভিযোজিত প্রবণতা ট্র্যাকিং সিস্টেম তৈরি করতে প্রবণতা অনুসরণ, গতিশীল স্টপ এবং ব্রেকআউট সংকেতগুলির মতো একাধিক কৌশলকে একত্রিত করে। প্যারামিটার অপ্টিমাইজেশন এবং সংকেত ফিল্টারিংয়ের আরও উন্নতি স্থিতিশীলতা এবং লাভজনকতা উন্নত করতে পারে। এটি কোয়ান্টাম ট্রেডারদের জন্য একটি মূল্যবান পদ্ধতি সরবরাহ করে।
/*backtest start: 2023-01-01 00:00:00 end: 2023-06-24 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // Thanks to HPotter for the original code for Center of Gravity Backtest strategy("Center of Gravity 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.15) /////////////// 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 ///////////// Center of Gravity ///////////// 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)) /////////////// Srategy /////////////// long = possig == 1 short = possig == -1 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 /////////////// 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("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short) strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0) strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0) /////////////// Plotting /////////////// 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(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90) bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)