منذ الأيام الأولى تقريبًا أصبحت عميلاً لـ Tinkov.ومن تلك اللحظة فصاعداً ، شكوك غامضة تعذبني - هل يعكس الحساب الشخصي الواقع الموضوعي؟الحقيقة هي أنني أشتري الأوراق المالية المقومة بالدولار ، ولكن في LC يتم عرض أسعار جميع الأصول بالدولار ، والقيمة الإجمالية للمحفظة بالروبل.وأنا لا أفهم ما إذا كان الدولار قد نما أم أنني مستثمر ناجح؟ولكن ماذا عن العمولات والضرائب والأرباح الأخرى؟أود أخذ جميع معاملاتي وكتابتها في FIFO ، كما هو الحال في سجلات المستودعات ... ووضع الأرباح المستلمة على القمة ، ثم خصم الضرائب.ثم سأرى النتيجة التي أفهمها.اتضح أن Tinkov لديه واجهة برمجة تطبيقات تسمح لك بكتابة روبوتات التداول (لست مهتمًا بذلك على الإطلاق) ، بالإضافة إلى تحميل البيانات على محفظته وعملياته.يحتوي API هذا على وصف رسمي ، ولكن لم يكن كل شيء واضحًا بالنسبة لي ، كان عليّ فهمه.تظهر نتائج هذه المواجهات انتباهكم.روابط مفيدة: وصفAPIوصف آخرالحصول على رمز وتثبيت مكتبة
قبل أن تبدأ ، تحتاج إلى تثبيت المكتبة والحصول على رمز مميز.تركيب المكتبة:pip install -i https://test.pypi.org/simple/ --extra-index-url=https://pypi.org/simple/ tinkoff-invest-openapi-client
أقتبس تعليمات تلقي الرمز الرسمي:- قم بتسجيل الدخول إلى حسابك على tinkoff.ru
- انتقل إلى قسم الاستثمار
- اذهب للاعدادات
- يجب تعطيل وظيفة "تأكيد المعاملات برمز"
- قم بإصدار رمز OpenApi للتبادل و Sandbox. ربما سيطلب منك النظام تسجيل الدخول مرة أخرى ، لا تقلق ، فهذا ضروري لربط الروبوت بمنصة التداول.
- انسخ الرمز المميز واحفظه ، ولا يتم عرض الرمز مرة واحدة فقط ، ولن تتمكن من عرضه لاحقًا ، ومع ذلك ، يمكنك إصدار عدد غير محدود من الرموز المميزة.
في وقت كتابة هذا التقرير ، تم إصدار الرمز المميز على الصفحة www.tinkoff.ru/invest/settings ، وهو زر في أسفل الصفحة.
لقد واجهت أخطاء في الرمز المميز ل sandbox ، لذلك بدأت في تجربة الإصدار القتالي. ما أتمنى لكم (تحذير: لا تشتري ، تبيع عن طريق الصدفة شيء إضافي).تسجيل الدخول
from openapi_client import openapi
token = ' '
client = openapi.api_client(token)
يفعل هذان الخطان كل ما نحتاجه.بعد ذلك نعمل مع متغير العميل.ماذا يوجد في محفظتنا
الحصول على محتويات دينا محفظة:pf = client.portfolio.portfolio_get()
دعونا نرى البيانات الأساسية للعنصر الأول:print('value:', pf.payload.positions[0].average_position_price.value)
print('currency:', pf.payload.positions[0].average_position_price.currency)
print('balance:', pf.payload.positions[0].balance)
print('figi:', pf.payload.positions[0].figi)
print('ticker:', pf.payload.positions[0].ticker)
print('name:', pf.payload.positions[0].name)
في حالتي ، هذا هو:value: 45.98
currency: USD
balance: 21.0
figi: BBG000BWPXQ8
ticker: BTI
name: British American Tobacco
القيمة -رصيد سعر الورق - عدد الأوراق المالية في المحفظة والقيمة والعملة - قيمتها النقدية.figi - مؤشر الأداة المالية العالمية للمُعرِّف (مُعرِّف الأداة المالية العالمية)- أصول مؤشر .من هذه البيانات ، يمكننا معرفة اسم الأصل الذي يمكن قراءته بواسطة الإنسان.بالنسبة لهذا الطلب ، لا نحتاج إلى هذا (انظر حقل الاسم) ، ولكن في حالات أخرى سيكون مفيدًا.احصل على اسم الورقة عن طريق FIGI وتذكرة
instr = client.market.market_search_by_figi_get('BBG000BWPXQ8')
instr
نحن نحصل:{'payload': {'currency': 'USD',
'figi': 'BBG000BWPXQ8',
'isin': 'US1104481072',
'lot': 1,
'min_price_increment': 0.01,
'name': 'British American Tobacco',
'ticker': 'BTI',
'type': 'Stock'},
'status': 'Ok',
'tracking_id': 'a1979917d2141916'}
تعمل وظيفة API هذه كما يجب. نرى أن "BBG000BWPXQ8" -> "التبغ الأمريكي البريطاني".لكن البحث عن اسم الأصل بواسطة شريط لا يعمل بالنسبة لي: (((instr = client.market.market_search_by_ticker_get('BTI' )
print(instr)
اقترح المطورون تحديث المكتبة ، ولكن حتى بعد ذلك لم تقلع.قم بتنزيل دليل الأوراق المالية
ومع ذلك ، قمت بحل هذه المشكلة بشكل جذري. لقد قمت بتنزيل دليل كامل من الأصول المتداولة من Tinkov:
bonds = client.market.market_bonds_get()
etfs = client.market.market_etfs_get()
stocks = client.market.market_stocks_get()
instr_list = bonds.payload.instruments + etfs.payload.instruments + stocks.payload.instruments
instr_list[:3]
حصلت[{'currency': 'RUB',
'figi': 'BBG00844BD08',
'isin': 'RU000A0JU898',
'lot': 1,
'min_price_increment': 0.1,
'name': ' 9',
'ticker': 'RU000A0JU898'}, {'currency': 'RUB',
'figi': 'BBG00R05JT04',
'isin': 'RU000A1013Y3',
'lot': 1,
'min_price_increment': 0.1,
'name': ' \xa02',
'ticker': 'RU000A1013Y3'}, {'currency': 'RUB',
'figi': 'BBG00PNLY692',
'isin': 'RU000A100DC4',
'lot': 1,
'min_price_increment': 0.1,
'name': '- 002P 2',
'ticker': 'RU000A100DC4'}]
كما ترون ، التين والاسم هناك. لأغراضي - أكثر من كافية.احصل على قائمة العمليات
لكن الشيء الأكثر إثارة للاهتمام هو الحصول على قائمة بعملياتي. تقع الإجراءات التالية في العملية (في حالتي):- PayIn - تجديد حساب الوساطة
- PayOut - سحب الأموال
- BuyCard - الشراء من البطاقة
- بيع - بيع
- BrokerCommission - لجنة السمسرة
- توزيعات الأرباح - توزيعات الأرباح
- الضرائب - الضرائب
- TaxDividend- ضرائب الأرباح
- ServiceCommission - رسوم الخدمة
رمز تفريغ المحفظة:from datetime import datetime
from pytz import timezone
d1 = datetime(2016, 9, 30, 0, 0, 0, tzinfo=timezone('Europe/Moscow'))
d2 = datetime.now(tz=timezone('Europe/Moscow'))
ops = client.operations.operations_get(_from=d1.isoformat(), to=d2.isoformat())
دعونا نرى ما حدث. في حالتي ، هذا العنصر مهمops.payload.operations[217]
هذا ما هو عليه{'commission': {'currency': 'USD', 'value': -0.42},
'currency': 'USD',
'date': datetime.datetime(2018, 11, 7, 10, 55, 53, 648913, tzinfo=tzoffset(None, 10800)),
'figi': 'BBG000PSKYX7',
'id': '42281525510',
'instrument_type': 'Stock',
'is_margin_call': False,
'operation_type': 'BuyCard',
'payment': -141.05,
'price': 141.05,
'quantity': 4,
'status': 'Done',
'trades': [{'date': datetime.datetime(2018, 11, 7, 10, 55, 53, 648913, tzinfo=tzoffset(None, 10800)),
'price': 141.05,
'quantity': 1,
'trade_id': '42636800'}]}
نحن مهتمون بالمجالات:- التاريخ - تاريخ المعاملة
- فيجي - رمز الأصول
- نوع العملية - نوع العملية
- الدفع - مبلغ المعاملة. بالنسبة للضرائب أو العمولات ، يشار إليها. السعر بينما لا يوجد
- السعر - سعر ورقة واحدة
- الكمية - الكمية المخططة للأوراق المالية
- الصفقات - صفقات التبادل الحقيقي
نشأ السؤال على الفور - لماذا نحتاج إلى بعض الصفقات إذا كان هناك سعر وكمية؟كل شيء ليس بهذه البساطة (الخطة والحقيقة)
كما أفهمها ، تشير الكمية إلى عدد الأوراق التي أردت شراؤها. وما يتم شراؤه بالفعل يكمن في الصفقات [i]. الكمية.أولئك. إذا كنت ترغب في التحول إلى المعاملات الفعلية ، فأنت بحاجة إلى فرز ما يكمن في الصفقات.في بعض الحالات ، لا يوجد شيء - على سبيل المثال ، للضرائب أو إيداع / سحب الأموال.للحصول على أرقام حقيقية ، تحتاج إلى إلقاء نظرة على المعاملات وتبادل المعاملات:for op in ops.payload.operations:
print(op.figi)
print(op.operation_type)
if op.trades == None:
print('price:', op.price)
print('payment:', op.payment)
print('quantity:', op.quantity)
else:
for t in op.trades:
print('price:', t.price)
print('quantity:', t.quantity)
print('--------------')