| [Core] CInventory: Quản Lý Kho Lệnh & Cơ Chế Check-sum Đối Soát

Được viết bởi thanhdt vào ngày 06/02/2026 lúc 18:12 | 9 lượt xem

[Core] CInventory: Quản Lý Kho Lệnh & Cơ Chế Check-sum Đối Soát

Trong một cửa hàng, nếu sổ sách ghi tồn kho 10 cái áo mà thực tế chỉ còn 8 cái, đó là thảm họa. Trong Trading, nếu Bot nghĩ nó đang có 1 lệnh Buy mà thực tế lệnh đó đã bị Stoploss, hậu quả là cháy tài khoản.

Đó là lý do chúng ta cần CInventory – Bộ phận quản lý kho lệnh chuyên nghiệp.

1. Vấn Đề Của Hàm PositionsTotal()

Nhiều bạn code bot hay dùng hàm PositionsTotal() của MQL5 để đếm lệnh.
if (PositionsTotal() == 0) OpenBuy();

Rủi ro:
– Hàm này đếm TẤT CẢ lệnh trên tài khoản (bao gồm cả lệnh tay bạn vào vui vui, hoặc lệnh của Bot khác).
– Nó không phân biệt được lệnh nào thuộc về “Chu kỳ” hiện tại của Bot.

2. Thiết Kế Class CInventory

CInventory không chỉ đếm. Nó phân loại và định danh.

class CInventory {
private:
    int m_buy_count;
    int m_sell_count;
    double m_total_buy_volume;
    double m_total_sell_volume;

public:
    void Scan(); // Quét toàn bộ lệnh trên sàn
    bool CheckIntegrity(); // Kiểm tra tính toàn vẹn
};

Magic Number – Chiếc Chìa Khóa

Mỗi con Bot V5 sẽ có một Magic Number riêng. CInventory chỉ lọc và quản lý những lệnh có Magic Number này.

3. Cơ Chế Check-sum (Đối Soát)

Đây là tính năng cao cấp của chuẩn công nghiệp.

  • Local State: Bot lưu trong bộ nhớ (hoặc Database) rằng: “Tao vừa mở 1 lệnh Buy ID #12345”.
  • Broker State: CInventory quét sàn thấy: “Có 1 lệnh Buy ID #12345”.
    –> Khớp (Match): Hệ thống ổn định.

Nếu:
Local: Có lệnh #12345.
Broker: Không thấy lệnh #12345 đâu.
–> Lệch (Disparity):
– Khả năng 1: Lệnh đã chốt lời/cắt lỗ? -> Kiểm tra History.
– Khả năng 2: Sàn xóa lệnh (ít gặp) hoặc lỗi dữ liệu?
– Khả năng 3: Bot chưa kịp cập nhật trạng thái đã bị tắt (Crash).

CInventory sẽ phát hiện sự lệch pha này và báo cho CStateEngine biết để xử lý (ví dụ: Reset trạng thái về 0 hoặc mở lệnh lại).

4. Tại Sao Cần Cache?

Mỗi lần gọi hàm lấy dữ liệu từ sàn (PositionGetDouble) đều tốn tài nguyên và thời gian (vài miliseconds). Nếu trong vòng lặp OnTick bạn gọi hàng nghìn lần, Bot sẽ bị lag.
CInventory sẽ Cache (lưu tạm) các thông số này vào biến nội bộ. Bot chỉ cần đọc từ biến nội bộ -> Tốc độ xử lý siêu nhanh (Microseconds).

👉 Tiếp theo: Sau khi đã nắm rõ mình đang có gì trong tay, Bot cần một bộ não để ra quyết định. Xem ngay: [Core] CStateEngine: Cỗ Máy Trạng Thái FSM Điều Khiển Bot