GoTrade is a FIX protocol electronic trading and order management system written in Golang, structured for typical multi-asset instituional use
This project is currently more of a proof of concept. It is no where near in completeness of a commerical product. This public repo serves as mostly for the purpose of experimenting and share of ideas.
$ go get -u github.com/cyanly/gotrade
- [x] Trade in real-time via FIX through the broker-neutral API.
- [x] Normalized FIX order flow behavior across multiple FIX versions and asset classes.
- [x] Pure Go.
- [x] Platform neutral: write once, build for any operating systems and arch (Linux/Windows/OSX etc).
- [x] Native code performance.
- [x] Ease of deployment.
- [x] Lack of OOP verbosity, works for small and big teams.
- [x] Protobuf.
- [x] Binary encoding format, efficient yet extensible.
- [x] Protocol backward compatibility.
- Go 1.4 or higher
go get github.com/erikstmartin/go-testdb
go get github.com/nats-io/gnatsd
The best way to see goTrade in action is to take a look at tests (see Benchmark section below):
OrderRouter and MarketConnector test cases will mock a testdb and messaging bus for end-to-end, message to message test.
Intel Core i5 CPU @ 2.80GHz` + `Ubuntu 14.04 Desktop x86_64
CL ⇒ OR:
Client send order protobuf to OrderRouter(OR)
OR ⇒ MC:
OrderRouter process order and dispatch persisted order entity to target MarketConnector
MC ⇒ FIX:
MarketConnector translate into NewOrderSingle FIX message based on the session with its counterparty
FIX ⇒ MC:
MarketConnector received FIX message on its order, here Simulator sending a fully FILL execution
EXE ⇒ CL:
MarketConnector publish processed and persisted Execution onto messaging bus, here our Client will listen to
- from order to FIX to a fully fill execution message to execution protobuf published back
- serialsing/deserialsing mock order into protobuf messages
- Request/Publish and Response/Subscribe via NATS.io message bus
- Time spent in the Linux TCP/IP stack
- Decode FIX messages and reply by a simulated broker
- Database transaction time (hard-wired to an inline mock DB driver)
0.176ms per op, 5670 order+fill pairs per sec