Ide inti dari strategi ini adalah untuk menerapkan kerangka kerja yang dapat secara fleksibel memilih rentang tanggal backtest untuk memenuhi kebutuhan pengguna yang berbeda, sehingga mereka dapat secara otomatis atau manual mengatur waktu awal dan akhir untuk backtest.
Strategi ini menyediakan empat pilihan untuk pemilihan rentang tanggal melalui parameter input: menggunakan semua data riwayat, hari-hari tertentu baru-baru ini, minggu-minggu tertentu baru-baru ini atau secara manual menentukan rentang tanggal. Strategi ini akan secara dinamis mengatur jendela backtest berdasarkan rentang tanggal yang dipilih, sambil menjaga logika perdagangan tidak berubah, sehingga perbedaan kinerja di bawah jendela waktu yang berbeda dapat dibandingkan.
Strategi ini terdiri dari dua modul: pemilihan rentang tanggal backtest dan strategi perdagangan MA ganda.
Sebagai kerangka kerja yang fleksibel dan dapat disesuaikan untuk pemilihan rentang tanggal, kelebihannya adalah memenuhi kebutuhan pengujian yang berbeda dari pengguna. Dikombinasikan dengan logika perdagangan double MA yang sederhana namun efektif, ini dapat dengan cepat memverifikasi dan membandingkan strategi. Optimasi tindak lanjut seperti menambahkan filter atau logika stop loss dapat membuat strategi lebih praktis untuk perdagangan langsung. Singkatnya, kerangka kerja strategi memiliki skalabilitas dan nilai referensi yang baik.
/*backtest start: 2022-12-29 00:00:00 end: 2024-01-04 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title = "How To Auto Set Date Range", shorttitle = " ", overlay = true) // Revision: 1 // Author: @allanster // === INPUT MA === fastMA = input(defval = 14, title = "FastMA", type = input.integer, minval = 1, step = 1) slowMA = input(defval = 28, title = "SlowMA", type = input.integer, minval = 1, step = 1) // === INPUT BACKTEST RANGE === useRange = input(defval = "WEEKS", title = "Date Range", type = input.string, confirm = false, options = ["ALL", "DAYS", "WEEKS", "MANUAL"]) nDaysOrWeeks = input(defval = 52, title = "# Days or Weeks", type = input.integer, minval = 1) FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 15, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2019, title = "From Year", minval = 2014) ToMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2014) // === FUNCTION EXAMPLE === window() => true // === LOGIC === buy = crossover(sma(close, fastMA), sma(close, slowMA)) // buy when fastMA crosses over slowMA sell = crossunder(sma(close, fastMA), sma(close, slowMA)) // sell when fastMA crosses under slowMA // === EXECUTION === strategy.entry("L", strategy.long, when=window() and buy) // buy long when "within window of time" AND crossover strategy.close("L", when=window() and sell) // sell long when "within window of time" AND crossunder // === PLOTTING === plot(sma(close, fastMA), title = 'FastMA', color = color.aqua, linewidth = 2, style = plot.style_line) // plot FastMA plot(sma(close, slowMA), title = 'SlowMA', color = color.yellow, linewidth = 2, style = plot.style_line) // plot SlowMA