I am trying to implement basic FIX requests with python quickfix (FIX 4.2), however the documentation is sparse for me to understand it fully (and i have done quite a bit of research ,links at the end of the question - so please be assured that its not a question without doing any digging up)
8=FIX.4.2 | 9=108 | 35=A | 34=1 | 49=ACCOUNTXXX | 52=20161116-00:00:15.281 | 56=CNX | 553=ACCOUNTXXXSTR1 | 554=Stater123 | 98=0 | 108=60 | 141=Y | 10=133 |
8=FIX.4.2 | 9=77 | 35=A | 49=CNX | 34=1 | 52=20161116-00:00:17.928 | 56= ACCOUNTXXXSTR1 | 98=0 | 108=60 | 141=Y | 10=140 |
8=FIX.4.2 | 9=142 | 35=V | 34=8 | 49=ACCOUNTXXX | 52=20161116-12:19:48.269 | 56=CNX | 146=1 | 55=EUR/USD | 262=2016110213351833862 | 263=2 | 264=1 | 265=1 | 266=Y | 267=2 | 269=0 | 269=1 | 10=110 |
8=FIX.4.2 | 9=227 | 35=X | 49=CNX | 34=241 | 52=20161116-12:20:03.651 | 56=ACCOUNTXXX | 262=2016110213351834170 | 268=2 | 279=0 | 269=0 | 278=141 | 55=EUR/USD | 270=1.76371 | 15=GBP | 271=1000000 | 346=1 | 279=0 | 269=1 | 278=142 | 55=EUR/USD | 270=1.76406 | 15=GBP | 271=1000000 | 346=1 | 10=223 |
8=FIX.4.2 | 9=59 | 35=0 | 34=3 | 49=ACCOUNTXXX | 52=20161116-00:01:15.868 | 56=CNX | 10=054 |
I wanted a bit of advice and some basic code structure on how to set up the Python code to send A, B, C and open a socket/stream to keep reading the data in STREAM and logging it to console
Where have I looked already?
https://github.com/quickfix/quickfix/blob/master/examples/executor/python/executor.py
https://futures.io/matlab-r-project-python/35213-python-quickfix.html
https://github.com/tianyilai/QuickFix-python-client/tree/master/spec
however, the documentation and the examples are sparse and I am struggling to find my way through Thanks
A -- a login request is sent automatically by QuickFix when you call initiator.start()
. The key bit of documentation you need for this is here, with PYTHON example translation:
import quickfix
if len(sys.argv) < 2: return # FAIL to have a mandatory number of args
fileName = sys.argv[1] # .SET fileName ( a configuration file )
try:
settings = quickfix.SessionSettings( fileName )
application = quickfix.MyApplication()
storeFactory = quickfix.FileStoreFactory( settings )
logFactory = quickfix.FileLogFactory( settings )
acceptor = quickfix.SocketAcceptor( application, storeFactory, settings, logFactory )
# .SocketInitiator( ... ) # Ref. below
acceptor.start() #-------------------------------
# while condition == true: do something
#
# pass; # onEoLife:
acceptor.stop() #--------------------------------
except quickfix.ConfigError, e:
print e
( Cit.: ) ... sample code above shows how you might start up a FIX-protocol
acceptor
which listens on a socket. ...
If you rather wanted an initiator ( to setup a session from your side ) you would replace theacceptor
in this code fragment with aSocketInitiator
.
The line settings = quickfix.SessionSettings(fileName)
loads the configuration file, and many of the key fields are taken from there. See config file docs.
B -- In order to request live data you need to send a 35=V message to your counterparty. In order to do this, you define a MarketDataRequest
message, which has some variables, and you send that message to your counterparty. See here. Pay attention though, I think that the documentation is wrong here and to send the mssage you need to call fix.Session_sendToTarget(message)
.
C -- You don't need to worry about this, QuickFix handles heartbeats and logging back on after disconnects etc. automatically. You set the heartbeat interval (e.g. 60 seconds) in the config file fileName
. See config file docs.