Path: blob/master/ invest-robot-contest_tinkoff_invest_robot-main/src/algotrading/_sandbox_accounts.py
7831 views
from tinkoff.invest import MoneyValue, OrderDirection, OrderType12from loguru import logger3from tinkoff.invest.utils import now45from src.algotrading.instruments_service import get_instrument_by6from src.algotrading.utils import to_float7from src.algotrading import utils8910def get_sandbox_accounts(client):11sandbox_accounts = {}12accounts = client.sandbox.get_sandbox_accounts()13for account in accounts.accounts:14sandbox_accounts[account.id] = {}15sandbox_accounts[account.id]['info'] = {}16sandbox_accounts[account.id]['info']['name'] = account.name17sandbox_accounts[account.id]['info']['status'] = " ".join(account.status._name_.split('_')[2:])18sandbox_accounts[account.id]['info']['opened_date'] = account.opened_date.strftime("%Y-%m-%d %H:%M")19sandbox_accounts[account.id]['info']['access_level'] = " ".join(account.access_level._name_.split('_')[3:])2021return sandbox_accounts222324def delete(uuid):25api_client = utils.api_client_configure()26with api_client as client:27client.sandbox.close_sandbox_account(account_id=uuid)282930def payin(uuid, amount, cur='rub'):31if cur == 'rub':32pay_in_cur(uuid, amount, cur)33elif cur == 'usd':34pay_in_cur(uuid, amount, cur)353637def pay_in_cur(uuid, amount, cur):38money = MoneyValue(cur, amount, 0)39api_client = utils.api_client_configure()40with api_client as client:41logger.info(client.sandbox.sandbox_pay_in(account_id=uuid, amount=money))424344def open():45api_client = utils.api_client_configure()46with api_client as client:47client.sandbox.open_sandbox_account()484950def get_sandbox_positions(client, account_id):51positions = {}52sandbox_positions = client.sandbox.get_sandbox_positions(account_id=account_id)53for val in ['money', 'blocked']:54positions[val] = []55for money in sandbox_positions.__getattribute__(val):56positions[val].append({"name": money.currency,57"balance": to_float(money)58})5960positions['securities'] = []61for position in sandbox_positions.securities:62positions['securities'].append({"name": get_instrument_by(position.figi)['name'],63"balance": position.balance,64"blocked": position.blocked65})6667return positions686970def get():71api_client = utils.api_client_configure()72with api_client as client:73sandbox_accounts = get_sandbox_accounts(client)74for account_id in sandbox_accounts:75positions = get_sandbox_positions(client, account_id)7677sandbox_accounts[account_id]['positions'] = positions7879return sandbox_accounts808182def post_sandbox_order(client, account_id: str, figi: str, direct: str, count_lot: int = 1):83if direct == 'buy':84direction = OrderDirection.ORDER_DIRECTION_BUY85elif direct == 'sell':86direction = OrderDirection.ORDER_DIRECTION_SELL87else:88logger.warning('')89raise ValueError(f'Неправельный парамерт {direct=}')9091order = client.sandbox.post_sandbox_order(92account_id=account_id,93figi=figi,94quantity=count_lot,95order_id=str(now().timestamp()),96direction=direction,97order_type=OrderType.ORDER_TYPE_MARKET98)99100return order101102103if __name__ == "__main__":104print(get())105106107