Path: blob/master/ invest-robot-contest_sirius-master/services/account_info.py
5932 views
import logging12from api_calls.prod_account import get_prod_accounts, get_prod_positions3from api_calls.sandbox_account import get_sandbox_accounts, get_sandbox_portfolio, get_sandbox_positions4from utils.settings import settings5from utils.util import price_to_float678# управление счётом. если не удалось загрузить - это fatal, завершаем программу9# если у пользователя несколько счетов, выбирается первый10# TODO - добавить в settings выбор счёта1112def create_account_info(account_id):13return {'account_id': account_id}141516def prepare_account_info():17account_info = None18try:19if settings()['MAIN']['mode'] == 'history_test':20account_info = create_account_info(0)21elif settings()['MAIN']['mode'] == 'sandbox':22account_info = get_account_info(True)23elif settings()['MAIN']['mode'] == 'prod':24account_info = get_account_info(False)25except:26pass27finally:28if account_info is None:29logging.fatal("Failed to load account info. May be you should check tokens.")30quit(-1)31else:32logging.info("Account info loaded = {}".format(account_info))33return account_info343536def get_account_info(is_sandbox):37if is_sandbox:38accounts = get_sandbox_accounts()['accounts']39else:40accounts = get_prod_accounts()['accounts']4142if len(accounts) == 0:43logging.warning("No accounts found!")44return None45elif len(accounts) != 1:46logging.warning("More than 1 account. Accounts = {}. Robot will trade on the first one = {}"47.format(accounts, accounts[0]))4849account_id = accounts[0]['id']50res = create_account_info(account_id)51return res525354def has_enough_money(account_info):55positions = None56if settings()['MAIN']['mode'] == 'history_test':57return True58elif settings()['MAIN']['mode'] == 'sandbox':59positions = get_sandbox_positions(account_info['account_id'])60elif settings()['MAIN']['mode'] == 'prod':61positions = get_prod_positions(account_info['account_id'])6263min_usd = float(settings()['TRADE']['min_usd'])64min_rub = float(settings()['TRADE']['min_rub'])6566current_usd = 067current_rub = 06869for currency_positions in positions['money']:70if currency_positions['currency'] == 'rub':71current_rub = price_to_float(currency_positions['units'], currency_positions['nano'])72elif currency_positions['currency'] == 'usd':73current_usd = price_to_float(currency_positions['units'], currency_positions['nano'])7475if current_usd >= min_usd and current_rub >= min_rub:76logging.debug("Current money usd = {}, rub = {}".format(current_usd, current_rub))77return True78else:79logging.warning("Robot has not enough money, usd = {}, rub = {}. "80"Minimum settings: usd = {}, rub = {}"81.format(current_usd, current_rub, min_usd, min_rub))82return False838485