Coverage for source/environment/broker.py: 100%
30 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-07-30 20:59 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-07-30 20:59 +0000
1# environment/broker.py
3# global imports
4import copy
6# local imports
7from source.environment import Order
9class Broker():
10 """
11 Responsible for managing and placing orders. It implements
12 real-environment behavior of orders price actions.
13 """
15 def __init__(self, leverage: int = 1) -> None:
16 """
17 Class constructor.
19 Parameters:
20 leverage (int): Coefficient of multiplication used to simulate
21 leverage trading.
22 """
24 self.__leverage: int = leverage
25 self.__current_orders: list[Order] = []
26 self.__recently_closed_orders: list[Order] = []
28 def get_leverage(self) -> int:
29 """
30 Leverage getter.
32 Returns:
33 (int): Copy of leverage coefficient.
34 """
36 return copy.copy(self.__leverage)
38 def get_current_orders(self) -> list[Order]:
39 """
40 Current orders getter.
42 Returns:
43 (list[Order]): Copy of the list of currently ongoing trades.
44 """
46 return copy.copy(self.__current_orders)
48 def place_order(self, amount: float, is_buy_order: bool, stop_loss: float, take_profit: float) -> None:
49 """
50 Creates trade with given parameters and attach it to current broker's orders.
52 Parameters:
53 amount (float): Amount of money assigned to order.
54 is_buy_order (bool): Indicates whether order should be treated as buy (long)
55 position - when true - or as sell (short) postion - when false
56 stop_loss (float): Coefficient used to close order when stock behaves contrary
57 to expectations.
58 take_profit (float): Coefficient used to close order when stock behaves accordingly
59 to expectations.
60 """
62 self.__current_orders.append(Order(amount, is_buy_order, stop_loss, take_profit))
64 def update_orders(self, coefficient: float) -> list[Order]:
65 """
66 Updates and closes orders. The current value of the order is multiplied by
67 coefficient and if stop loss or take profit boundaries are crossed, then
68 the order is closed.
70 Parameters:
71 coefficient (float): Multiplyer that current order value is multiplied by.
73 Returns:
74 (list[Order]): List of closed trades.
75 """
77 self.__recently_closed_orders.clear()
78 buy_trade_coefficient = ((coefficient - 1) * self.__leverage) + 1
79 sell_trade_coefficient = 2 - buy_trade_coefficient
81 for order in self.__current_orders:
82 if order.is_buy_order:
83 order.current_value = order.current_value * buy_trade_coefficient
84 else:
85 order.current_value = order.current_value * sell_trade_coefficient
87 order_ratio = order.current_value / order.initial_value
88 if order_ratio >= order.take_profit or order_ratio <= order.stop_loss:
89 self.__recently_closed_orders.append(order)
91 for order in self.__recently_closed_orders:
92 self.__current_orders.remove(order)
94 return self.__recently_closed_orders
96 def reset(self) -> None:
97 """
98 Resets broker by clearing the currently ongoing and recently closed
99 lists of orders.
100 """
102 self.__current_orders.clear()
103 self.__recently_closed_orders.clear()