Strategi Perdagangan Rata-rata Pergerakan Gaussian


Tanggal Pembuatan: 2024-01-03 16:06:45 Akhirnya memodifikasi: 2024-01-03 16:06:45
menyalin: 0 Jumlah klik: 1104
1
fokus pada
1621
Pengikut

Strategi Perdagangan Rata-rata Pergerakan Gaussian

Ringkasan

Strategi ini menggunakan pemikiran distribusi Gaussian, menghitung nilai Z berdasarkan indeks bergerak 10 periode Heckel, kemudian menetapkan nilai threshold pada indeks bergerak 20 periode nilai Z, dan menilai posisi terdepan dan posisi terdepan berdasarkan keadaan yang melintasi kurva.

Prinsip Strategi

  1. Menghitung rata-rata bergerak indeks 10 periode dari harga akhir Heckley.

  2. Berdasarkan data rata-rata bergerak di atas, menghitung nilai Z dalam 25 periode. Nilai Z mencerminkan standar deviasi dari rata-rata data, yang dapat menentukan apakah data tersebut normal atau abnormal.

  3. Rata-rata bergerak indeks 20 periode untuk nilai Z dihitung lagi, dan menghasilkan kurva emaScore. Kurva ini mencerminkan tren jangka panjang dari nilai Z.

  4. Berdasarkan distribusi data emaScore, setel ambang batas atas dan bawah. Mengingat bahwa kurva akan berfluktuasi, 90% dan 10% dari distribusi data dipilih sebagai ambang batas.

  5. Ketika emScore melewati garis tengah atau batas bawah, lakukan lebih banyak; ketika emScore melewati batas bawah, batas bawah, atau titik tertinggi dalam 100 siklus, kosongkan.

Analisis Keunggulan

  1. Menggunakan konsep Gaussian Distribution, normalitas dinilai dengan nilai Z, dan penembusan palsu dapat disaring.

  2. Filter ganda, operasi kurva exeScore, untuk menilai tren jangka panjang EXTENSIVE511.

  3. Tetapkan ambang batas yang wajar untuk mengurangi kemungkinan transaksi yang salah.

  4. Jika Anda memiliki kesempatan untuk berbalik, maka Anda bisa mengambil kesempatan untuk berbalik dengan menggabungkan titik tertinggi dan terendah dari siklus.

Analisis risiko

  1. Nilai Z digunakan dalam kombinasi dengan moving average, sensitif terhadap parameter, dan perlu dioptimalkan.

  2. Setel nilai ambang batas yang masuk akal dan tidak relevan dengan besar, terlalu lebar atau terlalu sempit.

  3. Pada titik tertinggi dan terendah dari 100 siklus, sinyal yang salah dapat dihasilkan, dan kondisi pemicu dapat dilepaskan secara tepat.

  4. Helix sendiri memiliki keterlambatan dan perlu dievaluasi apakah cocok untuk strategi tersebut.

Arah optimasi

  1. Uji rata-rata bergerak dari periode yang berbeda, parameter nilai Z.

  2. Parameter yang dioptimalkan secara otomatis menggunakan metode walk forward analysis.

  3. Cobalah metode yang berbeda untuk menetapkan nilai ambang, seperti perkalian standar.

  4. Ini adalah salah satu fitur yang digunakan oleh Google untuk memaksimalkan pengukuran dan pengukuran.

  5. Cobalah jenis lain atau harga yang lebih murah, seperti Heckle Berry.

Meringkaskan

Strategi ini didasarkan pada pemikiran distribusi Gaussian, dengan pengaturan moving average dan threshold dinamis melalui indeks ganda, secara efektif menilai abnormalitas harga dan menghasilkan sinyal perdagangan. Keuntungan utama adalah dapat disaring false breakout, menangkap reversal. Namun, pengaturan parameter dan penggunaan kombinasi sangat berpengaruh pada hasil, masih perlu terus diuji dan dioptimalkan, mencari cara terbaik untuk parameter dan kombinasi.

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