Strategi Perdagangan Purata Pergerakan Gaussian


Tarikh penciptaan: 2024-01-03 16:06:45 Akhirnya diubah suai: 2024-01-03 16:06:45
Salin: 0 Bilangan klik: 1104
1
fokus pada
1621
Pengikut

Strategi Perdagangan Purata Pergerakan Gaussian

Gambaran keseluruhan

Strategi ini menggunakan pemikiran mengenai pengedaran Gaussian, mengira nilai Z berdasarkan purata bergerak indeks 10 kitaran Heckel, kemudian menetapkan had kepada purata bergerak indeks 20 kitaran nilai Z, dan menilai kedudukan teratas dan rendah berdasarkan keadaan yang melintasi kurva.

Prinsip Strategi

  1. Mengira purata bergerak indeks 10 kitaran harga penutupan Heckley.

  2. Berdasarkan data purata bergerak di atas, nilai Z dalam 25 kitaran dikira. Nilai Z mencerminkan perbezaan piawaian dari nilai purata data, yang dapat menentukan data normal atau tidak normal.

  3. Rata-rata bergerak indeks 20 kitaran untuk nilai Z dikira semula untuk mendapatkan kurva emaScore. Kurva ini mencerminkan trend jangka panjang nilai Z.

  4. Berdasarkan peredaran data emaScore, set ambang bawah ke atas. Mengingat bahawa terdapat beberapa turun naik pada kurva, 90% dan 10% data peredaran dipilih sebagai ambang bawah.

  5. Buat lebih banyak apabila emScore melintasi garis tengah atau bawah paras paras paras; buat kosong apabila emScore melintasi paras paras paras, paras paras paras atau paras paras paras tertinggi dalam 100 kitaran.

Analisis kelebihan

  1. Menggunakan pemikiran Gaussian, nilai Z untuk menilai kebiasaannya, penyaringan untuk penembusan palsu.

  2. Filter dua lapisan, operasi kurva exeScore, menilai trend jangka panjang EXTENSIVE511.

  3. Tetapkan had yang munasabah untuk mengurangkan kemungkinan transaksi yang salah.

  4. Bergabung dengan 100 pusingan tertinggi dan terendah, anda boleh merebut peluang untuk berpatah balik.

Analisis risiko

  1. Nilai Z digunakan dalam kombinasi dengan purata bergerak, sensitif kepada parameter dan memerlukan pengoptimuman.

  2. Tetapan had adalah munasabah atau tidak, terlalu lebar atau terlalu sempit tidak akan berkesan.

  3. Peringkat tertinggi dan terendah 100 kitaran mudah menyebabkan isyarat salah, dan keadaan pemicu boleh dilepaskan dengan sewajarnya.

  4. Helicopters sendiri agak ketinggalan zaman, dan perlu dinilai sama ada ia sesuai untuk strategi ini.

Arah pengoptimuman

  1. Uji purata bergerak untuk tempoh yang berbeza, parameter nilai Z.

  2. Menggunakan kaedah analisis maju berjalan untuk mengoptimumkan parameter secara automatik.

  3. Cuba kaedah yang berbeza untuk menetapkan nilai had, seperti kali ganda perbezaan piawai.

  4. Peningkatan logik penghakiman maksimum dan minimum untuk mengelakkan isyarat yang salah.

  5. Cuba jenis lain atau harga yang lebih murah, contohnya, alternatif Heckley.

ringkaskan

Strategi ini adalah berdasarkan kepada idea-idea Gaussian Distribution, dan menggunakan indeks ganda untuk menetapkan purata bergerak dan nilai terhad dinamik, untuk menilai harga yang tidak normal dan menghasilkan isyarat perdagangan. Kelebihan utamanya adalah penapisan untuk memecahkan palsu, menangkap reversal. Tetapi parameter dan penggunaan kombinasi mempunyai kesan yang besar terhadap hasilnya, dan masih perlu terus diuji dan dioptimumkan untuk mencari parameter dan kombinasi terbaik.

Kod sumber strategi
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 5m
basePeriod: 1m
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/
// © jensenvilhelm

// Here is an attempt to create a robust strategy for BTCUSD on a 5 minute chart
// I can't seem to get this code to work the way i want.... if you want to give it a try, please let me know -
// how it goes in comment section. 

//@version=5
// Define the strategy settings
strategy("The Z-score", shorttitle="TZS", overlay=true)

// User can set the start date for the strategy
startDate = timestamp("2023 06 01")

// Heikin-Ashi Open, Close, High and Low calculation
haClose = ohlc4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2
haHigh = math.max(nz(haOpen, high), nz(haClose, high), high)
haLow = math.min(nz(haOpen, low), nz(haClose, low), low)

// Function to calculate the Z-Score
z_score(_series, _length) =>
    _mean = ta.sma(_series, _length)
    _stddev = ta.stdev(_series, _length)
    (_series - _mean) / _stddev

// Compute the score and its EMA
score = z_score(ta.ema(haClose, 10), 25)
emaScore = ta.ema(score, 20)

// Calculate lower and upper thresholds using percentiles of EMA
lowerBlue = ta.percentile_linear_interpolation(emaScore, 50, 10)
upperBlue = ta.percentile_linear_interpolation(emaScore, 50, 90)

// Calculate the middle line as 50th percentile
middleLine = ta.percentile_linear_interpolation(emaScore, 50, 50) 

// Plot the EMA of the score and the thresholds
plot(emaScore,"The White Line", color=color.white, linewidth=2)
plot(lowerBlue,"Lower Blue Line", linewidth=2)
plot(upperBlue, "Upper Blue Line", linewidth=2)
plot(middleLine, "Middle Yellow Line", linewidth=2, color=color.yellow)
plot(score,"The Z-Score Mixed With EMA 10", color=color.green)

// Calculate highest and lowest EMA score over 100 bars period
highest = ta.highest(emaScore, 100)
lowest = ta.lowest(emaScore, 100)

// Plot highest and lowest EMA score lines 
plot(highest, "Highest of emaScore", color=color.red, linewidth=2)
plot(lowest, "Lowest of emaScore", color=color.red, linewidth=2)

// Define entry and exit conditions for long and short positions
longCon = ta.crossover(score, lowerBlue) or ta.crossover(emaScore, middleLine)
addOn = ta.crossover(score, highest)
shortCon = ta.crossunder(emaScore, upperBlue) or ta.crossunder(emaScore, lowerBlue) or ta.crossunder(emaScore, highest)

// Execute trading logic based on conditions and after the start date
if (time >= startDate)
    if longCon
        strategy.entry("Long", strategy.long)
        if shortCon
            strategy.close("Long")
    if addOn
        strategy.entry("LongNR2", strategy.long)
        if shortCon
            strategy.close("LongNR2")
    
    if shortCon
        strategy.entry("Short", strategy.short)
        if longCon
            strategy.close("Short")