diff options
Diffstat (limited to 'trade_queue.py')
-rw-r--r-- | trade_queue.py | 48 |
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 |