-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathserver.py
67 lines (52 loc) · 2.08 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import time
from concurrent import futures
from datetime import datetime
import grpc
import pandas_datareader.data as web
import market_data_pb2
import market_data_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class MarketDataService(market_data_pb2_grpc.MarketDataServicer):
"""
MarketDataService
- GetOHLC - returns the open, high, low, close prices for the given securities.
"""
def GetOHLC(self, request, context):
"""
Returns [open, high, low, close] prices for the given list of securities.
Prices are specified between given start and end dates.
"""
# Extract arguments
start_date = datetime.strptime(request.start_date, '%Y-%m-%d').date()
end_date = datetime.strptime(request.end_date, '%Y-%m-%d').date()
tickers = request.ticker
# Reply parameters
open_dict = {}
high_dict = {}
low_dict = {}
close_dict = {}
dates = None
# Fetch OHLC data using pandas-datareader
for ticker in tickers:
df = web.DataReader(ticker, 'iex', start_date, end_date)
if dates is None:
dates = list(df.index)
open_dict[ticker] = market_data_pb2.OHLCReply.OHLCRet(price=list(df['open']))
high_dict[ticker] = market_data_pb2.OHLCReply.OHLCRet(price=list(df['high']))
low_dict[ticker] = market_data_pb2.OHLCReply.OHLCRet(price=list(df['low']))
close_dict[ticker] = market_data_pb2.OHLCReply.OHLCRet(price=list(df['close']))
# Construct the OHLC Reply
reply = market_data_pb2.OHLCReply(dates=dates, open=open_dict, high=high_dict, low=low_dict, close=close_dict)
return reply
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
market_data_pb2_grpc.add_MarketDataServicer_to_server(MarketDataService(), server)
server.add_insecure_port('[::]:50051')
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()