[Exec] CExecution: Nghệ Thuật Đẩy Lệnh, Xử Lý Trượt Giá & Retry
Bạn gọi hàm OrderSend(). Sàn trả về true. Bạn yên tâm đi ngủ. Sáng hôm sau dậy thấy tài khoản không có lệnh nào, hoặc tệ hơn, có 2 lệnh trùng nhau.
Tại sao? Vì Network Latency (Độ trễ mạng) và Requote (Báo giá lại).
Class CExecution sinh ra để đảm bảo: Một khi Bot đã muốn vào lệnh, lệnh đó PHẢI được vào, và chỉ vào MỘT lần duy nhất.
1. Retry Có Giới Hạn (Smart Retry)
Khi gửi lệnh thất bại (do mất mạng 1s, hoặc giá chạy quá nhanh), Bot “cỏ” thường bỏ cuộc luôn hoặc spam lệnh liên tục.
CExecution sử dụng cơ chế Retry thông minh:
– Gửi lệnh lần 1 -> Thất bại.
– Chờ 200ms -> Gửi lần 2 -> Thất bại.
– Chờ 500ms -> Gửi lần 3 -> Thành công.
– Nếu quá 5 lần -> Báo lỗi Critical cho CAuditManager và dừng lại (tránh spam nát tài khoản).
2. Quản Lý ID Lệnh (Request ID)
Làm sao để tránh vào 2 lệnh trùng nhau khi mạng Lag?
Mỗi Request gửi đi đều kèm theo một ID duy nhất (Ví dụ: Timestamp + Random Number).
Khi nhận phản hồi, CExecution sẽ kiểm tra ID này. Nếu Sàn báo “Đã nhận ID này rồi”, Bot sẽ không gửi lại nữa.
3. Xử Lý Trượt Giá (Slippage Control)
Trong thị trường biến động (như tin Non-farm), giá hiển thị trên màn hình và giá khớp thật có thể lệch nhau cả chục Points.
CExecution cho phép cài đặt MaxDeviation:
– Nếu trượt giá < 5 Point: Chấp nhận khớp.
– Nếu trượt giá > 5 Point: Hủy lệnh, chờ giá ổn định.
4. Snippet Code Minh Họa
class CExecution {
public:
bool ExecuteOrder(int type, double volume, double price) {
int retry = 0;
while (retry < 5) {
if (OrderSend(...) == true) return true;
int error = GetLastError();
if (error == ERR_REQUOTE) {
RefreshRates(); // Lấy giá mới
retry++;
Sleep(200); // Nghỉ 1 chút rồi thử lại
} else {
// Lỗi nghiêm trọng (sai volume, hết tiền) -> Dừng ngay
return false;
}
}
return false;
}
};
Nhờ CExecution, Bot V5 có thể “lì lợm” bám đuổi giá để khớp lệnh bằng được, nhưng cũng đủ thông minh để dừng lại đúng lúc trước khi gây họa.
👉 Tiếp theo: Mọi hành động của Bot, dù thành công hay thất bại, đều phải được ghi lại. Xem ngay: [Audit] CAuditManager: “Hộp Đen” Ghi Log – Không Ghi Là Không Tồn Tại