A lightweight pure-python centralized exchange matching engine
Start a matching engine instance in a Docker container named pymatch by
running the following commands:
docker build -f tools/docker/Dockerfile . -t pymatchLaunch another terminal window and submit orders to the matching engine with the following command:
echo $'B,1234567890,32503,1234567890\nB,1138,31502,7500' | docker run -i pymatchObserve trade and book messages as they occur...
First, you will need to install the conda package manager.
Next, create an isolated conda environment and then run the installation commands:
conda create --name pymatch python=3.7 --yes && conda activate pymatch
pip install pip==22.0.3 --upgrade
pip install -e .[tests]Run the testcases:
pytest pymatch/tests/See the pymatch/tests/lse/test_lse_orderbook.py::test_profile_orderbook testcase for submitting orders to the matching engine within python.
echo $'B,1234567890,32503,1234567890\nB,1138,31502,7500' | python -m pymatch.mainThe output to stdout:
██████╗ ██╗ ██╗███╗ ███╗ █████╗ ████████╗ ██████╗██╗ ██╗
██╔══██╗╚██╗ ██╔╝████╗ ████║██╔══██╗╚══██╔══╝██╔════╝██║ ██║
██████╔╝ ╚████╔╝ ██╔████╔██║███████║ ██║ ██║ ███████║
██╔═══╝ ╚██╔╝ ██║╚██╔╝██║██╔══██║ ██║ ██║ ██╔══██║
██║ ██║ ██║ ╚═╝ ██║██║ ██║ ██║ ╚██████╗██║ ██║
╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝
[WARNING] - Printing orderbook output to stdout. This will severly degrade performance! Set the `ENABLE_PROFILING=1` flag to enable profiling...
[INFO] - Expecting input from stdin...
+-----------------------------------------------------------------+
| BUY | SELL |
| Id | Volume | Price | Price | Volume | Id |
+----------+-------------+-------+-------+-------------+----------+
|1234567890|1,234,567,890| 32,503| | | |
| 1138| 7,500| 31,502| | | |
Please note, performance is severely degraded if displaying messages to stdout is also enabled.
To profile the performance of the orderbook set the set the environment variable to ENABLE_PROFILING=1.
head pymatch/tests/lse/test_data/profile.txt
cat pymatch/tests/lse/test_data/profile.txt | ENABLE_PROFILING=1 python -m pymatch.main