Python Tinkoff API client for asyncio and humans
Project description
tinkoff-api
Python Tinkoff API client for asyncio and humans.
Table of contens
Features
- Clients for both REST and Streaming protocols
- Presence of data classes for all interaction with API
- Automatic reconnection and keep-alive connections
- Internal exclusive rate limiter for every resource in REST protocol
- Friendly exceptions for API errors
Installation
Use pip to install:
$ pip install tinkoff-api
Usage examples
REST API client:
import asyncio
from datetime import datetime
from tinkoff.investments import (
TinkoffInvestmentsRESTClient, Environment,CandleResolution
)
from tinkoff.investments.client.exceptions import TinkoffInvestmentsError
async def show_apple_year_candles():
try:
async with TinkoffInvestmentsRESTClient(
token='TOKEN',
environment=Environment.SANDBOX) as client:
candles = await client.market.candles.get(
figi='BBG000B9XRY4',
dt_from=datetime(2019, 1, 1),
dt_to=datetime(2019, 12, 31),
interval=CandleResolution.DAY
)
for candle in candles:
print(f'{candle.time}: {candle.h}')
except TinkoffInvestmentsError as e:
print(e)
async def jackpot():
try:
async with TinkoffInvestmentsRESTClient(
token='TOKEN',
environment=Environment.SANDBOX) as client:
instruments = await client.market.instruments.search('AAPL')
apple = instruments[0]
account = await client.sandbox.accounts.register()
await client.sandbox.accounts.positions.set_balance(
broker_account_id=account.brokerAccountId,
figi=apple.figi,
balance=100,
)
print('We created the following portfolio:')
positions = await client.portfolio.get_positions()
for position in positions:
print(f'{position.name}: {position.lots} lots')
except TinkoffInvestmentsError as e:
print(e)
asyncio.run(jackpot())
Streaming Client:
import asyncio
from tinkoff.investments import (
TinkoffInvestmentsStreamingClient, CandleEvent, CandleResolution
)
client = TinkoffInvestmentsStreamingClient(token='TOKEN')
@client.events.candles('BBG009S39JX6', CandleResolution.MIN_1)
@client.events.candles('BBG000B9XRY4', CandleResolution.MIN_1)
async def on_candle(candle: CandleEvent):
print(candle)
asyncio.run(client.run())
Dynamic subscriptions in runtime:
import asyncio
from tinkoff.investments import (
TinkoffInvestmentsStreamingClient, CandleEvent, CandleResolution
)
client = TinkoffInvestmentsStreamingClient(token='TOKEN')
@client.events.candles('BBG000B9XRY4', CandleResolution.HOUR)
async def on_candle(candle: CandleEvent):
if candle.h > 1000:
await client.events.candles.subscribe(
callback=on_candle,
figi=candle.figi,
interval=CandleResolution.MIN_1
)
elif candle.h < 1000:
await client.events.candles.unsubscribe(
candle.figi, CandleResolution.MIN_1
)
asyncio.run(client.run())
Complete simple bot:
import asyncio
from tinkoff.investments import (
TinkoffInvestmentsStreamingClient, TinkoffInvestmentsRESTClient,
CandleEvent, CandleResolution, OperationType
)
streaming = TinkoffInvestmentsStreamingClient('TOKEN')
rest = TinkoffInvestmentsRESTClient('TOKEN')
@streaming.events.candles('BBG000B9XRY4', CandleResolution.MIN_1)
async def buy_apple(candle: CandleEvent):
if candle.c > 350:
await rest.orders.create_market_order(
figi='BBG000B9XRY4',
lots=1,
operation=OperationType.BUY,
broker_account_id=123,
)
asyncio.run(streaming.run())
TODO
- allow to provide str constants along with specific enum objects
- add ability to unsubscribe by pattern
- rename some fields
- make some fields in snake case
- generate documentation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
tinkoff-api-1.0.1.tar.gz
(14.4 kB
view details)
File details
Details for the file tinkoff-api-1.0.1.tar.gz
.
File metadata
- Download URL: tinkoff-api-1.0.1.tar.gz
- Upload date:
- Size: 14.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.42.0 CPython/3.7.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0ce8a1cd456d83e83c543d227d0d7d5e3b16a17d27124b6c911ac86e8dd0fdc4 |
|
MD5 | 07c8f69be97cb2102e83397c6ff2b038 |
|
BLAKE2b-256 | 9a7ac88f3f01c00cb4a9d9fe66fb55977d24eea8517f91b13f2a4598a1b9bbdb |