• This repository has been archived on 26/Feb/2024
  • Stars
    star
    286
  • Rank 144,690 (Top 3 %)
  • Language
    Go
  • License
    GNU General Publi...
  • Created almost 9 years ago
  • Updated over 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A proof of concept of an electronic trading system written in Golang

GoTrade

GoTrade is a FIX protocol electronic trading and order management system written in Golang, structured for typical multi-asset instituional use

GoDoc Build Status

Status

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.

Getting Started

$ go get -u github.com/cyanly/gotrade

Features

  • Trade in real-time via FIX through the broker-neutral API.
  • Normalized FIX order flow behavior across multiple FIX versions and asset classes.
  • Pure Go.
    • Platform neutral: write once, build for any operating systems and arch (Linux/Windows/OSX etc).
    • Native code performance.
    • Ease of deployment.
    • Lack of OOP verbosity, works for small and big teams.
  • Protobuf.
    • Binary encoding format, efficient yet extensible.
    • Easy Language Interoperability (C++, Python, Java, C#, Javascript, etc).
    • Protocol backward compatibility.

Design

โ””โ”€ gotrade/
   โ”œโ”€ core/                 -> The low-level API that gives consumers all the knobs they need
   โ”‚  โ”œโ”€ order/
   โ”‚  โ”‚  โ””โ”€ execution/
   โ”‚  โ”œโ”€ service/
   โ””โ”€ proto/...             -> Protobuf messaging protocol of various entities
   โ””โ”€ services/             -> Core services managing multi-asset order flow
   โ”‚  โ”œโ”€ orderrouter/       -> Centralized management facility for multi-asset global order flow
   โ”‚  โ”œโ”€ marketconnectors/  -> Managing FIX connection to each trading venue, also performs pre-trade risk checks
   โ”‚
   โ””โ”€cmd/...                -> Command-line executables, binary build targets
   

Examples

The best way to see goTrade in action is to take a look at tests (see Benchmark section below):

Pre-Requisites:

  • Go 1.4 or higher
  • get dependencies:
$ cd $GOPATH/src/github.com/cyanly/gotrade
$ go get -u -t ./...

OrderRouter and MarketConnector test cases will mock a testdb and messaging bus for end-to-end, message to message test.

$ cd $GOPATH/src/github.com/cyanly/gotrade/services/orderrouter
$ go test -v 

$ cd $GOPATH/src/github.com/cyanly/gotrade/services/marketconnectors/simulator
$ go test -v 

Benchmark

Machine: Intel Core i5 CPU @ 2.80GHz + Ubuntu 14.04 Desktop x86_64

  • test/benchmark/client2fix_test.go
  • 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

Included:

  • 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

Excluded:

  • Database transaction time (hard-wired to an inline mock DB driver)

Result:

  • 0.176ms per op, 5670 order+fill pairs per sec

Limitations

Contributing

GoTrade ยฉ 2016+, Chao Yan. Released under the GNU General Public License.
Authored and maintained by Chao Yan with help from contributors (list).
Contributions are welcome.

cyan.ly ย ยทย  GitHub @cyanly ย ยทย