fatal1ty / tinkoff-api Goto Github PK
View Code? Open in Web Editor NEWPython Tinkoff API client for asyncio and humans
Home Page: https://pypi.org/project/tinkoff-api/
License: Apache License 2.0
Python Tinkoff API client for asyncio and humans
Home Page: https://pypi.org/project/tinkoff-api/
License: Apache License 2.0
When I try to buy on Instrument BBG000000000
I get an error that Instrument is disabled for trading.
Please help!
Here is how I generate but order
await rest.orders.create_limit_order(
figi="BBG000000000",
lots=size,
price=price_bid,
operation=OperationType.BUY,
)
Traceback
Traceback (most recent call last):
File "D:\Dropbox\Dev\Trading\Market Maker\Tinkoff\Bot.py", line 265, in <module>
main()
File "D:\Dropbox\Dev\Trading\Market Maker\Tinkoff\Bot.py", line 261, in main
loop.run_until_complete(logic())
File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 467, in run_until_complete
return future.result()
File "D:\Dropbox\Dev\Trading\Market Maker\Tinkoff\Bot.py", line 246, in logic
await buy(s, price_bid, positions, currencies)
File "D:\Dropbox\Dev\Trading\Market Maker\Tinkoff\Bot.py", line 223, in buy
operation=OperationType.BUY,
File "C:\ProgramData\Anaconda3\lib\site-packages\tinkoff\investments\api\orders.py", line 55, in create_limit_order
price=price,
File "C:\ProgramData\Anaconda3\lib\site-packages\tinkoff\investments\api\base.py", line 29, in _request
code=response.payload.get('code'),
tinkoff.investments.client.exceptions.TinkoffInvestmentsAPIError: INSTRUMENT_ERROR, Instrument is disabled for trading
Привет!
Пытаюсь запустить метод get_minute_candles из примера (с небольшоей модификацией).
Проблема: лимит по dt_to (datetime, до которого я хочу получать данные), не срабатывает.
При запуске кода с dt_to=datetime(2015, 1, 1) всё равно получаю абсолютно все свечи вплоть до последней (самой свежей). Вероятно сам что-то делаю не так, по возможности прошу подсказать, как мне получить массив со свечками внутри определенного интервала (при этом dt_from работает как надо).
Подскажите пожалуйста как сделать лимит по dt_to, что бы только до этой даты отгружались данные.
Вот код:
import json
import asyncio
from datetime import datetime
from tinkoff.investments import CandleResolution, TinkoffInvestmentsRESTClient
from tinkoff.investments.utils.historical_data import HistoricalData
with open('tokens.json', 'r') as f:
json_opened = json.load(f)
real_token = json_opened["real_token"]
sanbox_token = json_opened["sandbox_token"]
candle_array = []
async def get_minute_candles():
# show 1 minute candles for AAPL in 1 year period of time
client = TinkoffInvestmentsRESTClient(token=real_token)
historical_data = HistoricalData(client)
start_date = datetime(2020, 12, 1)
end_date = datetime(2020, 12, 20)
async for candle in historical_data.iter_candles(
figi='BBG000B9XRY4',
dt_from=start_date,
dt_to=end_date,
interval=CandleResolution.WEEK,
):
print(candle)
print(candle.time)
print(end_date)
candle_array.append(candle)
asyncio.run(get_minute_candles())
Вот вывод:
(venv) MacBook-Pro-Danila:tinkoff_invest danilafominyh$ /Users/danilafominyh/Desktop/tinkoff_invest/venv/bin/python3 /Users/danilafominyh/Desktop/tinkoff_invest/get_candles.py
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=123.2, c=122.41, h=125.95, l=120.01, v=112212831, time=ISODateTime(2020, 12, 7, 7, 0, tzinfo=datetime.timezone.utc))
2020-12-07 07:00:00+00:00
2020-12-20 00:00:00
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=122.81, c=126.66, h=129.56, l=121.66, v=203499722, time=ISODateTime(2020, 12, 14, 7, 0, tzinfo=datetime.timezone.utc))
2020-12-14 07:00:00+00:00
2020-12-20 00:00:00
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=127.6, c=131.97, h=134.4, l=123.12, v=91914082, time=ISODateTime(2020, 12, 21, 7, 0, tzinfo=datetime.timezone.utc))
2020-12-21 07:00:00+00:00
2020-12-20 00:00:00
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=133.1, c=132.69, h=138.78, l=131.73, v=88446538, time=ISODateTime(2020, 12, 28, 7, 0, tzinfo=datetime.timezone.utc))
2020-12-28 07:00:00+00:00
2020-12-20 00:00:00
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=132.99, c=128.21, h=135.0, l=126.78, v=56492318, time=ISODateTime(2021, 1, 4, 7, 0, tzinfo=datetime.timezone.utc))
2021-01-04 07:00:00+00:00
2020-12-20 00:00:00
(venv) MacBook-Pro-Danila:tinkoff_invest danilafominyh$ /Users/danilafominyh/Desktop/tinkoff_invest/venv/bin/python3 /Users/danilafominyh/Desktop/tinkoff_invest/get_candles.py
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=123.2, c=122.41, h=125.95, l=120.01, v=112212831, time=ISODateTime(2020, 12, 7, 7, 0, tzinfo=datetime.timezone.utc))
2020-12-07 07:00:00+00:00
2020-12-20 00:00:00
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=122.81, c=126.66, h=129.56, l=121.66, v=203499722, time=ISODateTime(2020, 12, 14, 7, 0, tzinfo=datetime.timezone.utc))
2020-12-14 07:00:00+00:00
2020-12-20 00:00:00
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=127.6, c=131.97, h=134.4, l=123.12, v=91914082, time=ISODateTime(2020, 12, 21, 7, 0, tzinfo=datetime.timezone.utc))
2020-12-21 07:00:00+00:00
2020-12-20 00:00:00
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=133.1, c=132.69, h=138.78, l=131.73, v=88446538, time=ISODateTime(2020, 12, 28, 7, 0, tzinfo=datetime.timezone.utc))
2020-12-28 07:00:00+00:00
2020-12-20 00:00:00
Candle(figi='BBG000B9XRY4', interval=<CandleResolution.WEEK: 'week'>, o=132.99, c=128.12, h=135.0, l=126.78, v=56492862, time=ISODateTime(2021, 1, 4, 7, 0, tzinfo=datetime.timezone.utc))
2021-01-04 07:00:00+00:00
2020-12-20 00:00:00
За ранее спасибо!
Добрый день!
Я относительно недавно начал изучать python, поэтому мой вопрос может показаться дурацким, прошу прощения.
Правильно ли я понимаю, что для streaming client поддержаны только четыре типа событий - candle, orderbook, instrument и error, а событие trade (лента принтов) не поддержано? Если это так, то я хотел бы попробовать его поддержать и прислать пулл реквест.
Добрый день. Есть возможность получать значения свечив потоке не тиками, а минутными\часовыми и т.д. таймфреймами. При изменении параметра CandleResolution все равно данные в потоке приходят тиками. Спасибо
Вопрос как short выставлять позицию в tinkoff openapi
Добрый день! Подскажите пожалуйста, при запросе можно получить цену закрытия по любому из инструментов. Но тинькофф API возаращает какую то странную цифру. Она не соотвествует реальным данным. Мб вы знаете какой то внешний API по которому можно было бы по figi или isin также как в Тиькофф получать цену закрытия (цена последней с делки, с которой все перестают работать и идут спать), но чтобы эта цена была реальной, а не как у Тинькофф непойми откуда взявшаяся...
Пытаюсь получить свечи следующим кодом:
`
start_date = datetime(2021, 3, 31, 7, 0, 0)
end_date = datetime(2021, 4, 1, 14, 30, 0)
async for candle in historical_data.iter_candles(
figi='BBG000BC3BJ2',
dt_from=start_date,
dt_to=end_date,
interval=CandleResolution.MIN_5,
):`
получаем всё по текущее время.
Проблема в том, что в данном случае время в dt_to не учитывается, т.к. в self._client.market.candles.get оно определено как dt_to=dt_from + timedelta(days=days_increment + delta.days), т.е. фактически округляется в меньшую сторону.
Здравствуйте, запускаю пример get_minute_candles и не могу запустить его, у меня код выдает TinkoffInvestmentsUnavailableError. Я попробовал запустить пример Streaming Client, который тоже представлен в главном readme, он у меня запустился и отработал без ошибок. А вот Historical data не получись. Может быть вы знаете в чем, может быть причина? В качестве аргументов я передаю те параметры, что представлены в примерах.
Привет.
Сейчас в вашем пакете диапазоны версий пакетов зависимостей заданы достаточно жестко, при этом версии некоторых пакетов уже устарели:
Lines 36 to 41 in 8ade194
Из-за этого возникают проблемы с использованием вашего пакета в проектах. Например, я использую poetry для управления зависимостями, и мой проект зависит от aiohttp 3.7.3 (текущая версия на этот момент). Я не могу добавить ваш пакет в свой проект, потому что у вас aiohttp ограничен <3.7
и возникает конфликт разрешения версий зависимостей, хотя для такого ограничения нет никаких видимых причин. Вы могли бы сделать для aiohttp верхнее ограничение, например <4
.
Версии для yarl вообще можно не указывать, потому что от него зависит aiohttp.
Thanks for the work firstly!
One issue I can't come over is getting all FIGI that I need, when trading or working with market data I use tickers, but API requires FIGI, I need to map one to the other, but I don't see any method for this in the client. How would you recommend to go ?
Because path variable for this methods is "path='/sandbox/register',", and if Environment = SANDBOX, base url already contains "/sandbox/" part. The result url is like "https://api-invest.tinkoff.ru/openapi/sandbox/sandbox/register". I guess you dont need "sandbox" word in path.
I dont know how example with sandbox works :)
привет, предлагаю сменить float на Decimal для ценовых значений на основании вот этого обсуждения
https://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency
я тоже натыкался пару раз на косяки на копеечных акциях типа ВТБ — 0,033605 цена например, но сейчас не могу воспроизвести точный кейс
форкнул и попробовал реализовать сам, но не получается сделать обратную совместимость, чтобы можно было оставить float и не ломать для тех, кто уже сейчас использует либу — проблема в том, что mashumaru десериализует в указанный тип, а Union пока не реализован (если эта фича доедет, то получается изи)
вот я как сделал кастомные декодеры
https://github.com/lobziq/tinkoff-api/blob/master/tinkoff/investments/client/rest.py
https://github.com/lobziq/tinkoff-api/blob/master/tinkoff/investments/client/streaming.py
Добрый день, ловлю 500 ошибку, когда пытаюсь сделать простой запрос, чтобы получить информацию о портфеле:
Подозреваю, что ошибка возникает из-за того, что не передаю brokerAccountId
.
Я правильно понмаю, что работая в Sandbox, я не могу получить доспут на чтение своего порфтеля? Иначе говоря - Sandbox токен позвоялет создать только тестовый брокерский аккаунт, с которым можно эксперементировать.
Код на всякий случай.
import asyncio
from datetime import datetime
from tinkoff.investments import (
TinkoffInvestmentsRESTClient, Environment, PortfolioPosition
)
from tinkoff.investments.client.exceptions import TinkoffInvestmentsError
TOKEN = os.environ['SANDBOX_API']
async def show_your_portfolio():
async with TinkoffInvestmentsRESTClient(token=TOKEN,environment=Environment.SANDBOX) as client:
positions = await client.portfolio.get_positions()
for position in positions:
print(f'{position.name}: {position.lots} lots')
Typo for Currency.EUR
. It is EUS
right now.
Привет!
Вылезает ошибка при попытке установить package через pip.
Requirement already satisfied: pyyaml>=3.13 in ./venv/lib/python3.8/site-packages (from mashumaro<2.0,>=1.12->tinkoff-api) (5.3.1) Requirement already satisfied: idna>=2.0 in ./venv/lib/python3.8/site-packages (from yarl>=1.4.2->tinkoff-api) (3.0) Using legacy 'setup.py install' for tinkoff-api, since package 'wheel' is not installed. Using legacy 'setup.py install' for ciso8601, since package 'wheel' is not installed. Installing collected packages: ciso8601, aiohttp, tinkoff-api Running setup.py install for ciso8601 ... error ERROR: Command errored out with exit status 1: command: /Users/danilafominyh/Desktop/tinkoff_invest/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/qx/cs3p5gf16ld8jdfczfcv4_2r0000gn/T/pip-install-npyeur95/ciso8601_2f77d31fb3b04bd69ed356480133f7d7/setup.py'"'"'; __file__='"'"'/private/var/folders/qx/cs3p5gf16ld8jdfczfcv4_2r0000gn/T/pip-install-npyeur95/ciso8601_2f77d31fb3b04bd69ed356480133f7d7/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/qx/cs3p5gf16ld8jdfczfcv4_2r0000gn/T/pip-record-phyej0m0/install-record.txt --single-version-externally-managed --compile --install-headers /Users/danilafominyh/Desktop/tinkoff_invest/venv/include/site/python3.8/ciso8601 cwd: /private/var/folders/qx/cs3p5gf16ld8jdfczfcv4_2r0000gn/T/pip-install-npyeur95/ciso8601_2f77d31fb3b04bd69ed356480133f7d7/ Complete output (17 lines): running install running build running build_py package init file 'ciso8601/__init__.py' not found (or not a regular file) creating build creating build/lib.macosx-10.15-x86_64-3.8 creating build/lib.macosx-10.15-x86_64-3.8/ciso8601 copying ciso8601/__init__.pyi -> build/lib.macosx-10.15-x86_64-3.8/ciso8601 copying ciso8601/py.typed -> build/lib.macosx-10.15-x86_64-3.8/ciso8601 running build_ext building 'ciso8601' extension creating build/temp.macosx-10.15-x86_64-3.8 clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers -DCISO8601_VERSION=2.1.2 -I/usr/local/include -I/usr/local/opt/[email protected]/include -I/usr/local/opt/sqlite/include -I/Users/danilafominyh/Desktop/tinkoff_invest/venv/include -I/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/include/python3.8 -c module.c -o build/temp.macosx-10.15-x86_64-3.8/module.o xcrun: error: active developer path ("/Applications/Xcode.app/Contents/Developer") does not exist Use
sudo xcode-select --switch path/to/Xcode.appto specify the Xcode that you wish to use for command line developer tools, or use
xcode-select --installto install the standalone command line developer tools. See
man xcode-select for more details. error: command 'clang' failed with exit status 1 ---------------------------------------- ERROR: Command errored out with exit status 1: /Users/danilafominyh/Desktop/tinkoff_invest/venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/qx/cs3p5gf16ld8jdfczfcv4_2r0000gn/T/pip-install-npyeur95/ciso8601_2f77d31fb3b04bd69ed356480133f7d7/setup.py'"'"'; __file__='"'"'/private/var/folders/qx/cs3p5gf16ld8jdfczfcv4_2r0000gn/T/pip-install-npyeur95/ciso8601_2f77d31fb3b04bd69ed356480133f7d7/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/qx/cs3p5gf16ld8jdfczfcv4_2r0000gn/T/pip-record-phyej0m0/install-record.txt --single-version-externally-managed --compile --install-headers /Users/danilafominyh/Desktop/tinkoff_invest/venv/include/site/python3.8/ciso8601 Check the logs for full command output.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.