Strategi ALMA Crossover

Penulis:ChaoZhang, Tarikh: 23 September 2023 15:11:02
Tag:

Ringkasan

Strategi ini menggunakan dua Arnaud Legoux Moving Averages (ALMA), satu cepat dan satu perlahan, untuk menjana isyarat silang. ALMA mengurangkan lag dan meratakan garis isyarat berbanding dengan MAs tradisional. Penapis jumlah ditambah untuk meningkatkan ketepatan isyarat. Ia dioptimumkan untuk crypto tetapi boleh diselaraskan untuk instrumen lain.

Logika Strategi

Penunjuk dan peraturan utama adalah:

  1. ALMA pantas: tempoh yang lebih pendek untuk menangkap pelarian.

  2. ALMA perlahan: Tempoh yang lebih lama untuk mengukur trend.

  3. Penapis jumlah: Sah apabila EMA pendek melintasi EMA panjang.

  4. Isyarat beli: ALMA yang cepat melintasi ALMA yang perlahan dan penapis volum melintas.

  5. Isyarat jual: ALMA pantas melintasi ALMA perlahan.

  6. Isyarat pendek: ALMA yang pantas melintasi ALMA yang perlahan dan penapis volum melintasi.

  7. Isyarat penutup: ALMA pantas melintasi ALMA perlahan.

Strategi ini menggabungkan analisis trend, momentum dan jumlah untuk isyarat yang kukuh. ALMA mengurangkan ketinggalan sementara jumlah mengelakkan pecah palsu.

Kelebihan

Berbanding dengan strategi purata bergerak tradisional, kelebihan utama adalah:

  1. ALMA mengurangkan lag dan meningkatkan kualiti isyarat.

  2. Penapis jumlah mengelakkan kehilangan daripada pecah palsu.

  3. Kombo pantas / perlahan mengukur arah trend.

  4. Peraturan mudah dan intuitif, mudah dilaksanakan.

  5. Penyesuaian parameter MA yang fleksibel untuk pasaran yang berbeza.

  6. Pengurusan risiko yang munasabah.

  7. Potensi pengoptimuman lanjut melalui penyesuaian parameter.

  8. Secara keseluruhan peningkatan kestabilan dan kualiti berbanding strategi silang tradisional.

Risiko

Walaupun terdapat manfaatnya, risiko berikut harus diperhatikan:

  1. Sistem crossover secara intrinsik terdedah kepada whipsaws.

  2. Kinerja ALMA bergantung pada penyusunan parameter.

  3. Puncutan jumlah boleh mengelirukan penjanaan isyarat.

  4. Ada sedikit kelewatan, tidak boleh mengelakkan semua kerugian.

  5. Risiko overfitting daripada pengoptimuman yang berlebihan.

  6. Isyarat gagal apabila jumlahnya tidak normal.

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

  8. Memantau nisbah ganjaran/risiko untuk mengelakkan pengambilan yang berlebihan.

Peningkatan

Untuk menangani risiko, penambahbaikan boleh dibuat dalam bidang berikut:

  1. Mengoptimumkan parameter ALMA untuk kepekaan yang lebih baik.

  2. Bereksperimen dengan metrik jumlah yang berbeza.

  3. Memperkenalkan stop loss untuk mengawal kerugian setiap perdagangan.

  4. Masukkan penunjuk lain untuk isyarat yang kukuh.

  5. Tambah modul pembelajaran mesin untuk penyesuaian isyarat yang lebih pintar.

  6. Menerbitkan pelbagai produk untuk mempelbagaikan strategi.

  7. Mengoptimumkan model saiz kedudukan untuk pasaran yang berbeza.

  8. Penyelidikan ketahanan untuk mengelakkan pemasangan berlebihan.

Kesimpulan

Kesimpulannya, berbanding dengan strategi silang tradisional, strategi ini meningkatkan kualiti isyarat dan ketahanan melalui algoritma ALMA dan penapis jumlah. Tetapi pengoptimuman strategi adalah proses berulang. Adalah penting untuk terus meningkatkan strategi dari pelbagai dimensi untuk menyesuaikan diri dengan pasaran yang berubah.


/*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 lanjut