Một cây quyết định để xếp ý tưởng của bạn vào đúng loại, và những luật nào thì code thật sự chặn.
Chiến lược này có phải «một mã, một khung thời gian cố định, một vị thế (long / short / đóng)» không? Đúng → Type A (loại tín hiệu).
Có phải «một rổ mã, mỗi mã một tỷ trọng, đổi mã và đổi tỷ trọng theo chu kỳ» không? Đúng → Type C (loại danh mục).
Còn lại (bộ lọc, lưới, arbitrage, chạy một lần, bot cảnh báo) → Type B.
Khi A và C khó tách, hãy xem hai điều cùng đúng: số mã (một hay nhiều) và hình dạng vị thế (một long/short/đóng đơn lẻ hay một bộ tỷ trọng). Luân chuyển nhiều mã và tái cân bằng danh mục thuộc Type C, không phải Type B.
| Hạng mục | Type A tín hiệu | Type C danh mục | Type B còn lại |
|---|---|---|---|
| Số mã | 1 | N | Không giới hạn |
| Hình dạng vị thế | Một vị thế, có thể là số lẻ | Vector tỷ trọng, theo thiết kế tổng ≤ 1 | Không có hình dạng cố định |
| Mẫu | Có | Có | Không, viết từ đầu |
| Backtest | Agent luôn chạy trước | Agent luôn chạy trước | Không chạy |
| Giao dịch tự động | Có hỗ trợ | Hiện chưa hỗ trợ cấp tiền | Bạn tự viết logic đặt lệnh |
| Báo cáo backtest | Đầy đủ, có Sortino, Omega, giá trị p của MCPT | Gọn hơn: không Sortino / Omega, không MCPT tự động | Không có |
Vì nó không tồn tại. Ba loại là cách phân loại lúc viết chiến lược, không phải một trạng thái mà hệ thống theo dõi.
Phía máy nhận ra loại nhờ kiểu giá trị trả về của hàm tín hiệu: trả về một chuỗi thì đi đường Type A, trả về ma trận tỷ trọng thì đi đường Type C, và không chỗ nào đọc một hằng số loại cả. Phía nền tảng thì suy ngược từ hình dạng của kết quả backtest, còn nơi duy nhất lộ ra loại với bên ngoài cũng chỉ mang hai giá trị: «danh mục» và «tín hiệu».
Vì vậy hệ thống không tách được Type B với một Type A chưa backtest. Chọn sai loại thì không bị chặn, cũng không bị đánh dấu — giá trị của việc phân loại là giúp Agent chọn đúng cách viết và đúng phần kiểm tra, không phải để hệ thống theo dõi hộ bạn.
Hàm tín hiệu trả về một con số cho mỗi nến (mỗi chu kỳ):
| Giá trị trả về | Ý nghĩa |
|---|---|
Số dương (1.0, 0.6…) | Long; con số chính là tỷ lệ vị thế |
Số âm (-1.0, -0.6…) | Short; con số chính là tỷ lệ vị thế |
0.0 | Đóng vị thế |
nan | Giữ nguyên vị thế hiện tại |
Tín hiệu khớp ở giá mở cửa của nến kế tiếp; lệnh thoát do thanh toán hợp đồng tương lai khớp ở giá đóng cửa của chính nến đó.
Con số không bị cắt bớt: 0.5 là nửa vị thế, 2.0 là đòn bẩy gấp đôi, và code tính đúng như vậy. Volatility targeting tự nhiên sinh ra tín hiệu số lẻ; trần exposure của nó là giá trị mặc định của tham số, không phải giới hạn của hệ thống.
Type A đã backtest thì vào được danh mục giao dịch tự động: gán một số tiền trong Thiết lập giao dịch là chiến lược ghi trạng thái vị thế, rồi bộ đối soát cộng mục tiêu của mọi chiến lược lại và chỉnh vị thế trên sàn (xem Danh mục giao dịch thật). Chiến lược không được gán tiền thì không có lệnh nào.
Hàm tín hiệu trả về một ma trận tỷ trọng (tỷ trọng mục tiêu cho từng mã tại từng thời điểm) kèm dữ liệu giá tương ứng. Nhịp tái cân bằng có thể theo ngày, tuần hay tháng, do chính chiến lược cài đặt — cả hai ví dụ sẵn có (z-score mua ròng của khối ngoại chọn trong 100 cổ phiếu Đài Loan, và momentum Top-30) đều tái cân bằng hàng tuần.
Tổng tỷ trọng ≤ 1 là một quy ước thiết kế, code không kiểm tra. Tổng vượt 1 cũng không báo lỗi; nó được tính thẳng vào lợi nhuận như đòn bẩy.
Type C hiện chưa hỗ trợ cấp vốn vào danh mục giao dịch tự động. Nguyên nhân gốc là đường đi không tồn tại: chiến lược Type C không ghi tệp trạng thái vị thế, nên bộ đối soát không thấy nó, và tiền đã gán cũng không sinh ra lệnh nào. Workspace khóa ô số tiền của Type C, nhưng hãy xem kết quả backtest của Type C là thứ để đọc và chia sẻ, không phải thứ để cấp vốn.
Type C cũng không có MCPT tự động — kiểm định đó là một chuỗi giá đối một chuỗi vị thế, mà danh mục thì có nhiều chuỗi, ép về một chuỗi hóa ra là lấy mẫu lại lợi nhuận đã thực hiện. Thư viện chiến lược đánh dấu cửa này là «không áp dụng», khác với không đạt.
Type B không có mẫu, viết từ đầu, không chạy backtest. Mà chỉ chiến lược có kết quả backtest không rỗng mới vào được danh sách chọn của giao dịch tự động, nên Type B không bao giờ xuất hiện ở đó.
Nó vẫn đặt lệnh — tự gọi các thư viện đặt lệnh sẵn có, tự lên lịch. Blave Agent không phải kiểu «đưa tín hiệu rồi thôi»: Type A đi qua đối soát của giao dịch tự động, còn Type B tự gửi lệnh của mình.
| Hạng mục | Hành vi thực tế |
|---|---|
Ngày kết thúc backtest chưa đặt lại về None | Từ chối chạy backtest |
| Chiến lược hợp đồng tương lai TAIEX chưa áp mặt nạ thanh toán | Từ chối chạy backtest |
| Hàm tín hiệu không tồn tại hoặc không trả về gì | Từ chối chạy backtest |
| Phí đặt bằng 0, hoặc viết thành biểu thức | Đánh dấu là vấn đề, vẫn chạy |
| Type A dạng chỉ báo không khai báo chuỗi cần vẽ | Nhắc nhở, vẫn chạy |
| Tổng tỷ trọng Type C vượt quá 1 | Không kiểm tra, tính thẳng như đòn bẩy |
Ba dòng dưới là thông lệ, không phải cửa kiểm. Agent sẽ nhắc bạn theo quy tắc, nhưng không có đoạn code nào đứng sau — đó cũng là lý do những phần kiểm tra trong tránh overfitting rốt cuộc vẫn do bạn quyết định có làm hay không.
| Bạn tưởng | Thực tế |
|---|---|
| Luân chuyển nhiều mã là Type B | Có tỷ trọng và tái cân bằng theo chu kỳ thì là Type C |
| Type C backtest xong là chạy được giao dịch tự động | Backtest là để xem hiệu quả; hiện không có đường cấp vốn |
| Báo cáo backtest có tỷ lệ thắng | Không có trường tỷ lệ thắng; muốn có thì bạn tự tính từ chi tiết vào lệnh và thoát lệnh của từng giao dịch, mà báo cáo backtest của Type C không kèm chi tiết từng giao dịch (xem Cách đọc kết quả backtest) |
| Chọn sai loại thì hệ thống sẽ chặn lại | Không đâu, nền tảng không lưu được loại; chọn sai chỉ khiến bạn nhận cách viết và phần kiểm tra không phù hợp |
Đã rõ loại rồi thì bước tiếp là xem nó chạy ra sao. Các chiến lược chính thức trong Thư viện chiến lược đều kèm backtest thật và khoảng thời gian backtest ghi rõ, đọc miễn phí; chọn một cái rồi chạy thử sẽ cho bạn biết mình muốn viết loại nào, nhanh hơn là đọc hết trang này.