I have been looking at its REST API for OANDA, for potential
use with an FX trading system I developed.
The API has two streaming endpoints, one for prices and one
for account events such as trades opening and stuff like that.
Asynchronous IO is always a bit fiddly, and I wanted separate
processes for incoming tick data and events. This enables them to be managed
separately, and generally makes handling disconnects or other errors a bit
cleaner.
If you try and mash your various feeds, trade
identification, trade management, logging, accounting etc all into one big
process it gets a bit messy and convoluted. Sometimes you don’t have a choice due to the
API available, but thankfully in this case it’s easy to separate everything out.
Details
I use the requests library for streaming from OANDA, and ZeroMQ endpoints with the pub/sub pattern for passing data to the client(s).
Conceptually, it looks like this:
The prices feed connects to the OANDA prices endpoint, and
publishes what it receives to a ZeroMQ socket. Likewise, the events feed does
the same, publishing to another zmq socket.
The client connects to the respective sockets and subscribes
to its feeds, and can do whatever is required with the data it receives. You
are not limited to one client subscriber either.
I use JSON as the serialization format, as it arrives from
OANDA. No real point in deserializing JSON to an object, then immediately serializing
that with pickle or something for transport with zeromq. Your needs may differ
of course.
All up, a pretty painless process.
Code
The single file of code (here) is the prices feed, events feed and
client that just prints out what it receives. Just run it separately three times, passing
either prices, events or client as a single argument. You will also need to
fill in your OANDA details as well.
I use a 10 second timeout for the prices feed, and a 20
second timeout for the events feed, as per OANDAs recommendations. The feed
streams will print heartbeats but not publish them to clients.
Thanks for reading and let me know how you go.