Strategi ini menghasilkan isyarat perdagangan berdasarkan persilangan antara purata bergerak pantas dan perlahan, yang tergolong dalam strategi trend berikut. Dengan menyesuaikan parameter purata bergerak secara adaptif, ia menyesuaikan diri secara dinamik dengan trend pasaran untuk keuntungan maksimum.
Mengira purata bergerak pantas dan perlahan. panjang lalai MA pantas adalah 21, dan panjang lalai MA perlahan adalah 34.
Apabila MA pantas melintasi MA perlahan, ia menunjukkan trend menaik dan menghasilkan isyarat beli.
Apabila MA pantas melintasi di bawah MA perlahan, ia menunjukkan trend menurun dan menghasilkan isyarat jual.
Dengan menyesuaikan panjang purata bergerak secara automatik, strategi secara dinamik menyesuaikan diri dengan trend pasaran untuk mengesan keuntungan.
Strategi ini mudah dan jelas, mudah difahami dan dilaksanakan.
Ia boleh dengan berkesan mengesan trend pasaran dengan potensi keuntungan yang besar.
Penyesuaian parameter dinamik menyesuaikan diri dengan perubahan keadaan pasaran.
Algoritma MA yang boleh disesuaikan meningkatkan fleksibiliti strategi.
Konfigurasi logik beli dan jual yang fleksibel.
Perdagangan yang kerap membawa kepada kos transaksi yang lebih tinggi.
Lag MA mungkin terlepas titik kemasukan dan keluar terbaik semasa pasaran yang tidak menentu.
Parameter MA yang tidak sesuai dan pengoptimuman kekerapan penyesuaian menyebabkan kegagalan strategi.
Stop loss yang ketat diperlukan untuk mengehadkan kerugian.
Pembalikan trend boleh membawa kepada kerugian terapung besar.
Mengoptimumkan parameter MA untuk pengesanan perubahan trend yang lebih baik.
Tambah logik stop loss untuk mengawal kerugian perdagangan tunggal.
Tambah penunjuk penilaian trend untuk mengelakkan kerugian pembalikan trend.
Meningkatkan strategi penyesuaian MA untuk menjadi lebih pintar dan automatik.
Tambah modul pengoptimuman parameter menggunakan pembelajaran mesin.
Logik strategi adalah mudah dan jelas, menghasilkan perdagangan berdasarkan persilangan MA yang cepat dan perlahan. Ia berkesan menangkap trend tetapi mempunyai risiko. Pengoptimuman berterusan pada parameter, logik stop loss diperlukan untuk menjadikan strategi lebih kukuh. Secara keseluruhan strategi mempunyai potensi yang besar untuk penambahbaikan dan bernilai penyelidikan dan penerapan.
/*backtest start: 2022-10-03 00:00:00 end: 2023-10-09 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // // @version=4 // © Ehsan Haghpanah, (ehsanha) // Algorithmic Trading Research // // eha Moving Averages Strategy, // A simple strategy based on crossing Moving Averages of // different lengths (a fast moving average and slow one) // strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true) // // -- strategy parameter(s) // moving averages parameter(s) var _fastMA_len = input(title = "Fast MA Length", defval = 21, type = input.integer, minval = 1, step = 1) var _slowMA_len = input(title = "Slow MA Length", defval = 34, type = input.integer, minval = 1, step = 1) var _ma_algo_id = input(title = "MA Algorithm", defval = "SMA", options = ["SMA", "EMA", "WMA"]) // backtesting date and time range parameter(s) var _startYear = input(defval = 2020, title = "Start Year", type = input.integer, minval = 1976) var _startMonth = input(defval = 1, title = "Start Month", type = input.integer, minval = 1, maxval = 12) var _startDay = input(defval = 1, title = "Start Day", type = input.integer, minval = 1, maxval = 31) var _closeYear = input(defval = 2020, title = "Close Year", type = input.integer, minval = 1984) var _closeMonth = input(defval = 9, title = "Close Month", type = input.integer, minval = 1, maxval = 12) var _closeDay = input(defval = 1, title = "Close Day", type = input.integer, minval = 1, maxval = 31) // // -- function(s) and calculation(s) // checks whether current time is in backtesting time range start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00) // backtesting range start time, (00, 00); (hour, minute) close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59) // backtesting range close time, (23, 59); (hour, minute) isInRange() => true // // calculates moving average based on provided algorithm, source and length // alg : moving average algorithm // len : length // ser : series calcMA(alg, len, ser) => (len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na))) // // -- strategy logic and calculation(s) ma_fast = calcMA(_ma_algo_id, _fastMA_len, close) ma_slow = calcMA(_ma_algo_id, _slowMA_len, close) cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA // // -- strategy execution logic // opens a long position whenever the time is in range and crosses over strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov) // closes the position whenever the time is in range and crosses under strategy.close("ID", comment = "-", when = isInRange() and cross_un) // // -- drawing and visualization co_fast = color.new(color.gray, 25) co_slow = color.new(color.gray, 75) // drawing moving average(s) plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line) plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)