2012-11-13 13 views
9

sehr grundlegende Fragen von einem Neuling FIX CrackenFragen zu QuickFIX Nachricht

in der Dokumentation Blick auf http://www.quickfixengine.org und Beiträge hier auf Stackoverflow Ich sehe eine Menge Gerede über Nachricht ‚Knacken‘ zu lesen. Ich denke, ich habe die Idee, aber ich fühle mich immer noch nicht ganz klar.

Können einige im Allgemeinen erklären, was genau das ist (warum ist es notwendig? Es klingt wie ein Hack), warum es nur bezieht sich auf empfangene FIX-Nachrichten, und überhaupt nicht bei der Verwendung von Python verwendet wird?

Vielen Dank!

Antwort

22

In der Praxis alles, was Sie wissen müssen, ist dies:

Ihr fromApp() Rückruf erhält ein Message Objekt. Diese Nachricht ist eigentlich ein NewOrderSingle oder ExecutionReport oder so. Anstatt es herauszufinden, lässt QF Sie von MessageCracker erben. Um es zu nutzen, rufen Sie crack() in Ihrem fromApp() wie folgt:

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

Was crack() tut, ist dies:

  1. Wandelt Ihre Message in die richtige Unterklasse (zB NewOrderSingle, ExecutionReport usw.)
  2. Ruft den benutzerdefinierten Rückruf onMessage(subtype) auf, falls definiert. Falls nicht definiert, wird eine Exception UnsupportedMessageType ausgelöst und Ihre App sendet automatisch ein BusinessMessageReject (35 = j) an den Kontrahenten.

Also, möchten Sie NewOrderSingle Nachrichten behandeln? Großartig, definieren Sie einfach einen onMessage(NewOrderSingle) Rückruf.

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. 
} 

Möchten Sie ExecutionReports behandeln? Definieren Sie onMessage(ExecutionReport). Und so weiter.

Aber was ist mit diesen Nachrichtentypen, die Sie nicht behandeln möchten? Es würde dich nerven, wenn du Handler hinzufügen müsstest, um all diese anderen Nachrichtentypen abzulehnen, aber zum Glück musst du das nicht. Wie ich bereits sagte, wenn Sie kein onMessage() definieren, wird QF es für Sie ablehnen. (Wenn Sie einen bestimmten Nachrichtentyp verschlucken und ihn ohne Zurückweisung ignorieren möchten, definieren Sie einfach einen onMessage()-Anruf ohne Nachricht.)

Macht das etwas klar? Vielleicht liest sich jetzt this page in the QF docs etwas leichter - der untere Teil spricht über den MessageCracker.

Hinweis: Der MessageCracker behandelt keine Nachrichten auf Sitzungsebene (aka "admin").Wenn Sie eine benutzerdefinierte Behandlung für beispielsweise Logon- oder Heartbeat-Nachrichten hinzufügen möchten, müssen Sie dies explizit in fromAdmin() tun (weitere Informationen finden Sie unter this question).

+0

Danke für die Erklärung @Grant. In Bezug auf den letzten Teil meiner Frage, wie kommt es in diesem sehr unteren Abschnitt sagt es "Python (nicht unterstützt)" bei der Diskussion der Nachrichten-Cracker. Muss ich in Python nicht dasselbe tun, was in C++ getan werden muss (das macht keinen Sinn)? Hat es damit zu tun, wie Python Variablentypen im Vergleich zu C++ behandelt? – gearhead

+2

Ich habe nie die Python-Version von QF verwendet, aber die Doc-Seite scheint zu implizieren, dass Python den Cracker nicht verwendet. Ich schätze, Sie haben vielleicht Recht, wenn Sie den Grund dafür erraten. Da Python nicht typisiert ist, können Sie wahrscheinlich eine switch-Anweisung auf Feld 35 in fromApp() schreiben und UnsupportedMessageType in den Standardfall für jeden Typ werfen, den Sie nicht behandeln wollen. Du solltest besser andere Python QF Benutzer fragen. Ich weiß, dass sie da draußen sind, aber ich weiß nicht, wo sie rumhängen. Vielleicht die Foren ausprobieren (siehe Link auf der QF Homepage)? –

+0

@GrantBirchmeier Wie behandeln Sie 4 = SequenceReset Nachrichten – FutuToad

2

Ich benutze quickfixj für Java. Das Cracking verwendet und die Schnittstelle, um die geknackte Nachricht an die Schnittstellenimplementierung zurückzugeben. Der Implementierer wird die Methoden der Schnittstelle übersteuern, so dass er jeden Nachrichtentyp einzeln verarbeiten kann.

Der Nachrichtencracker nimmt eine einfache Nachricht und gibt die Nachricht als speziell eingegebene Nachricht zurück. Der Vorteil davon ist, dass das Wörterbuch die Felder der Nachricht eingrenzt, so dass es einfacher ist, jedes Feld nachzuschlagen.