
Chiến lược này là một phương pháp giao dịch tiền điện tử dựa trên ngày theo lịch sử, mua và bán các hoạt động bằng cách sử dụng các ngày cụ thể trong chu kỳ lịch. Chiến lược này bắt đầu từ năm mới theo lịch và kéo dài đến cuối tháng 12 theo lịch và tuân theo các quy tắc đơn giản: mua vào ngày 5 của mỗi tháng theo lịch và bán vào ngày 26 của mỗi tháng theo lịch.
Nguyên tắc cốt lõi của chiến lược này dựa trên các tác động có thể có của chu kỳ lịch đối với thị trường tiền điện tử. Mã thực hiện ý tưởng này bằng cách:
Chiến lược sử dụng phương pháp tính ngày chính xác, lưu trữ số ngày của mỗi tháng theo lịch bằng mảng và tính tổng số ngày từ năm mới theo lịch để xác định chính xác ngày tháng hiện tại. Phương pháp này đảm bảo kích hoạt chính xác tín hiệu giao dịch.
Phân tích các mã của chiến lược này, chúng ta có thể tóm tắt những ưu điểm sau:
Mặc dù có những lợi thế như trên, chiến lược này cũng có một số rủi ro tiềm ẩn:
Để giảm thiểu các rủi ro này, các nhà giao dịch có thể xem xét xác nhận giao dịch kết hợp với các chỉ số kỹ thuật khác hoặc đặt mức dừng cố định để hạn chế tổn thất trong một giao dịch.
Một số hướng tối ưu hóa có thể được đưa ra thông qua phân tích sâu về mã:
Giới thiệu cơ chế dừng lỗ: Thêm điều kiện dừng lỗ theo tỷ lệ phần trăm hoặc số tiền tuyệt đối, tự động thanh toán lỗ khi lỗ đạt đến một mức thấp nhất định, tránh mất mát lớn. Mã tối ưu có thể tăng tương tựif strategy.position_size > 0 and close < entry_price * (1 - stop_loss_percent)Điều kiện phán quyết.
Xác nhận chỉ số kỹ thuậtGiao dịch ngày dương lịch chỉ được thực hiện khi chỉ số kỹ thuật cung cấp tín hiệu thuận lợi. Điều này có thể cải thiện chất lượng tín hiệu.
Tối ưu hóa ngày mua bán: Phân tích ngày nào trong lịch sử thực sự cung cấp thời gian mua và bán tốt nhất cho cặp, thay vì sử dụng ngày 5 và ngày 26 một cách cố định. Có thể một số cặp ngày cụ thể sẽ hoạt động tốt hơn.
Quản lý một số vị tríThay đổi chiến lược để giao dịch với một phần vốn thay vì 100% vốn, hoặc điều chỉnh kích thước vị trí theo động thái biến động của thị trường để phân tán rủi ro.
Thêm bộ lọc trạng thái thị trườngTrong các trường hợp thị trường cực đoan (như biến động cao hoặc xu hướng thị trường gấu rõ ràng), hãy tạm dừng thực hiện chiến lược và tránh giao dịch trong môi trường bất lợi.
Mở rộng phạm vi thời gian áp dụng: Thêm dữ liệu lịch nhiều năm hơn, hoặc phát triển một hàm tự động tính toán ngày lịch để chiến lược có thể hoạt động vô hạn.
Tăng thương mại đa giống: Mở rộng chiến lược sang nhiều loại tiền điện tử hoặc các loại tài sản khác, và quan sát sự khác biệt về hiệu suất trong các thị trường khác nhau theo chu kỳ âm lịch.
Việc thực hiện các hướng tối ưu hóa này có thể làm tăng đáng kể tính mạnh mẽ và khả năng thích ứng của chiến lược, trong khi vẫn giữ nguyên ý tưởng cốt lõi đơn giản và trực quan của nó.
Chiến lược giao dịch tiền điện tử dựa trên chu kỳ lịch cung cấp một góc nhìn giao dịch độc đáo, sử dụng các hoạt động mua và bán vào các ngày lịch cụ thể. Ưu điểm lớn nhất của chiến lược này là các quy tắc đơn giản và rõ ràng và dễ thực hiện, kết hợp với yếu tố độc đáo của chu kỳ lịch, có thể nắm bắt các mô hình thị trường bị bỏ qua trong phân tích kỹ thuật thông thường.
Tuy nhiên, chiến lược này cũng phải đối mặt với những thách thức về việc thiếu quản lý rủi ro và khả năng thích ứng của thị trường. Để tăng hiệu quả của chiến lược, các biện pháp cải tiến như giới thiệu các cơ chế dừng lỗ, xác nhận các chỉ số kỹ thuật và tối ưu hóa ngày mua bán được đề xuất. Những cải tiến này không chỉ làm giảm rủi ro tiềm ẩn mà còn tăng khả năng thích ứng của chiến lược trong các môi trường thị trường khác nhau.
Điều đáng chú ý là bất kỳ chiến lược giao dịch nào cũng cần được kiểm tra đầy đủ và kiểm tra về phía trước để xác minh hiệu quả của nó trong điều kiện thị trường thực tế. Khi áp dụng chiến lược này, các nhà giao dịch nên điều chỉnh phù hợp với khả năng chịu rủi ro và mục tiêu đầu tư của mình và kết hợp với các phương pháp phân tích khác để đưa ra quyết định giao dịch toàn diện hơn.
/*backtest
start: 2024-08-11 00:00:00
end: 2025-08-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Lunar ETHUSDT Trading 100% Invest with Fee & Slippage (2020~2026)", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1)
// Fee and slippage settings
feePercent = 0.1 // 0.1%
slippageTicks = 3
tickSize = syminfo.mintick
slippage = slippageTicks * tickSize
// Function for lunar new year start date and monthly lengths by year
f_get_lunar_data() =>
y = year(time)
if y == 2020
[timestamp("Asia/Seoul", 2020, 1, 25, 0, 0), array.from(29,30,29,30,29,30,29,30,29,30,30,29)]
else if y == 2021
[timestamp("Asia/Seoul", 2021, 2, 12, 0, 0), array.from(30,29,30,29,30,29,30,29,30,29,30,30)]
else if y == 2022
[timestamp("Asia/Seoul", 2022, 2, 1, 0, 0), array.from(29,30,29,30,29,30,29,30,30,29,30,29)]
else if y == 2023
[timestamp("Asia/Seoul", 2023, 1, 22, 0, 0), array.from(30,29,30,29,30,29,30,30,29,30,29,30)]
else if y == 2024
[timestamp("Asia/Seoul", 2024, 2, 10, 0, 0), array.from(30,29,30,29,30,29,30,29,30,29,30,30,29)]
else if y == 2025
[timestamp("Asia/Seoul", 2025, 1, 29, 0, 0), array.from(29,30,29,30,29,30,29,30,30,29,30,29)]
else if y == 2026
[timestamp("Asia/Seoul", 2026, 2, 17, 0, 0), array.from(30,29,30,29,30,29,30,30,29,30,29,30)]
else
[na, array.new_int()]
// Function to create cumulative monthly days array
f_get_lunar_md(days_arr) =>
arr = array.new_int()
sum = 0
for i = 0 to array.size(days_arr) - 1
sum += array.get(days_arr, i)
array.push(arr, sum)
arr
// Get lunar start date and monthly lengths
[ts_start, lunar_lengths] = f_get_lunar_data()
valid = not na(ts_start)
days_since = valid ? math.floor((time - ts_start) / 86400000) : na
cumulative = valid ? f_get_lunar_md(lunar_lengths) : na
// Declare lunar month, day, last day variables
var int lunar_month = na
var int lunar_day = na
var int lunar_last_day = na
// Calculate lunar date
if valid and not na(days_since) and days_since >= 0
lunar_month := na
lunar_day := na
lunar_last_day := na
for i = 0 to array.size(cumulative) - 1
cum = array.get(cumulative, i)
prev = i == 0 ? 0 : array.get(cumulative, i - 1)
if days_since < cum
lunar_month := i + 1
lunar_day := days_since - prev + 1
lunar_last_day := array.get(lunar_lengths, i)
break
else
lunar_month := na
lunar_day := na
lunar_last_day := na
// Buy condition: Lunar day 5 and no current position
buy_condition = not na(lunar_day) and lunar_day == 5 and strategy.position_size == 0
// Sell condition: Lunar day 26 and holding position
sell_condition = not na(lunar_day) and lunar_day == 26 and strategy.position_size > 0
// Buy/sell price adjusted for slippage and fee
price_buy = close + slippage
price_buy_with_fee = price_buy * (1 + feePercent * 0.01)
price_sell = close - slippage
price_sell_with_fee = price_sell * (1 - feePercent * 0.01)
// Calculate buy quantity using 100% of equity
qty = math.floor(strategy.equity / price_buy_with_fee)
// Buy order (limit)
if buy_condition and qty > 0
strategy.entry("Lunar Buy", strategy.long, qty, limit=price_buy)
// Sell order (close all)
if sell_condition and strategy.position_size > 0
strategy.close("Lunar Buy")
// True range variable (for label position adjustment)
tr = ta.tr(true)
// Date format creation
yr = year(time)
mo = month(time)
dy = dayofmonth(time)
mo_str = mo < 10 ? "0" + str.tostring(mo) : str.tostring(mo)
dy_str = dy < 10 ? "0" + str.tostring(dy) : str.tostring(dy)
solar_str = str.tostring(yr) + "-" + mo_str + "-" + dy_str
// Display solar and lunar date and position label (on bar close)
if barstate.islastconfirmedhistory and not na(lunar_day)
label.new(bar_index, high - tr * 6, "Solar: " + solar_str + "\nLunar: " + str.tostring(lunar_month) + "-" + str.tostring(lunar_day) ,
style=label.style_label_up, size=size.normal, color=color.new(color.teal, 50), textcolor=color.white)
// Display "15" label at bottom on lunar day 15 (lowest of last 50 bars - 1 true range)
if not na(lunar_day) and lunar_day == 15
low_offset = ta.lowest(low, 50) - tr
label.new(bar_index, low_offset, "15", style=label.style_label_down, color=color.orange, textcolor=color.white, size=size.normal)