এই কৌশলটি ক্রিপ্টোকারেন্সিতে ট্রেন্ড ট্রেডিং বাস্তবায়নের জন্য চলমান গড়ের সাথে মিলিত ওয়েটেড স্ট্যান্ডার্ড ডিভিয়েশন সূচক ব্যবহার করে। এটি নির্দিষ্ট সময়ের মধ্যে বন্ধের দাম এবং ভলিউমের উপর ভিত্তি করে ওয়েটেড স্ট্যান্ডার্ড ডিভিয়েশন মূল্য চ্যানেল গণনা করে। যখন দাম উপরের বা নীচের চ্যানেলটি ভেঙে যায়, তখন দীর্ঘ বা সংক্ষিপ্ত অবস্থান নেওয়া হয়। প্রতি বাণিজ্যে ক্ষতি সীমাবদ্ধ করতে স্টপ লস এবং লাভের শর্তগুলিও সেট করা হয়।
কোডটি সময় সিরিজ এবং অ্যারে থেকে ওজনযুক্ত স্ট্যান্ডার্ড ডিভিয়েশন গণনা করার জন্য দুটি কাস্টম ফাংশন সংজ্ঞায়িত করে। মূল পদক্ষেপগুলি হলঃ
এটি আমাদেরকে একটি চ্যানেল দেয় যা ওজনযুক্ত গড় মূল্যের উপর কেন্দ্রীভূত, উপরের এবং নীচের সীমানা এক স্ট্যান্ডার্ড বিচ্যুতি দূরে। যখন দাম চ্যানেলের নীচে থেকে ভেঙে যায়, তখন দীর্ঘ যান। যখন এটি উপরে থেকে শীর্ষে ভেঙে যায়, তখন সংক্ষিপ্ত যান।
এই কৌশলটির বৃহত্তম প্রান্ত হ'ল চলমান গড় এবং অস্থিরতা বিশ্লেষণের সংমিশ্রণ। এমএ বাজারের প্রবণতার দিক বিচার করে যখন এসডি ব্যাপ্তি একটি যুক্তিসঙ্গত ব্যান্ড সংজ্ঞায়িত করে - উভয়ই উচ্চতর নির্ভরযোগ্যতার জন্য একে অপরকে যাচাই করে। এছাড়াও, ভলিউম ওজন প্রকৃত বিরতিতে উচ্চতর সাফল্যের সম্ভাবনা জন্য মিথ্যা বিরতি ফিল্টার করতে সহায়তা করে।
স্টপ লস এবং টেক প্রফিট পয়েন্টগুলি ট্রেন্ডের সাথে ট্রেড করতে এবং বিপরীতমুখী ক্ষেত্রে অত্যধিক ক্ষতি এড়াতে আরও সহায়তা করে। এটি একটি সূক্ষ্মতা যা অনেক শিক্ষানবিস ব্যবসায়ী বাস্তবায়ন করতে ব্যর্থ হয়।
মূল ঝুঁকিটি হল বাজারের মারাত্মক ওঠানামা। এটি এসডি চ্যানেলকেও বন্যভাবে ওঠানামা করতে পারে, যা বিচারকে কঠিন করে তোলে। এছাড়াও, খুব কম সময়কাল বেছে নেওয়ার ফলে গোলমাল এবং ত্রুটির কারণে বিভ্রান্ত হওয়ার ঝুঁকি রয়েছে।
প্রতিকারটি হল প্যারামিটার এবং সময়কালের সেটিংগুলি যথাযথভাবে মসৃণ করা। ব্রেকআউট নিশ্চিতকরণ উন্নত করতে আরএসআইয়ের মতো অন্যান্য সূচকগুলি একত্রিত করার বিষয়টি বিবেচনা করুন।
এই কৌশলটি সফলভাবে ক্রিপ্টোকারেন্সি প্রবণতা ট্র্যাক করার জন্য এমএ এর সাথে ওজনযুক্ত স্ট্যান্ডার্ড ডিভিয়েশন সূচক ব্যবহার করে। যুক্তিসঙ্গত স্টপ লস / লাভ গ্রহণ সেটআপগুলিও ট্রেডিং মার্কেটের ছন্দকে সহায়তা করে এবং অত্যধিক বিপরীত ক্ষতি এড়ায়। প্যারামিটার টিউনিং এবং মাল্টি-ইনডিকেটর নিশ্চিতকরণের মাধ্যমে আরও অপ্টিমাইজেশন একটি শক্ত আলগো ট্রেডিং কৌশলটির জন্য নির্ভরযোগ্যতা উন্নত করতে পারে।
/*backtest start: 2023-11-16 00:00:00 end: 2023-11-23 00:00:00 period: 45m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © rumpypumpydumpy © cache_that_pass //@version=4 strategy("[cache_that_pass] 1m 15m Function - Weighted Standard Deviation", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=20, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.075) f_weighted_sd_from_series(_src, _weight, _n) => //{ // @function: Calculates weighted mean, variance, standard deviation, MSE and RMSE from time series variables // @parameters: // _src: time series variable of sample values // _weight: time series of corresponding weight values. // _n : number of samples _xw = _src * _weight _sum_weight = sum(_weight, _n) _mean = sum(_xw, _n) / _sum_weight float _sqerror_sum = 0 int _nonzero_n = 0 for _i = 0 to _n - 1 _sqerror_sum := _sqerror_sum + pow(_mean - _src[_i], 2) * _weight[_i] _nonzero_n := _weight[_i] != 0 ? _nonzero_n + 1 : _nonzero_n _variance = _sqerror_sum / ((_nonzero_n - 1) * _sum_weight / _nonzero_n) _dev = sqrt(_variance) _mse = _sqerror_sum / _sum_weight _rmse = sqrt(_mse) [_mean, _variance, _dev, _mse, _rmse] //} // ----------------------------------------------------------------------------- f_weighted_sd_from_arrays(_a_src, _a_weight, _n) => //{ // @function: Calculates weighted mean, variance, standard deviation, MSE and RMSE from arrays // Expects index 0 of the arrays to be the most recent sample and weight values! // @parameters: // _a_src: array of sample values // _a_weight: array of corresponding weight values. // _n : number of samples float _mean = na, float _variance = na, float _dev = na, float _mse = na float _rmse = na, float _sqerror_sum = na, float _sum_weight = na float[] _a_xw = array.new_float(_n) int _nonzero_n = 0 if array.size(_a_src) >= _n _sum_weight := 0 _sqerror_sum := 0 for _i = 0 to _n - 1 array.set(_a_xw, _i, array.get(_a_src, _i) * array.get(_a_weight, _i)) _sum_weight := _sum_weight + array.get(_a_weight, _i) _nonzero_n := array.get(_a_weight, _i) != 0 ? _nonzero_n + 1 : _nonzero_n _mean := array.sum(_a_xw) / _sum_weight for _j = 0 to _n - 1 _sqerror_sum := _sqerror_sum + pow(_mean - array.get(_a_src, _j), 2) * array.get(_a_weight, _j) _variance := _sqerror_sum / ((_nonzero_n - 1) * _sum_weight / _nonzero_n) _dev := sqrt(_variance) _mse := _sqerror_sum / _sum_weight _rmse := sqrt(_mse) [_mean, _variance, _dev, _mse, _rmse] //} // ----------------------------------------------------------------------------- // Example usage : // ----------------------------------------------------------------------------- len = input(20) // ----------------------------------------------------------------------------- // From series : // ----------------------------------------------------------------------------- [m, v, d, mse, rmse] = f_weighted_sd_from_series(close, volume, len) plot(m, color = color.blue) plot(m + d * 2, color = color.blue) plot(m - d * 2, color = color.blue) // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // From arrays : // ----------------------------------------------------------------------------- var float[] a_src = array.new_float() var float[] a_weight = array.new_float() if barstate.isfirst for i = 1 to len array.unshift(a_weight, i) array.unshift(a_src, close) if array.size(a_src) > len array.pop(a_src) [a_m, a_v, a_d, a_mse, a_rmse] = f_weighted_sd_from_arrays(a_src, a_weight, len) plot(a_m, color = color.orange) plot(a_m + a_d * 2, color = color.orange) plot(a_m - a_d * 2, color = color.orange) // ----------------------------------------------------------------------------- series_text = "Mean : " + tostring(m) + "\nVariance : " + tostring(v) + "\nSD : " + tostring(d) + "\nMSE : " + tostring(mse) + "\nRMSE : " + tostring(rmse) array_text = "Mean : " + tostring(a_m) + "\nVariance : " + tostring(a_v) + "\nSD : " + tostring(a_d) + "\nMSE : " + tostring(a_mse) + "\nRMSE : " + tostring(a_rmse) debug_text = "Volume weighted from time series : \n" + series_text + "\n\nLinearly weighted from arrays : \n" + array_text //debug = label.new(x = bar_index, y = close, text = debug_text, style = label.style_label_left) //.delete(debug[1]) //test strategy if low <= (m - d * 2) strategy.entry("LE", strategy.long) if high >= (m + d * 2) strategy.entry("SE", strategy.short) // User Options to Change Inputs (%) stopPer = input(3.11, title='Stop Loss %', type=input.float) / 100 takePer = input(7.50, title='Take Profit %', type=input.float) / 100 // Determine where you've entered and in what direction longStop = strategy.position_avg_price * (1 - stopPer) shortStop = strategy.position_avg_price * (1 + stopPer) shortTake = strategy.position_avg_price * (1 - takePer) longTake = strategy.position_avg_price * (1 + takePer) if strategy.position_size > 0 strategy.exit(id="Close Long", stop=longStop, limit=longTake) // strategy.close("LE", when = (longStop) or (longTake), qty_percent = 100) if strategy.position_size < 0 strategy.exit(id="Close Short", stop=shortStop, limit=shortTake) // strategy.close("SE", when = (shortStop) or (shortTake), qty_percent = 100)