From f99dcdf422310400fe9f20f61697328e87485a34 Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Wed, 19 Jan 2022 09:57:14 +0000
Subject: [PATCH] Insertion sort sides instead of hashmap

---
 protocol.py |  104 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 97 insertions(+), 7 deletions(-)

diff --git a/protocol.py b/protocol.py
index 9d662cc..c575102 100644
--- a/protocol.py
+++ b/protocol.py
@@ -1,5 +1,19 @@
 """.#protocol.py handling protocol."""
 import book
+from enum import Enum
+import httpx
+import json
+
+test = True
+
+HOST: str = "sytev070"
+if (test):
+    PORT = "9005"
+else:
+    PORT = "9000"
+
+USER: str = "jgrunbau"
+PASS: str = "b7d630945a0854581d9f86ba147f34a5"
 
 
 def handleMessage(bs: {str, book.Book}, message: {str, str}):
@@ -11,7 +25,12 @@
     elif (message["type"] == "ADDED"):
         addOrder(bs, message)
     elif (message["type"] == "DELETED"):
-        pass
+        deleteOrder(bs, message)
+    elif (message["type"] == "TRADE"):
+        tradeOrder(bs, message)
+    elif (message["type"] in {"BROKER_REQUEST", "BROKER_ACK",
+                              "BROKER_CONFIRM"}):
+        broker(bs, message)
 
 
 def announce(bs: {str, book.Book}, message: {str, str}):
@@ -27,14 +46,85 @@
 
 def settle(bs: {str, book.Book}, message: {str, str}):
     """Settle order."""
-    bs.pop(message["product"])#.printBook()
+    b = bs.pop(message["product"])
+    if (False):
+        b.printBook()
+        print()
+        if (len(b.askSide.levels) > 0):
+            print(b.askSide.levels[0])
+        if (len(b.bidSide.levels)):
+            print(b.bidSide.levels[0])
+        print()
+
 
 def addOrder(bs: {str, book.Book}, message: {str, str}):
     """Order added to exchange."""
-    price = message["price"]
-    volume = message["resting"] + message["filled"]
     if (message["side"] == "BUY"):
-        side = book.OrderSide.Buy
+        bs[message["product"]].bid(
+            book.Order(message["price"], book.OrderSide.Buy,
+                       message["resting"],
+                       message["timestamp"], message["id"]))
     else:
-        side = book.OrderSide.Sell
-    bs[message["product"]].addOrder(book.Order(price, side, volume))
+        bs[message["product"]].ask(
+            book.Order(message["price"], book.OrderSide.Sell,
+                       message["resting"],
+                       message["timestamp"], message["id"]))
+
+
+def deleteOrder(bs: {str, book.Book}, message: {str, str}):
+    """Delete order from market."""
+    if (message["side"] == "BUY"):
+        bs[message["product"]].bidSide.delete(message["id"])
+    else:
+        bs[message["product"]].askSide.delete(message["id"])
+
+
+def tradeOrder(bs: {str, book.Book}, message: {str, str}):
+    """Order traded."""
+    if (message["tradeType"] == "BUY_AGGRESSOR"):
+        bs[message["product"]].bidSide.delete(message["passiveOrder"])
+    elif (message["tradeType"] == "SELL_AGGRESSOR"):
+        bs[message["product"]].askSide.delete(message["passiveOrder"])
+
+
+def broker(bs: {str, book.Book}, message: {str, str}):
+    """Broker trades."""
+    pass
+
+
+def send(message):
+    """Send message with exchange."""
+    return httpx.post(f"http://{HOST}:{PORT}/execution",
+                      data={"message": json.dumps(message),
+                            "username": USER,
+                            "password": PASS}).json()
+
+
+class OrderEnum(Enum):
+    """Enum for ordering from the exchange."""
+
+    ADD = 0,
+    DELETE = 1,
+    BROKER_REQUEST = 2,
+    BROKER_CONFIRM = 3
+
+
+def order(orderType: OrderEnum, product: str, price: float = 0,
+          side: book.OrderSide = book.OrderSide.Buy,
+          volume: int = 0, orderId: str = "", counterparty: str = ""):
+    """Order from exchange."""
+    if (orderType == OrderEnum.ADD):
+        resp = send({"type": "ADD",
+                     "product": product,
+                     "price": price,
+                     "side": side,
+                     "volume": volume})
+    elif (orderType == OrderEnum.DELETE):
+        resp = send({"type": "DELETE",
+                     "product": product,
+                     "id": id})
+    elif (orderType == OrderEnum.BROKER_REQUEST):
+        pass
+    elif (orderType == OrderEnum.BROKER_CONFIRM):
+        pass
+    return resp

--
Gitblit v1.9.3