2012-11-13 9 views
9

domande molto semplici da un FIX principianteDomande sul messaggio QuickFIX screpolature

Guardando la documentazione a http://www.quickfixengine.org e la lettura di messaggi qui su StackOverflow Vedo un sacco di parlare di messaggio 'rottura'. Penso di avere l'idea, ma sento di non essere ancora del tutto chiaro.

Qualcuno può spiegare in generale che cos'è esattamente (perché è necessario? Sembra un trucco), perché sembra solo relativo ai messaggi FIX ricevuti e non viene utilizzato affatto quando si utilizza Python?

Grazie!

risposta

22

In pratica, tutto quello che dovete sapere è questo:

tuo fromApp() callback ottiene un oggetto Message. Quel messaggio è in realtà un NewOrderSingle o ExecutionReport o qualcosa del genere. Invece di farti capire, QF ti consente di ereditare da MessageCracker. Per usarlo, chiamare crack() nel vostro fromApp(), come segue:

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

Cosa crack() fa è questo:

  1. converte il Message nella corretta sottoclasse (ad es NewOrderSingle, ExecutionReport, ecc)
  2. Chiama la callback onMessage(subtype) definita dall'utente, se definita. Se non definito, genera un'eccezione UnsupportedMessageType e la tua app invierà automaticamente un BusinessMessageReject (35 = j) alla controparte.

Quindi, vuoi gestire i messaggi di NewOrderSingle? Ottimo, basta definire un callback 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. 
} 

Si desidera gestire ExecutionReports? Definire onMessage(ExecutionReport). E così via.

Ma che dire di quei tipi di messaggi che non si desidera gestire ? Farebbe schifo se dovessi aggiungere gestori per rifiutare tutti gli altri tipi di messaggi, ma per fortuna non devi. Come ho detto prima, se non definisci uno onMessage(), QF lo rifiuterà per te. (Se si desidera ingoiare un determinato tipo di messaggio e ignorarlo senza rifiuto, è sufficiente definire una chiamata senza alcun corpo.)

Ciò chiarisce un po '? Forse ora this page in the QF docs potrebbe leggere un po 'più facile - la sezione in basso parla del MessageCracker.

Nota: Il MessageCracker non gestisce i messaggi a livello di sessione (noti come "admin").Se si desidera aggiungere una gestione personalizzata per, ad esempio, messaggi di accesso o heartbeat, è necessario farlo esplicitamente in fromAdmin() (vedere this question per ulteriori informazioni).

+0

Grazie per la spiegazione @Grant. Per quanto riguarda l'ultima parte della mia domanda, come mai in quella stessa sezione in basso si dice "Python (Not Supported)" quando si discute del cracker dei messaggi. Non ho bisogno di fare la stessa cosa in Python che deve essere fatto in C++ (che non ha senso)? Ha a che fare con il modo in cui Python gestisce i tipi di variabili rispetto a C++? – gearhead

+2

Non ho mai usato la versione Python di QF, ma la pagina doc sembra implicare che Python non usi Cracker. Immagino che potresti essere corretto nella tua ipotesi sul motivo. Poichè Python non è tipizzato, probabilmente si può semplicemente dare uno schiaffo a un'istruzione switch sul campo 35 in fromApp() e lanciare UnsupportedMessageType nel caso predefinito per qualsiasi tipo che non si desidera gestire. Faresti meglio a chiedere agli altri utenti QF di Python. So che sono là fuori, ma non so dove si fermano. Forse prova i forum (vedi link sulla homepage di QF)? –

+0

@GrantBirchmeier come si gestiscono i messaggi 4 = SequenceReset – FutuToad

2

Io uso quickfixj per Java. Gli usi e l'interfaccia di cracking per restituire il messaggio incrinato all'implementazione dell'interfaccia. L'implementatore supererà i metodi dell'interfaccia in modo che possa gestire ogni tipo di messaggio individualmente.

Il cracker dei messaggi prende un messaggio semplice e restituisce il messaggio come messaggio specificatamente digitato. Il vantaggio di questo è che il dizionario confinerà i campi del messaggio in modo che sia più semplice cercare ogni campo.