summaryrefslogtreecommitdiff
path: root/trade_queue.py
diff options
context:
space:
mode:
authoruvok2025-04-14 10:43:35 +0200
committeruvok2025-04-14 10:43:35 +0200
commitceedc4c3c19da7f01e1c315cb5c41bf4a4c59672 (patch)
tree67e3a819d8dbadba7434906246fdd7da7b5cc892 /trade_queue.py
parenteb1feb5219bab8398b53f5d80df4f901366b0b59 (diff)
Split files, add zest
Diffstat (limited to 'trade_queue.py')
-rw-r--r--trade_queue.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/trade_queue.py b/trade_queue.py
new file mode 100644
index 0000000..b8c594b
--- /dev/null
+++ b/trade_queue.py
@@ -0,0 +1,48 @@
+from collections import deque
+from typing import Deque, List
+
+from trade import Trade
+
+
+class FIFOQueue:
+ """
+ Crypto trading FIFO queue.
+
+ Will track trades.
+ """
+ def __init__(self) -> None:
+ self.queue: Deque[Trade] = deque()
+
+ def add(self, amount: float, total_cost: float, date: str) -> None:
+ """
+ Add a trade to the queue.
+ """
+ trade = Trade(amount, total_cost, date)
+ self.queue.append(trade)
+
+ def remove(self, amount: float) -> List[Trade]:
+ """
+ Remove a specified amount from the queue, returning the
+ trades used to buy.
+ """
+ if amount <= 0:
+ raise ValueError("The amount to remove must be positive.")
+
+ remaining: float = amount
+ entries: List[Trade] = []
+
+ while remaining > 0:
+ if not self.queue:
+ raise ValueError(f"Insufficient assets in queue to process sale of {amount}.")
+
+ trade = self.queue[0]
+ if trade.amount > remaining:
+ trade.amount -= remaining
+ entries.append(Trade(remaining, trade.total_cost, trade.date))
+ remaining = 0
+ else:
+ remaining -= trade.amount
+ entries.append(trade)
+ self.queue.popleft()
+
+ return entries