
Strategi ini adalah strategi untuk mengesan trend dengan mengira EMA garis cepat dan EMA garis lambat, dan membandingkan hubungan besar kedua-duanya, untuk mewujudkan isyarat perdagangan garpu emas dan garpu mati EMA ganda. Strategi untuk mengesan trend yang mudah dihasilkan apabila tanda beli dihasilkan apabila garis cepat melintasi garis lambat, dan apabila tanda jual dihasilkan apabila garis cepat melintasi garis perlahan.
Logik utama strategi ini terdiri daripada beberapa bahagian:
Hitung EMA garisan pantas dan EMA garisan perlahan: dengan fungsi ta.ema() hitung panjang EMA garisan pantas untuk FastInput dan panjang EMA garisan perlahan untuk SlowInput.
Tetapkan jangka masa pengembalian: Tetapkan parameter useDateFilter untuk memfilter masa pengembalian, backtestStartDate dan backtestEndDate untuk memulakan dan menamatkan pengembalian.
Menjana isyarat dagangan: Dengan fungsi ta.crossover ((() dan ta.crossunder ((() berbanding besarnya hubungan antara EMA garisan pantas dan EMA garisan perlahan, menghasilkan isyarat beli apabila garisan pantas melintasi garisan perlahan, menghasilkan isyarat jual apabila garisan pantas melintasi garisan perlahan.
Pengurusan pesanan di luar jangka masa: Pesanan yang tidak ditukarkan di luar jangka masa pengiraan akan dibatalkan dan semua kedudukan akan dihapuskan.
Merancang purata bergerak: Merancang purata bergerak EMA garis pantas dan EMA garis perlahan pada carta.
Ini adalah strategi trend-following yang sangat mudah dan mempunyai beberapa kelebihan:
Logik strategi mudah, mudah difahami dan dilaksanakan.
EMA meluruskan data harga untuk mengurangkan gangguan perdagangan.
Parameter kitaran EMA boleh disesuaikan untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
Tempoh pengesanan boleh diatur secara fleksibel untuk tempoh masa tertentu.
Keadaan kemasukan dan keluar yang boleh dioptimumkan, digabungkan dengan penunjuk lain.
Strategi ini juga mempunyai risiko yang perlu diperhatikan:
Strategi dua EMA adalah lebih kasar dan tidak dapat bertindak balas dengan fleksibel terhadap perubahan pasaran.
Terdapat risiko transaksi yang kerap dan berulang.
Tetapan parameter EMA yang tidak betul boleh menyebabkan ralat isyarat perdagangan.
Julat masa pengembalian yang tidak munasabah mungkin menyebabkan overfit.
Terdapat risiko penarikan balik dan kerugian yang tidak dapat dielakkan.
Risiko boleh dikawal dengan mengoptimumkan parameter, penapisan fluktuasi yang sesuai, dan menetapkan hentian.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Optimumkan parameter kitaran EMA, pilih kombinasi parameter terbaik.
Menambah penapis untuk penunjuk lain untuk mengelakkan transaksi yang tidak perlu.
Tambah strategi hentikan kerugian dan kawal kerugian tunggal.
Menurunkan frekuensi dagangan dengan menggunakan penapis seperti trend, turun naik dan sebagainya.
Uji kontrak yang berbeza untuk mencari strategi yang paling sesuai.
Penggunaan titik slider, kawalan kos, dan sebagainya, menjadikan pengiraan lebih realistik.
Strategi ini secara keseluruhannya adalah strategi EMA berganda yang sangat sederhana, logiknya jelas dan mudah difahami, menghasilkan isyarat perdagangan melalui perbandingan EMA garis perlahan dan cepat. Keuntungan strategi ini adalah mudah dilaksanakan, tetapi juga terdapat beberapa masalah seperti perdagangan yang kerap, mudah menyebabkan pengoptimuman berlebihan, dan sebagainya. Langkah seterusnya boleh diperbaiki dari segi pengoptimuman parameter, kawalan risiko, dan sebagainya, menjadikan strategi lebih stabil dan praktikal.
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("MollyETF_EMA_Crossover", overlay = true, initial_capital = 100000, default_qty_value=100, default_qty_type=strategy.percent_of_equity)
fastInput = input( 10, "Fast EMA")
slowInput = input( 21, "Slow EMA")
// Calculate two moving averages with different lengths.
float fastMA = ta.ema(close, fastInput)
float slowMA = ta.ema(close, slowInput)
// STEP 1. Create inputs that configure the backtest's date range
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2018"),
title="Start Date", group="Backtest Time Period",
tooltip="This start date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
backtestEndDate = input(timestamp("7 Sep 2023"),
title="End Date", group="Backtest Time Period",
tooltip="This end date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
// STEP 2. See if current bar falls inside the date range
inTradeWindow = true
// STEP 3. Include the date filter with the entry order conditions
// Enter a long position when `fastMA` crosses over `slowMA`.
if inTradeWindow and ta.crossover(fastMA, slowMA)
strategy.entry("buy", strategy.long)
// Enter a short position when `fastMA` crosses under `slowMA`.
if inTradeWindow and ta.crossunder(fastMA, slowMA)
strategy.close_all(comment="sell")
// STEP 4. With the backtest date range over, exit all open
// trades and cancel all unfilled pending orders
if not inTradeWindow and inTradeWindow[1]
strategy.cancel_all()
strategy.close_all(comment="Date Range Exit")
// Plot the moving averages.
plot(fastMA, "Fast MA", color.aqua)
plot(slowMA, "Slow MA", color.orange)