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.
Indikator dan aturan inti adalah:
ALMA cepat: periode yang lebih pendek untuk menangkap breakout.
ALMA lambat: Periode yang lebih lama untuk mengukur tren.
Filter volume: Berlaku ketika EMA pendek melintasi EMA panjang.
Sinyal beli: ALMA cepat melintasi ALMA lambat dan filter volume melewati.
Sinyal jual: ALMA cepat melintasi ALMA lambat.
Sinyal pendek: ALMA cepat melintasi ALMA lambat dan filter volume melewati.
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.
Dibandingkan dengan strategi rata-rata bergerak tradisional, keuntungan utama adalah:
ALMA mengurangi lag dan meningkatkan kualitas sinyal.
Filter volume menghindari kerugian dari kebocoran palsu.
Kombo cepat / lambat mengukur arah tren.
Aturan sederhana dan intuitif, mudah diterapkan.
Fleksibel penyesuaian parameter MA untuk pasar yang berbeda.
Manajemen risiko yang wajar.
Potensi optimasi lebih lanjut melalui pengaturan parameter.
Secara keseluruhan meningkatkan stabilitas dan kualitas dibandingkan dengan strategi crossover tradisional.
Terlepas dari manfaatnya, risiko berikut harus diperhatikan:
Sistem crossover secara intrinsik rentan terhadap whipsaws.
Kinerja ALMA tergantung pada pengaturan parameter.
Puncakan volume dapat menyesatkan generasi sinyal.
Beberapa lag selalu ada, tidak bisa menghindari semua kerugian.
Risiko overfitting dari optimasi yang berlebihan.
Sinyal gagal ketika volume tidak normal.
Teknik pembelajaran mesin dapat menghasilkan hasil yang lebih baik.
Memantau rasio reward/risiko untuk menghindari penarikan yang berlebihan.
Untuk mengatasi risiko, perbaikan dapat dilakukan di bidang berikut:
Optimalkan parameter ALMA untuk sensitivitas yang lebih baik.
Bereksperimen dengan metrik volume yang berbeda.
Memperkenalkan stop loss untuk mengendalikan kerugian per perdagangan.
Sertakan indikator lain untuk sinyal yang kuat.
Tambahkan modul pembelajaran mesin untuk penyesuaian sinyal yang lebih cerdas.
Mengerahkan ke berbagai produk untuk diversifikasi strategi.
Mengoptimalkan model ukuran posisi untuk pasar yang berbeda.
Riset ketahanan untuk mencegah overfitting.
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)