Ý tưởng cốt lõi của chiến lược này là thực hiện một khuôn khổ có thể chọn linh hoạt phạm vi ngày backtest để đáp ứng nhu cầu khác nhau của người dùng, để họ có thể tự động hoặc thủ công thiết lập thời gian bắt đầu và kết thúc cho backtest.
Chiến lược cung cấp bốn tùy chọn để lựa chọn phạm vi ngày thông qua các tham số đầu vào: sử dụng tất cả dữ liệu lịch sử, ngày gần đây được chỉ định, tuần gần đây được chỉ định hoặc chỉ định theo cách thủ công phạm vi ngày. Chiến lược sẽ động lập cửa sổ backtest dựa trên phạm vi ngày đã chọn, trong khi giữ cho logic giao dịch không thay đổi, để có thể so sánh sự khác biệt hiệu suất dưới các cửa sổ thời gian khác nhau.
Chiến lược bao gồm hai mô-đun: lựa chọn phạm vi ngày backtest và chiến lược giao dịch MA kép.
Là một khuôn khổ linh hoạt và tùy biến cho việc lựa chọn phạm vi ngày, những lợi thế là đáp ứng nhu cầu thử nghiệm khác nhau của người dùng. Kết hợp với logic giao dịch MA đôi đơn giản nhưng hiệu quả, nó có thể nhanh chóng xác minh và so sánh các chiến lược. Tối ưu hóa theo dõi như thêm bộ lọc hoặc logic dừng lỗ có thể làm cho chiến lược thực tế hơn cho giao dịch trực tiếp. Tóm lại, khuôn khổ chiến lược có khả năng mở rộng và giá trị tham chiếu tốt.
/*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