Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bruce-mig/stock-exchange
a stock-exchange with a working matching engine, orderbooks and market maker written in golang.
https://github.com/bruce-mig/stock-exchange
echo-server finance-application go golang stock-exchange stock-market
Last synced: 28 days ago
JSON representation
a stock-exchange with a working matching engine, orderbooks and market maker written in golang.
- Host: GitHub
- URL: https://github.com/bruce-mig/stock-exchange
- Owner: bruce-mig
- Created: 2023-11-13T14:38:08.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-19T12:47:15.000Z (about 1 month ago)
- Last Synced: 2024-11-19T13:45:02.366Z (about 1 month ago)
- Topics: echo-server, finance-application, go, golang, stock-exchange, stock-market
- Language: Go
- Homepage:
- Size: 1.67 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# stock-exchange
An exchange with a working matching engine, orderbooks and market maker.
Trading from Ganache sandbox environment.---
### How to Start application
Clone the application using the below command
```bash
git clone [email protected]:bruce-mig/stock-exchange.git
```### Start ganache sandbox server
Ensure docker is running the run
```bash
cd stock-exchange\
docker compose up
```Ganache server is listening on port `:8545`
### Test the Stock Exchange Application
```bash
cd stock-exchange
make test
```### Start the Stock Exchange Application
```bash
cd stock-exchange
make run
```The app will start listening on port `:3000`
```bash
go build -o bin/exchange
./bin/exchange
INFO[0000] new exchange user id=8
INFO[0000] new exchange user id=7
INFO[0000] new exchange user id=6____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.11.3
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:3000
INFO[0001] starting market maker id=8 makeInterval=1s minSpread=20 orderSize=200 priceOffset=10
INFO[0001] orderbooks empty => seeding market! currentINNPrice=1000 seedOffset=40
INFO[0001] new limit order price=960 size=200 type=BID userID=8
INFO[0001] new limit order price=1040 size=200 type=ASK userID=8
INFO[0001] new limit order price=970 size=200 type=BID userID=8
INFO[0001] new limit order price=1030 size=200 type=ASK userID=8
INFO[0002] new limit order price=980 size=200 type=BID userID=8
INFO[0002] new limit order price=1020 size=200 type=ASK userID=8
INFO[0003] currentPrice=980
INFO[0003] filled MARKET order avgPrice=980 size=10 type=ASK
INFO[0003] new limit order price=990 size=200 type=BID userID=8
INFO[0003] new limit order price=1010 size=200 type=ASK userID=8
INFO[0003] currentPrice=990
INFO[0003] filled MARKET order avgPrice=990 size=10 type=ASK
INFO[0004] currentPrice=1010
INFO[0004] filled MARKET order avgPrice=1010 size=10 type=BID
INFO[0004] currentPrice=990
INFO[0004] filled MARKET order avgPrice=990 size=10 type=ASK
INFO[0005] currentPrice=990
```![Application Start](static/starting-app.png)
---
## APIs
#### Place Limit Order
```bash
migeri@DESKTOP-D1MQC11:~/Projects/stock-exchange$ http POST localhost:3000/order \
UserID:=6 \
Type=LIMIT \
Bid:=true \
Price:=990 \
Size:=37 \
Market=INN
```
Below is the success response with the order Id.```bash
HTTP/1.1 200 OK
Content-Length: 21
Content-Type: application/json; charset=UTF-8
Date: Mon, 18 Nov 2024 15:31:20 GMT{
"OrderID": 60464691
}```
Below we can see the order was placed successfully:
![Order Placed Successfully](static/order-placed-successfully.png)
#### Get all user's orders
```bash
migeri@DESKTOP-D1MQC11:~$ http :3000/order/user/6
HTTP/1.1 200 OK
Content-Length: 205
Content-Type: application/json; charset=UTF-8
Date: Mon, 18 Nov 2024 14:59:52 GMT{
"Asks": [],
"Bids": [
{
"Bid": true,
"ID": 47996242,
"Price": 990,
"Size": 37,
"Timestamp": 1731941984832909182,
"UserID": 6
},
{
"Bid": true,
"ID": 64503204,
"Price": 990,
"Size": 37,
"Timestamp": 1731941985561347132,
"UserID": 6
}
]
}
```#### Get Best Ask for a counter
```bash
migeri@DESKTOP-D1MQC11:~$ http :3000/book/INN/bestAsk
HTTP/1.1 200 OK
Content-Length: 67
Content-Type: application/json; charset=UTF-8
Date: Mon, 18 Nov 2024 15:00:36 GMT{
"Bid": false,
"ID": 0,
"Price": 990,
"Size": 0,
"Timestamp": 0,
"UserID": 8
}
```#### Get Best Bid for a counter
```bash
migeri@DESKTOP-D1MQC11:~$ http :3000/book/INN/bestBid
HTTP/1.1 200 OK
Content-Length: 67
Content-Type: application/json; charset=UTF-8
Date: Mon, 18 Nov 2024 15:01:03 GMT{
"Bid": false,
"ID": 0,
"Price": 970,
"Size": 0,
"Timestamp": 0,
"UserID": 8
}
```#### Get all trades from counter INN
```bash
migeri@DESKTOP-D1MQC11:~$ http :3000/trades/INN
HTTP/1.1 200 OK
Content-Length: 1362
Content-Type: application/json; charset=UTF-8
Date: Mon, 18 Nov 2024 15:02:17 GMT[
{
"Bid": false,
"Price": 980,
"Size": 10,
"Timestamp": 1731942127526835511
},
{
"Bid": false,
"Price": 990,
"Size": 10,
"Timestamp": 1731942128027074145
},
{
"Bid": true,
"Price": 1010,
"Size": 10,
"Timestamp": 1731942128526714030
},
{
"Bid": false,
"Price": 990,
"Size": 10,
"Timestamp": 1731942129027916243
},
{
"Bid": false,
"Price": 990,
"Size": 10,
"Timestamp": 1731942129526623452
},
{
"Bid": true,
"Price": 1010,
"Size": 10,
"Timestamp": 1731942130024043735
}
]
```