Strategi Perdagangan Sisihan Piawai Berwajaran Purata Bergerak


Tarikh penciptaan: 2023-11-24 13:54:58 Akhirnya diubah suai: 2023-11-24 13:54:58
Salin: 0 Bilangan klik: 776
1
fokus pada
1621
Pengikut

Strategi Perdagangan Sisihan Piawai Berwajaran Purata Bergerak

Gambaran keseluruhan

Strategi ini menggunakan indikator standard deviasi bertimbangan, digabungkan dengan purata bergerak, untuk mencapai perdagangan trend terhadap mata wang kripto. Strategi ini mengira saluran standard deviasi bertimbangan harga berdasarkan harga penutupan dan jumlah transaksi dalam tempoh tertentu.

Prinsip Strategi

Kod ini mentakrifkan dua fungsi tersuai yang berbeza dengan standard berat dari siri masa dan pengiraan array. Langkah-langkah utama adalah:

  1. Harga purata bertimbangan berdasarkan harga penutupan dan jumlah transaksi
  2. Hitung kuasa dua kesilapan setiap garis K dengan nilai purata
  3. Divergensi yang dikira mengikut purata yang disesuaikan dengan jumlah dan berat sampel
  4. Kaedah untuk mendapatkan perbezaan piawai

Dengan cara ini, kita mendapat saluran yang mempunyai pusat pada harga purata bertimbangan dan jarak ke atas ke bawah adalah satu perbezaan piawai. Apabila harga dari bawah menembusi bahagian bawah saluran itu, lakukan lebih banyak; apabila dari atas menembusi bahagian atas saluran itu, lakukan kosong.

Analisis kelebihan

Kelebihan terbesar strategi ini adalah menggabungkan purata bergerak dan analisis kadar turun naik. Purata bergerak menentukan arah trend pasaran, perbezaan piawai menentukan julat yang munasabah, kedua-duanya saling disahkan, kebolehpercayaan yang tinggi. Selain itu, berat dagangan boleh menapis penipuan palsu, kemungkinan sebenar lebih besar.

Strategi ini juga menetapkan titik hentian kerugian, yang berguna untuk memahami trend dan mengelakkan pembalikan menyebabkan kerugian yang berlebihan. Ini adalah perkara yang tidak dapat dikuasai oleh banyak pemula.

Analisis risiko

Risiko utama adalah bahawa pasaran mungkin mengalami turun naik yang teruk. Pada masa ini, jurang standard deviasi juga akan turun naik secara besar-besaran, yang tidak baik untuk membuat keputusan. Selain itu, jika kitaran pemilihan terlalu pendek, mudah terganggu oleh bunyi bising, kadar kesilapan yang tinggi.

Penyelesaian adalah, parameter kitaran boleh disesuaikan dengan sewajarnya, kelancaran keluk. Ia juga boleh dipertimbangkan untuk menggabungkan dengan penunjuk lain, seperti RSI, untuk meningkatkan kesan pengesahan pecah.

Arah pengoptimuman

  1. Parameter kitaran pengoptimuman. Anda boleh menguji kitaran yang berbeza, seperti 5 minit, 15 minit, 30 minit, dan lain-lain untuk mencari kombinasi terbaik
  2. Mengoptimumkan nisbah hentian hentian. Uji titik hentian hentian yang berbeza untuk mendapatkan kadar pulangan yang optimum
  3. Tambah syarat penapisan. Contohnya, menggabungkan jumlah lalu lintas untuk mengelakkan kerugian palsu.
  4. Menambah penunjuk ketegangan, seperti mengesahkan entiti K-line melalui kedudukan harga penutupan, panjang garis bayangan, dan lain-lain, mengurangkan kadar kesilapan

ringkaskan

Strategi ini berjaya menggunakan indikator standard deviasi bertimbangan, dibantu dengan penilaian arah dengan purata bergerak, untuk mengesan trend mata wang kripto. Pada masa yang sama, penyetempatan stop loss yang munasabah membantu memahami irama pasaran dan mengelakkan perubahan yang berlebihan yang membawa kerugian.

Kod sumber strategi
/*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)