Strategi Perdagangan Deviasi Standar Tertimbang Rata-rata Bergerak


Tanggal Pembuatan: 2023-11-24 13:54:58 Akhirnya memodifikasi: 2023-11-24 13:54:58
menyalin: 0 Jumlah klik: 776
1
fokus pada
1621
Pengikut

Strategi Perdagangan Deviasi Standar Tertimbang Rata-rata Bergerak

Ringkasan

Strategi ini menggunakan indikator standar deviasi berbobot, dikombinasikan dengan rata-rata bergerak, untuk melakukan perdagangan tren terhadap cryptocurrency. Strategi ini menghitung saluran standar deviasi berbobot harga berdasarkan harga penutupan dan volume transaksi dalam periode tertentu.

Prinsip Strategi

Kode ini mendefinisikan dua fungsi kustom, yang masing-masing berbeda dengan standar bobot dari waktu dan array. Langkah utamanya adalah:

  1. Harga rata-rata tertimbang berdasarkan harga close out dan volume transaksi
  2. Hitung kuadrat dari kesalahan setiap garis K dengan nilai rata-rata
  3. Divergensi dihitung berdasarkan rata-rata jumlah dan berat sampel yang disesuaikan
  4. Keterbatasan standar

Dengan demikian, kita mendapatkan sebuah saluran yang pusatnya berada pada harga rata-rata tertimbang, dan jarak ke atas ke bawah adalah satu standar deviasi. Bila harga dari bawah menembus bagian bawah saluran, lakukan lebih banyak; Bila dari atas menembus bagian atas saluran, lakukan lebih sedikit.

Analisis Keunggulan

Keuntungan terbesar dari strategi ini adalah menggabungkan analisis rata-rata bergerak dan volatilitas. Rata-rata bergerak menentukan arah tren pasar, standar deviasi mendefinisikan interval yang masuk akal, keduanya saling diverifikasi, reliabilitas yang lebih tinggi. Selain itu, bobot volume transaksi dapat disaring untuk membuat terobosan palsu, probabilitas terobosan yang sebenarnya lebih besar.

Strategi ini juga mengatur stop loss stop, yang membantu untuk menangkap tren, dan menghindari reversal yang menyebabkan kerugian yang terlalu besar. Ini adalah titik yang tidak dapat dikuasai oleh banyak pemula.

Analisis risiko

Risiko utama adalah bahwa pasar dapat mengalami fluktuasi yang sangat besar. Pada saat ini, saluran standar deviasi juga akan berfluktuasi besar, yang tidak menguntungkan penilaian. Selain itu, jika siklus pemilihan terlalu pendek, mudah terganggu oleh kebisingan, tingkat kesalahan yang lebih besar.

Cara lain yang bisa dilakukan adalah dengan menyesuaikan parameter siklus dan meluruskan kurva. Selain itu, indikator lain seperti RSI juga dapat dipertimbangkan untuk meningkatkan efek konfirmasi terobosan.

Arah optimasi

  1. Parameter siklus optimasi: Anda dapat menguji siklus yang berbeda, seperti 5 menit, 15 menit, 30 menit, dan lain-lain, untuk menemukan kombinasi optimal
  2. Optimalkan Stop Loss Stop Ratio. Uji berbagai Stop Loss Stop Point untuk mendapatkan hasil yang optimal
  3. Menambahkan kondisi penyaringan. Misalnya, menggabungkan volume lalu lintas, menghindari false breakout yang menyebabkan Loss
  4. Meningkatkan indikator ketebalan, misalnya dengan mengkonfirmasi entitas K-line melalui posisi harga closeout, panjang garis bayangan, dan lain-lain, mengurangi tingkat kesalahan

Meringkaskan

Strategi ini berhasil memanfaatkan indikator standar deviasi berbobot, didukung oleh penilaian arah rata-rata bergerak, untuk melacak tren cryptocurrency. Pada saat yang sama, pengaturan stop loss yang masuk akal membantu untuk memahami irama pasar dan menghindari perubahan yang berlebihan yang menyebabkan kerugian.

Kode 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)