69 lines
2.8 KiB
Python
69 lines
2.8 KiB
Python
"""
|
|
This script is controlled by constant SHARE_PART_NUM and designed to collect shares object, to decide and check which
|
|
ones are more liquid
|
|
"""
|
|
|
|
import tinkoff_grpc
|
|
import time
|
|
import grpc
|
|
import argparse
|
|
import market_trade.constants
|
|
|
|
|
|
# initialized argument parser
|
|
arguments_parser = argparse.ArgumentParser(description="A simple shares data collector")
|
|
|
|
# added part number controller
|
|
arguments_parser.add_argument("-p", "--part-number", type=int, action="store",
|
|
dest=market_trade.constants.PART_NUMBER_FIELD,
|
|
default=market_trade.constants.DEFAULT_PART_NUMBER)
|
|
|
|
|
|
def get_share_part(part_number, channel):
|
|
"""
|
|
This function returns list of shares based on limit and controlling constant `SHARE_PART_NUM`
|
|
:param part_number: int, a number indicating which shares part should we collect now
|
|
:param channel: tinkoff_grpc.Channel object, which helps to initialize the service
|
|
:return: shares, list of Share objects
|
|
"""
|
|
|
|
# initializing the service
|
|
instrument_service = tinkoff_grpc.InstrumentsService(channel)
|
|
|
|
# getting list of all shares
|
|
shares = instrument_service.get_shares(market_trade.constants.DEFAULT_INSTRUMENT_STATUS)
|
|
|
|
# getting part indices, based on the constant PART NUM
|
|
start_share_idx = part_number * market_trade.constants.MARKETDATA_CONNECTION_LIMIT_SUBSCRIPTIONS
|
|
end_share_idx = (part_number+1) * market_trade.constants.MARKETDATA_CONNECTION_LIMIT_SUBSCRIPTIONS
|
|
|
|
# if the length of shares is smaller than end index, make it just the last share element
|
|
if end_share_idx > len(shares):
|
|
end_share_idx = -1
|
|
|
|
# getting our shares
|
|
shares_to_check = shares[start_share_idx: end_share_idx]
|
|
return shares_to_check
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# getting our arguments parsed and converting them to dict
|
|
cli_args = vars(arguments_parser.parse_args())
|
|
|
|
api_address = market_trade.constants.TINKOFF_API_ADDRESS
|
|
token = market_trade.constants.TINKOFF_BEARER_TOKEN
|
|
authorization_field = market_trade.constants.TINKOFF_AUTHORIZATION_HEADER
|
|
with tinkoff_grpc.Channel(api_address=api_address,
|
|
token=token,
|
|
authorization_field=authorization_field) as tinkoff_channel:
|
|
# getting target share part
|
|
shares_part = get_share_part(cli_args[market_trade.constants.PART_NUMBER_FIELD], channel=tinkoff_channel)
|
|
while True:
|
|
time.sleep(1)
|
|
try:
|
|
tinkoff_trades_saver = tinkoff_grpc.savers.TradesSaver(channel=tinkoff_channel, instruments=shares_part,
|
|
filepath=market_trade.constants.SHARES_TRADES_PATH)
|
|
tinkoff_trades_saver.start()
|
|
except grpc.RpcError as grpc_error:
|
|
pass
|