Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_TradingCompetition2022-main/stock/StockStorage.py
5931 views
1
from stock.Stock import Stock
2
from collections import defaultdict
3
from stock.StockBuilder import StockBuilder
4
from tinkoff.invest import InstrumentIdType, RequestError
5
from logger.LoggerFactory import LoggerFactory
6
from logger.BusinessLogger import BusinessLogger
7
8
9
class StockStorage:
10
"""
11
Class for storage all stock instance
12
"""
13
14
@staticmethod
15
def collect_stock(client, config, stock_storage):
16
""" Create instance of stock, set FIGI from market and save instance into Storage
17
"""
18
# List of tickers for trading
19
tickers_name = config.get(section='TradingStrategy', option='ticker_list').split(',')
20
# Model name for trading
21
model_name = config.get(section='TradingStrategy', option='model') # Trading model name
22
for ticker_name in tickers_name:
23
stock: Stock = StockBuilder.buildStock(ticker=ticker_name, model_name=model_name,
24
config=config, client=client)
25
if stock:
26
stock_storage.add(stock)
27
# Log data
28
LoggerFactory.get_business_logger_instance().add_event(BusinessLogger.STOCK_IN_WORK, stock)
29
30
return stock_storage
31
32
def __init__(self):
33
self._storage = defaultdict(Stock)
34
35
''' { Iteration for stock in Storage '''
36
37
def __iter__(self):
38
self._iteration_cursor = 0
39
self._iteration_keys = list(self._storage.keys())
40
return self
41
42
def __next__(self):
43
if self._iteration_cursor < len(self._iteration_keys):
44
stock = self._storage[self._iteration_keys[self._iteration_cursor]]
45
self._iteration_cursor += 1
46
return stock
47
else:
48
raise StopIteration
49
50
''' Iteration for stock in Storage } '''
51
52
def add(self, stock: Stock):
53
self._storage[stock.ticker] = stock
54
55
def delete(self, stock: Stock) -> Stock:
56
stock = self._storage[stock.ticker]
57
del self._storage[stock.ticker]
58
return stock
59
60
def get_stock(self, ticker):
61
return self._storage[ticker]
62
63
def get_all_figis(self):
64
figis = set()
65
for stock in self:
66
figis.add(stock.figi)
67
return figis
68
69
def get_stock_by_figi(self, figi) -> Stock:
70
# ToDo Do optimize, figi should be dict key as ticker
71
for stock in self:
72
if stock.figi == figi:
73
return stock
74
75
@property
76
def is_empty(self):
77
return True if len(self._storage) == 0 else False
78
79