وزن شدہ معیاری انحراف ٹریڈنگ کی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-11-24 13:54:58
ٹیگز:

img

جائزہ

یہ حکمت عملی کریپٹو کرنسیوں پر رجحان کی تجارت کو نافذ کرنے کے لئے چلتی اوسط کے ساتھ مل کر وزن شدہ معیاری انحراف اشارے کا استعمال کرتی ہے۔ یہ ایک خاص مدت کے دوران بند ہونے والی قیمتوں اور حجم کی بنیاد پر وزن شدہ معیاری انحراف کے قیمت چینل کا حساب لگاتی ہے۔ جب قیمت اوپری یا نچلی چینل سے ٹوٹ جاتی ہے تو ، لمبی یا مختصر پوزیشنیں لی جاتی ہیں۔ اسٹاپ نقصان اور منافع کی شرائط بھی ہر تجارت میں نقصانات کو محدود کرنے کے لئے مقرر کی جاتی ہیں۔

حکمت عملی منطق

کوڈ میں وقت کی سیریز اور صفوں سے وزن شدہ معیاری انحراف کا حساب لگانے کے لئے دو کسٹم افعال کی وضاحت کی گئی ہے۔ کلیدی اقدامات یہ ہیں:

  1. اختتامی قیمت اور حجم کی بنیاد پر وزن شدہ اوسط قیمت کا حساب لگائیں
  2. اوسط قیمت کے مقابلے میں ہر موم بتی کی مربع غلطی کا حساب لگائیں
  3. نمونہ کے سائز، وزن اور ایڈجسٹ شدہ اوسط پر مبنی تغیر کا حساب لگائیں
  4. معیاری انحراف حاصل کرنے کے لئے مربع جڑ لے لو

اس سے ہمیں ایک چینل ملتا ہے جس کا مرکز وزن شدہ اوسط قیمت پر ہوتا ہے ، جس کی اوپری اور نچلی حدود ایک معیاری انحراف کے فاصلے پر ہوتی ہیں۔ جب قیمت نیچے سے چینل کے نیچے سے ٹوٹ جاتی ہے تو ، طویل ہوجائیں۔ جب یہ اوپر سے اوپر سے ٹوٹ جاتی ہے تو ، مختصر ہوجائیں۔

فوائد کا تجزیہ

اس حکمت عملی کا سب سے بڑا حاشیہ چلتی اوسط اور اتار چڑھاؤ کے تجزیے کا امتزاج ہے۔ ایم اے مارکیٹ کے رجحان کی سمت کا فیصلہ کرتا ہے جبکہ ایس ڈی رینج ایک معقول بینڈ کی وضاحت کرتا ہے - دونوں ایک دوسرے کی زیادہ سے زیادہ وشوسنییتا کے ل verify تصدیق کرتے ہیں۔ نیز ، حجم وزن اصل وقفوں پر کامیابی کے زیادہ امکان کے ل false جھوٹے وقفوں کو فلٹر کرنے میں مدد کرتا ہے۔

اسٹاپ نقصان اور منافع حاصل کرنے کے نکات مزید رجحان کے ساتھ تجارت کرنے میں مدد کرتے ہیں اور الٹ جانے پر زیادہ نقصانات سے بچتے ہیں۔ یہ ایک لطیفہ ہے جسے بہت سے ابتدائی تاجر لاگو کرنے میں ناکام رہتے ہیں۔

خطرے کا تجزیہ

مارکیٹ میں شدید اتار چڑھاؤ کا سب سے بڑا خطرہ ہے۔ اس سے ایس ڈی چینل بھی بے حد اتار چڑھاؤ کا شکار ہوسکتا ہے ، جس سے فیصلے مشکل ہوجاتے ہیں۔ نیز ، بہت کم مدت کا انتخاب کرنے سے شور اور غلطیوں سے گمراہ ہونے کا خطرہ ہے۔

علاج پیرامیٹرز اور مدت کی ترتیبات کو مناسب طریقے سے ہموار کرنا ہے۔ توڑ کی تصدیق کو بہتر بنانے کے لئے RSI جیسے دوسرے اشارے کو جوڑنے پر غور کریں۔

اصلاح کی ہدایات

  1. مدت پیرامیٹرز کو بہتر بنائیں - بہترین مجموعہ کے لئے ٹیسٹ 5 منٹ، 15 منٹ، 30 منٹ وغیرہ
  2. زیادہ سے زیادہ واپسی کے لئے سٹاپ نقصان / منافع لینے کے تناسب کو بہتر بنائیں
  3. غلط وقفے سے بچنے کے لئے فلٹرز مثال حجم شامل کریں
  4. درستگی کو بہتر بنانے کے لئے قریبی قیمت، فلیٹ وغیرہ پر موم بتی فلٹر شامل کریں

نتیجہ

یہ حکمت عملی کریپٹوکرنسی کے رجحانات کو ٹریک کرنے کے لئے ایم اے کے ساتھ مل کر وزن والے معیاری انحراف کے اشارے کو کامیابی کے ساتھ استعمال کرتی ہے۔ معقول اسٹاپ نقصان / منافع حاصل کرنے کے سیٹ اپ بھی تجارتی مارکیٹ کی رفتار میں مدد کرتے ہیں اور حد سے زیادہ الٹ نقصانات سے بچنے میں مدد کرتے ہیں۔ پیرامیٹر ٹیوننگ اور کثیر اشارے کی تصدیق کے ذریعے مزید اصلاحات ایک ٹھوس الگو ٹریڈنگ حکمت عملی کے لئے وشوسنییتا کو بہتر بنا سکتی ہیں۔


/*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)

مزید