Mô hình giao tiếp¶
Giới thiệu ¶
FIX API sử dụng giao tiếp dựa trên phiên. Một phiên được định nghĩa là giao tiếp giữa hai bên: bên khởi tạo (client), bên bắt đầu giao tiếp, và bên chấp nhận (server), bên nhận yêu cầu kết nối từ bên khởi tạo.
Server xác thực yêu cầu của client bằng thông điệp Logon.
Giao thức phiên FIX ¶
Mỗi phiên duy trì các thông điệp hai chiều giữa client và server cTrader. Một phiên có thể bao gồm nhiều kết nối vật lý và được duy trì bằng cách sử dụng số thứ tự.
Mỗi thông điệp mới trong một phiên đơn lẻ nhận được một số thứ tự duy nhất bắt đầu từ 1 (một). Cả hai bên đều dựa vào số thứ tự để duy trì giao tiếp có trật tự. Các thông điệp bị thiếu được truyền lại với sự đồng thuận song phương giữa cả hai bên.
Luồng phiên điển hình:
- Client bắt đầu phiên với một thông điệp Logon.
- Client trao đổi các thông điệp ứng dụng với server.
- Phiên kết thúc với một thông điệp Logout.
Các danh mục thông điệp giao thức FIX của cTrader ¶
Theo định nghĩa trong Giao thức FIX, server FIX của cTrader sử dụng 2 cấp độ dữ liệu khác nhau: hệ thống và ứng dụng.
Xin lưu ý rằng đây là bộ thông điệp tối thiểu cần thiết để hỗ trợ các quy trình làm việc cần thiết và có thể thay đổi theo thời gian khi cả nhu cầu kinh doanh và tiêu chuẩn FIX phát triển.
Thông điệp hệ thống (quản trị) ¶
- Heartbeat (client ↔ cTrader) – được sử dụng để kiểm tra liên kết giao tiếp giữa hai bên.
- Test request (client ↔ cTrader) – được sử dụng để kiểm tra tình trạng của liên kết giao tiếp.
- Logon (client → cTrader) – thông điệp xác thực client.
- Logon (client → cTrader) – kết thúc phiên bình thường.
- Resend request (client ↔ cTrader) – yêu cầu truyền lại một số thông điệp ứng dụng nhất định.
- Reject (client ↔ cTrader) – lỗi xác thực cấp phiên.
- Sequence reset (client ↔ cTrader) – trong trường hợp có vấn đề về giao tiếp, các thông điệp bị thiếu được khôi phục hoặc số thứ tự được đặt lại để bỏ qua các thông điệp bị thiếu.
Thông điệp ứng dụng ¶
- Market data request (client → cTrader) – yêu cầu chung về dữ liệu thị trường.
- Market data incremental refresh (client ← cTrader) – phản hồi cho thông điệp yêu cầu dữ liệu thị trường.
- New order single (client → cTrader) – được sử dụng để gửi lệnh điện tử đến nhà môi giới để thực hiện.
- Execution report (client ← cTrader) – được sử dụng để gửi thông tin trạng thái lệnh đến client FIX, chẳng hạn như xác nhận, khớp lệnh và thay đổi không được yêu cầu.
- Business message reject (client ← cTrader) – được sử dụng để từ chối yêu cầu của client FIX vì các lý do không liên quan đến phiên.
Cấu trúc thông điệp FIX ¶
Phần này giải thích cách thông điệp FIX API được tạo thành, mô tả định dạng thông điệp FIX và giúp người dùng hiểu khái niệm cặp thẻ và giá trị.
Mỗi thông điệp phải chứa 3 phần:
- Phần đầu – mỗi thông điệp quản trị hoặc ứng dụng được bắt đầu bằng một phần đầu tiêu chuẩn. Phần đầu xác định loại thông điệp, phiên bản FIX, độ dài thông điệp, đích đến, số thứ tự, nguồn gốc và thời gian.
- Phần thân – nội dung trong phần thân của thông điệp được xác định bởi loại thông điệp được định nghĩa trong phần đầu.
- Phần cuối – mỗi thông điệp, quản trị hoặc ứng dụng được kết thúc bằng một phần cuối tiêu chuẩn. Phần cuối được sử dụng để phân tách các thông điệp và chứa biểu diễn ba ký tự của giá trị
CheckSum <10>.
Định dạng thông điệp FIX ¶
Một thông điệp FIX là một tập hợp các trường. Mỗi trường là một cặp thẻ-giá trị được định dạng như {tag}={value}. Ví dụ, 54=2, có nghĩa là loại lệnh là bán.
Thẻ ¶
- FIX sử dụng các thẻ được định nghĩa trước.
- Mỗi thẻ đại diện cho một trường cụ thể.
- Mỗi thẻ được gán một số được định nghĩa trước.
- Đặc tả FIX của cTrader cung cấp danh sách các trường và số thẻ tương ứng.
Giá trị ¶
- Giá trị đại diện cho giá trị của thẻ được gán cho nó.
- Giá trị chỉ có thể là một trong các kiểu dữ liệu sau: số nguyên, số thực dấu phẩy động, ký tự, thời gian, ngày tháng, dữ liệu hoặc chuỗi.
Tất cả các thông điệp trong cTrader FIX API bắt đầu bằng 8=FIX.x.y, trong đó x.y là phiên bản của Giao thức FIX. Ở cuối mỗi thông điệp phải có một trường 10=xyz, trong đó xyz đại diện cho tổng của tất cả các giá trị nhị phân trong thông điệp được gọi là checksum.
Checksum giúp xác định bất kỳ vấn đề truyền tải nào, đặc biệt là mất gói tin bằng cách cho phép người nhận biết liệu có bất kỳ phần nào của thông điệp bị thiếu hay không.
Nếu thẻ Symbol(55) được sử dụng trong một thông điệp FIX gửi đến cTrader/cServer, bạn phải chỉ định ID cặp tiền tệ FIX. Giá trị đó có thể khác nhau giữa các nhà môi giới. Bạn có thể tìm thấy trường ID cặp tiền tệ FIX từ ứng dụng cTrader của nhà môi giới đó trong cửa sổ thông tin cặp tiền tệ.
Ví dụ về thông điệp ¶
8=FIX.4.4|9=126|35=A|34=1|49=theBroker.12345|57=TRADE|50=any_string|52=20170117-08:03:04|56=CSERVER|98=0|108=30|553=12345|554=passw0rd!|10=131|
| Thẻ # | Tên thẻ | Giá trị | Mô tả |
|---|---|---|---|
| 8 | BeginString | 4.4 | Phiên bản FIX |
| 9 | BodyLength | 102 | Độ dài nội dung tin nhắn là 102 ký tự |
| 35 | MsgType | A | Loại tin nhắn là Đăng nhập |
| 34 | MsgSeqNum | 1 | Số thứ tự tin nhắn là 1 |
| 49 | SenderCompI | D | broker.1047 ID của bên giao dịch, trong đó "broker" là BrokerUID duy nhất được cung cấp bởi cTrader và "1047" là số định danh của tài khoản giao dịch. |
| 57 | TargetSubID | TRADE | Bổ sung định danh phiên. Các giá trị có thể là: "QUOTE","TRADE". |
| 50 | SenderSubID | QUOTE | Giá trị được gán để xác định nguồn gốc tin nhắn cụ thể |
| 52 | SendingTime | 20131129- 15:40:10.276 | Thời gian truyền tin nhắn là ngày 29 tháng 11 năm 2013 (YYYYMMDD) lúc 15:40:10 và 276 mili giây |
| 56 | TargetCompID | CSERVER | Đích của tin nhắn là CSERVER. Đây là giá trị hợp lệ duy nhất trong cTrader FIX API. |
| 98 | EncryptMethod | 0 | Hiện tại, giá trị hợp lệ duy nhất là "0" (số không)= NONE_OTHER (không sử dụng mã hóa) |
| 108 | HeartBtInt | 30 | Khoảng thời gian giữa các nhịp tim tính bằng giây. Giá trị được đặt trong tệp "config.properties" (phía máy khách) dưới dạng SERVER.POLLING.INTERVAL'. 30 giây là giá trị khoảng thời gian mặc định. Nếu HeartBtInt được đặt thành 0, không cần tin nhắn nhịp tim. |
| 553 | Username | 1047 | ID người dùng dạng số |
| 554 | Password | MyPassword1 | Mật khẩu người dùng |
| 10 | CheckSum | 000 | Cách tính tổng kiểm tra như sau: cộng từng byte của tin nhắn cho đến nhưng không bao gồm trường tổng kiểm tra, sau đó chuyển đổi thành số modulo 256 có tiền tố "0" để nhận được số có ba chữ số. |