ALMA Crossover Strategi

Penulis:ChaoZhang, Tanggal: 2023-09-23 15:11:02
Tag:

Gambaran umum

Strategi ini menggunakan dua Arnaud Legoux Moving Averages (ALMA), satu cepat dan satu lambat, untuk menghasilkan sinyal crossover. ALMA mengurangi lag dan meluruskan garis sinyal dibandingkan dengan MAs tradisional. Filter volume ditambahkan untuk meningkatkan akurasi sinyal.

Logika Strategi

Indikator dan aturan inti adalah:

  1. ALMA cepat: periode yang lebih pendek untuk menangkap breakout.

  2. ALMA lambat: Periode yang lebih lama untuk mengukur tren.

  3. Filter volume: Berlaku ketika EMA pendek melintasi EMA panjang.

  4. Sinyal beli: ALMA cepat melintasi ALMA lambat dan filter volume melewati.

  5. Sinyal jual: ALMA cepat melintasi ALMA lambat.

  6. Sinyal pendek: ALMA cepat melintasi ALMA lambat dan filter volume melewati.

  7. Sinyal penutup: ALMA cepat melintasi ALMA lambat.

Strategi ini menggabungkan analisis tren, momentum dan volume untuk sinyal yang kuat. ALMA mengurangi keterlambatan sementara volume menghindari terobosan palsu.

Keuntungan

Dibandingkan dengan strategi rata-rata bergerak tradisional, keuntungan utama adalah:

  1. ALMA mengurangi lag dan meningkatkan kualitas sinyal.

  2. Filter volume menghindari kerugian dari kebocoran palsu.

  3. Kombo cepat / lambat mengukur arah tren.

  4. Aturan sederhana dan intuitif, mudah diterapkan.

  5. Fleksibel penyesuaian parameter MA untuk pasar yang berbeda.

  6. Manajemen risiko yang wajar.

  7. Potensi optimasi lebih lanjut melalui pengaturan parameter.

  8. Secara keseluruhan meningkatkan stabilitas dan kualitas dibandingkan dengan strategi crossover tradisional.

Risiko

Terlepas dari manfaatnya, risiko berikut harus diperhatikan:

  1. Sistem crossover secara intrinsik rentan terhadap whipsaws.

  2. Kinerja ALMA tergantung pada pengaturan parameter.

  3. Puncakan volume dapat menyesatkan generasi sinyal.

  4. Beberapa lag selalu ada, tidak bisa menghindari semua kerugian.

  5. Risiko overfitting dari optimasi yang berlebihan.

  6. Sinyal gagal ketika volume tidak normal.

  7. Teknik pembelajaran mesin dapat menghasilkan hasil yang lebih baik.

  8. Memantau rasio reward/risiko untuk menghindari penarikan yang berlebihan.

Peningkatan

Untuk mengatasi risiko, perbaikan dapat dilakukan di bidang berikut:

  1. Optimalkan parameter ALMA untuk sensitivitas yang lebih baik.

  2. Bereksperimen dengan metrik volume yang berbeda.

  3. Memperkenalkan stop loss untuk mengendalikan kerugian per perdagangan.

  4. Sertakan indikator lain untuk sinyal yang kuat.

  5. Tambahkan modul pembelajaran mesin untuk penyesuaian sinyal yang lebih cerdas.

  6. Mengerahkan ke berbagai produk untuk diversifikasi strategi.

  7. Mengoptimalkan model ukuran posisi untuk pasar yang berbeda.

  8. Riset ketahanan untuk mencegah overfitting.

Kesimpulan

Sebagai kesimpulan, dibandingkan dengan strategi crossover tradisional, strategi ini meningkatkan kualitas sinyal dan ketahanan melalui algoritma ALMA dan filter volume. Tetapi optimasi strategi adalah proses iteratif. Penting untuk terus meningkatkan strategi dari berbagai dimensi untuk beradaptasi dengan perubahan pasar.


/*backtest
start: 2022-09-16 00:00:00
end: 2023-09-22 00:00:00
period: 1d
basePeriod: 1h
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/
// © Sarahann999
// Calculations for TP/SL based off: https://kodify.net/tradingview/orders/percentage-profit/
//@version=5
strategy("ALMA Cross", overlay=true)

//User Inputs
src= (close)
long_entry = input(true, title='Long Entry')
short_entry = input(true, title='Short Entry')

//Fast Settings
ALMA1 = input(100, "ALMA Lenghth 1", group= "ALMA Fast Length Settings")
alma_offset = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma1 = ta.alma(src, ALMA1, alma_offset, alma_sigma)

//Slow Settings
ALMA2 = input(120, "ALMA Length 2", group = "ALMA Slow Length Settings")
alma_offset2 = input.float(defval=0.85, title='Arnaud Legoux (ALMA) - Offset Value', minval=0, step=0.01)
alma_sigma2 = input.int(defval=6, title='Arnaud Legoux (ALMA) - Sigma Value', minval=0)
Alma2 = ta.alma(src, ALMA2, alma_offset2, alma_sigma2)

//Volume
var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0
    runtime.error("No volume is provided by the data vendor.")
shortlen = input.int(5, minval=1, title = "Short Length", group= "Volume Settings")
longlen = input.int(10, minval=1, title = "Long Length")
short = ta.ema(volume, shortlen)
long = ta.ema(volume, longlen)
osc = 100 * (short - long) / long

//Define Cross Conditions
buy = ta.crossover(Alma1, Alma2)
sell = ta.crossunder(Alma1, Alma2)

//Calculate Take Profit Percentage
longProfitPerc = input.float(title="Long Take Profit", group='Take Profit Percentage',
     minval=0.0, step=0.1, defval=2) / 100
shortProfitPerc = input.float(title="Short Take Profit",
     minval=0.0, step=0.1, defval=2) / 100
     
// Figure out take profit price 1
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Make inputs that set the stop %  1
longStopPerc = input.float(title="Long Stop Loss", group='Stop Percentage',
     minval=0.0, step=0.1, defval=2.5) / 100
shortStopPerc = input.float(title="Short Stop Loss",
     minval=0.0, step=0.1, defval=2.5) / 100

// Figure Out Stop Price
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc)

//Define Conditions
buySignal = buy and osc > 0
     and strategy.position_size == 0

//sellSignal 
sellSignal = sell and osc > 0
     and strategy.position_size == 0

// Submit entry orders
if buySignal and long_entry
    strategy.entry(id="Long", direction=strategy.long, alert_message="Enter Long")
    alert(message="BUY Trade Entry Alert", freq=alert.freq_once_per_bar)
    
if sellSignal and short_entry
    strategy.entry(id="Short", direction=strategy.short, alert_message="Enter Short")
    alert(message="SELL Trade Entry Alert", freq=alert.freq_once_per_bar)
    
// Submit exit orders based on take profit price
if (strategy.position_size > 0)
    strategy.exit(id="Long TP/SL", limit=longExitPrice, stop=longStopPrice, alert_message="Long Exit 1 at {{close}}")
if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", limit=shortExitPrice, stop=shortStopPrice, alert_message="Short Exit 1 at {{close}}")

//Draw
plot(Alma1,"Alma Fast", color=color.purple, style=plot.style_circles)
plot(Alma2,"Alma Slow", color=#acb5c2, style=plot.style_circles)

Lebih banyak