मूविंग एवरेज भारित मानक विचलन ट्रेडिंग रणनीति


निर्माण तिथि: 2023-11-24 13:54:58 अंत में संशोधित करें: 2023-11-24 13:54:58
कॉपी: 0 क्लिक्स: 776
1
ध्यान केंद्रित करना
1621
समर्थक

मूविंग एवरेज भारित मानक विचलन ट्रेडिंग रणनीति

अवलोकन

इस रणनीति का उपयोग भारित मानक अंतर संकेतक है, जो चलती औसत के साथ संयुक्त है, क्रिप्टोकरेंसी के लिए प्रवृत्ति व्यापार को लागू करने के लिए। रणनीति एक निश्चित अवधि के भीतर समापन मूल्य और लेनदेन की मात्रा के आधार पर कीमतों के भारित मानक अंतर चैनल की गणना करती है। जब कीमत चैनल को तोड़ती है, तो अधिक खाली करें। साथ ही, स्टॉप लॉस की स्थिति सेट करें, एकमुश्त नुकसान को कम करें।

रणनीति सिद्धांत

कोड में दो कस्टम फ़ंक्शंस को परिभाषित किया गया है, जो क्रमशः समय अनुक्रम और सरणी गणना से भारित मानक अंतर हैं। मुख्य चरण हैंः

  1. समापन मूल्य और लेनदेन की मात्रा के आधार पर भारित औसत मूल्य की गणना
  2. प्रत्येक K लाइन के लिए औसत मूल्य से त्रुटि का वर्ग
  3. नमूना मात्रा और वजन के लिए समायोजित औसत के आधार पर अंतर की गणना
  4. खोलने पर मानक अंतर

इस प्रकार, हमें एक ऐसा चैनल मिलता है जिसका केंद्र भारित औसत मूल्य पर है, और ऊपर से नीचे की दूरी एक मानक विचलन है। जब कीमत नीचे से उस चैनल के निचले हिस्से को तोड़ती है, तो अधिक करें; जब यह ऊपर से चैनल के शीर्ष को तोड़ती है, तो खाली करें।

श्रेष्ठता विश्लेषण

इस रणनीति का सबसे बड़ा लाभ यह है कि इसमें चलती औसत और अस्थिरता विश्लेषण शामिल हैं। चलती औसत बाजार की प्रवृत्ति की दिशा का आकलन करता है, मानक विचलन एक उचित सीमा को परिभाषित करता है, दोनों एक-दूसरे को सत्यापित करते हैं, और उच्च विश्वसनीयता है। इसके अलावा, लेन-देन का वजन नकली तोड़ने के लिए फ़िल्टर किया जा सकता है, वास्तविक तोड़ने की संभावना अधिक है।

इस रणनीति में स्टॉप लॉस स्टॉप पॉइंट्स भी हैं जो प्रवृत्ति को पकड़ने में मदद करते हैं और रिवर्स से बचने के लिए बहुत अधिक नुकसान से बचते हैं। यह एक ऐसा बिंदु है जिसे कई शुरुआती लोग नहीं समझते हैं।

जोखिम विश्लेषण

मुख्य जोखिम यह है कि बाजार में भारी उतार-चढ़ाव हो सकता है। इस समय मानक विचलन चैनल भी काफी उतार-चढ़ाव कर सकता है, जो निर्णय के लिए प्रतिकूल है। इसके अलावा, यदि चयन चक्र बहुत छोटा है, तो शोर से परेशान होने के लिए आसान है, त्रुटि दर अधिक है।

इसका मुकाबला करने के लिए, चक्र पैरामीटर को उचित रूप से समायोजित किया जा सकता है, और वक्र को चिकना किया जा सकता है। अन्य संकेतकों के साथ संयोजन पर विचार किया जा सकता है, जैसे कि आरएसआई, और अधिक सफलता की पुष्टि करने के लिए।

अनुकूलन दिशा

  1. अनुकूलन चक्र पैरामीटर: 5 मिनट, 15 मिनट, 30 मिनट और अन्य विभिन्न चक्रों का परीक्षण करके इष्टतम संयोजन की तलाश करें
  2. स्टॉप-स्टॉप अनुपात का अनुकूलन करें. विभिन्न स्टॉप-स्टॉप बिंदुओं का परीक्षण करें और इष्टतम रिटर्न प्राप्त करें
  3. फ़िल्टरिंग की शर्तें जोड़ें। जैसे कि संश्लेषण यातायात, झूठी दरारों से बचने के लिए Loss
  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)