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