MultiBit Exchange is an exchange platform that can be leveraged as a starting point for creating an exchange of any kind.
MultiBit Exchange is a platform that consists of a REST API front-end and trading engine back-end that can be leveraged to manage markets, orders, accounts, and trades. It also aims to be very well tested and clean making it easy to extend to support additional order types and matching algorithms.
There is an endless variety of types of exchanges that can be created using MultiBit Exchange. Here are a few ideas:
- An exchange company such as Mt.Gox for trading USD for BTC
- An exchange centered around BTC with multiple markets for exchanging BTC for cell phone minutes, gift cards, gold, etc.
- A precious medal exchange: gold, silver, platinum, etc.
- A traditional currency exchange
- A test platform for experimenting with HFT algorithms, experimental order types, algorithmic trading, etc.
- An Inter-exchange arbitrage platform
MultiBit Exchange aims to be more that just a functioning exchange, but a well crafted codebase that is:
- Well tested
- Well structured
- High-throughput / Low-latency by leveraging event sourcing and the LMAX Disruptor pattern.
- Extensible (not necessarily configurable or pluggable, but definitely malleable)
"Clean code always looks like it was written by someone who cares." Michael Feathers
Great software doesn't just happen. It requires a disciplined approach. The following methodology is used to develop MultiBit Exchange:
- Focus on the core domain and application of Domain Driven Design principles
- Application of Test Driven Development
- Disciplined development of well-structured layered code
- Leveraging proven existing technology wherever possible
MultiBit Exchange follows the hexagonal architecture. See: http://alistair.cockburn.us/Hexagonal+architecture
MultiBit Exchange is relatively new, but I have ambitious plans:
- Decentralized - be resistant to shutdown and DDoS attacks.
- Reliable - be able to run with as close to zero downtime as possible.
- Reusable - be simple to understand, leverage, and extend.
- Robust - be thoroughly tested and publicly scrutinized.
- Performant - be able to handle huge volumes without low latency.
- Magical - do all of this without being difficult to use.
Many thanks to all the hard work that was put into the many ideas, libraries, and systems that MultiBit Exchange is built on:
Domain Driven Design lies at the core of MultiBit Exchange. This is one of the most important contributions to the software development craft. Thank you Eric Evans! (http://skillsmatter.com/expert-profile/home/eric-evans)
google-guice - Guice is used for dependency injection throughout. Thank you! https://code.google.com/p/google-guice/people/list
guava-libraries - Guava is used throughout and makes Java just a little nicer to work with. Thank you! https://code.google.com/p/guava-libraries/people/list
Dropwizard - Dropwizard serves as the front-end for REST API and web interfaces. Thank you! http://dropwizard.codahale.com/about/contributors/
LMAX Disruptor - The Disruptor pattern is used to help with speedy production and consumption of events. Thank you! Michael Barker (https://github.com/mikeb01)
AXON Framework - The AXON Framework is used to help with CQRS. Thank you AXON Framework Team! (
MongoDB - Much of the persistence is provided by MongoDB. Thank you MongoDB Team! (http://www.mongodb.org/)
Heroku - Used as a hosting environment during development. Thank you Heroku Team! (https://www.heroku.com/)
MongoDB is used to support Read Models. Follow the usual MongoDB installation instructions, such as
$ brew update
$ brew install mongo
Start MongoDB as a background process with
$ mongod &
Then create the following collections through the Mongo CLI
$ mongo
> use mbexchange
> db.createCollection("market_read");
From the console you can do the following
$ cd <project root>
$ mvn clean install
$ java -jar target/web-develop-SNAPSHOT.jar server mbexchange-demo.yml
If startup was successful, then navigate to localhost:8080/markets to see some JSON output.
Next, using a browser plugin like POSTMAN POST a JSON document to /markets to create a new market.
Include the following header
Content-type: application/json
The format should be
{
"marketSymbol": "mbexchangeITMCUR",
"itemSymbol": "ITM",
"currencySymbol": "CUR"
}
Navigate back to localhost:8080/markets to see the newly created market.
Use master
for the latest production release. Use develop
for the latest release candidate.
If you wish to contribute, please start with develop
.
http://patorjk.com/software/taag/#p=display&f=Doom&t=MultiBit%20Exchange