2012-11-13 40 views
9

câu hỏi rất cơ bản từ một newbie FIXCác câu hỏi về thông điệp QuickFix nứt

Nhìn vào tài liệu tại http://www.quickfixengine.org và đọc bài viết ở đây trên stackoverflow tôi thấy rất nhiều thảo luận về thông báo 'nứt'. Tôi nghĩ rằng tôi sắp xếp ý tưởng, nhưng cảm thấy như tôi vẫn chưa hoàn toàn rõ ràng.

Có thể một số người giải thích chính xác điều này là gì (tại sao nó lại cần thiết? Nó giống như hack), tại sao nó chỉ liên quan đến các thông báo FIX đã nhận và không được sử dụng chút nào khi sử dụng Python?

Cảm ơn bạn!

Trả lời

22

Trên thực tế, tất cả các bạn cần phải biết là thế này:

fromApp() callback của bạn nhận được một đối tượng Message. Thông điệp đó thực sự là một NewOrderSingle hoặc ExecutionReport hoặc một cái gì đó. Thay vì làm cho bạn hình dung ra, QF cho phép bạn kế thừa từ MessageCracker. Để sử dụng nó, hãy gọi crack() trong fromApp() của bạn, như sau:

void fromApp(const FIX::Message& message, const FIX::SessionID& sessionID) 
    throw(FIX::FieldNotFound&, FIX::IncorrectDataFormat&, FIX::IncorrectTagValue&, FIX::UnsupportedMessageType&) 
{ 
    crack(message, sessionID); 
} 

crack() làm là thế này:

  1. Chuyển đổi Message bạn vào lớp thích hợp (ví dụ NewOrderSingle, ExecutionReport, vv)
  2. Gọi tới số gọi lại onMessage(subtype) do người dùng xác định của bạn, nếu được xác định. Nếu không được xác định, nó sẽ ném một ngoại lệ UnsupportedMessageType và ứng dụng của bạn sẽ tự động gửi BusinessMessageReject (35 = j) cho đối tác.

Vì vậy, bạn có muốn xử lý thư NewOrderSingle không? Tuyệt vời, chỉ cần xác định một cuộc gọi lại onMessage(NewOrderSingle).

void onMessage(const FIX42::NewOrderSingle& message, const FIX::SessionID&) 
{ 
    // Do whatever you want with your NewOrderSingle message's content. 
    // Note that this message and the one passed to crack() are the same, content-wise. 
} 

Bạn có muốn xử lý ExecutionReport không? Xác định onMessage(ExecutionReport). Và cứ thế.

Nhưng còn những loại thư bạn không muốn xử lý? Nó sẽ hút nếu bạn phải thêm xử lý để từ chối tất cả các loại tin nhắn khác, nhưng may mắn thay, bạn không phải. Như tôi đã nói trước đó, nếu bạn không xác định một số onMessage(), QF sẽ từ chối nó cho bạn. (Nếu bạn muốn nuốt một loại tin nhắn cụ thể và bỏ qua nó mà không bị từ chối, sau đó chỉ cần xác định một cuộc gọi onMessage() không có nội dung.)

Điều đó có làm rõ một chút không? Có lẽ bây giờ this page in the QF docs có thể đọc dễ dàng hơn một chút - phần dưới cùng nói về MessageCracker.

Lưu ý: MessageCracker không xử lý thông báo cấp phiên (còn gọi là "quản trị").Nếu bạn muốn thêm xử lý tùy chỉnh cho, ví dụ như tin nhắn Logon hoặc Heartbeat, bạn phải thực hiện điều đó một cách rõ ràng trong fromAdmin() (xem this question để biết thêm thông tin).

+0

Cảm ơn lời giải thích @Grant. Về phần cuối cùng của câu hỏi của tôi, làm thế nào đến trong phần rất dưới cùng nó nói 'Python (không được hỗ trợ)' khi thảo luận về cracker tin nhắn. Tôi không cần phải làm điều tương tự trong Python mà cần phải được thực hiện trong C + + (mà không có ý nghĩa)? Liệu nó có liên quan đến cách mà python xử lý các kiểu biến so với C++ không? – gearhead

+2

Tôi chưa bao giờ sử dụng phiên bản QF Python, nhưng trang doc dường như ngụ ý rằng Python không sử dụng Cracker. Tôi đoán bạn có thể đoán đúng vì lý do tại sao. Vì Python không được phân loại, bạn có thể chỉ cần gõ một câu lệnh switch trên trường 35 trong fromApp() và ném UnsupportedMessageType trong trường hợp mặc định cho bất kỳ kiểu nào bạn không muốn xử lý. Bạn sẽ tốt hơn khi hỏi những người dùng Python QF khác. Tôi biết họ đang ở ngoài kia, nhưng tôi không biết họ đi đâu. Có thể thử các diễn đàn (xem liên kết trên trang chủ QF)? –

+0

@GrantBirchmeier cách bạn xử lý 4 = Thông báo SequenceReset – FutuToad

2

Tôi sử dụng quickfixj cho Java. Việc sử dụng và giao diện bẻ khóa để trả lại thông điệp bị nứt cho việc triển khai giao diện. Người triển khai sẽ vượt qua các phương thức của giao diện để nó có thể xử lý từng loại thông báo riêng lẻ.

Tin nhắn cracker có một thông điệp đơn giản và trả về tin nhắn dưới dạng tin nhắn được nhập cụ thể. Ưu điểm của điều này là từ điển sẽ hạn chế các trường của thông điệp để dễ dàng tìm kiếm từng trường.