Бид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна.

Программирование

Tinkoff Investments-ийн статистикийн үйлчилгээг хөгжүүлэхэд түлхэц өгсөн хүмүүс нь:

Юу хэлэлцэх вэ?

  • Хөгжлийн тухай зөвхөн хэрэглээний хэсэг.
  • Бодит мэдлэг, туршлага нь санхүүгийн хэрэгсэлтэй ажиллахад маш чухал юм.
  • Ажиллах асуудлуудын тойм

Тиймээс би худалдааны статистикийг тооцоолж, үүнийг тохиромжтой аргаар хийхийг хүсч байна. 

Статистикийн үйлчилгээг үе шаттайгаар хөгжүүлэх: 

  1. Tinkoff Invest API-ийн холболт
  2. Хөтөч дээр Tinkoff Invest API-аас өгөгдөл зурах
  3. Зуучлалын тайлан, гүйлгээг хүлээн авах
  4. Сонирхсон мэдээллийн тооцоо, гаралт
  5. Дүгнэлт, ирээдүйн төлөвлөгөө

Tinkoff Invest API-ийн холболт

API-д холбогдохын тулд та https://github.com/Tinkoff/investAPI#sdk баримтаас дурын SDK авч болно . Эсвэл npm багц ` tinkoff-sdk-grpc-js `. Багцыг хөгжүүлэгчид хамгийн сүүлийн хувилбар болгон шинэчлэх нь чухал юм. Суулгах

npm болон tinkoff-sdk-grpc-js

Шалгаж байна

const { createSdk } = шаардах(‘tinkoff-sdk-grpc-js’);   // Ийм байдлаар авч болох токен   const TOKEN = ‘YOURAPI’;   // TCS бүртгэлээс таныг олох боломжтой програмын нэр. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log(хүлээж байна sdk.users.getAccounts()); })();

Үр дүн: таны дансны жагсаалт консол дээр гарч ирнэ. Жишээлбэл, нюансуудад дүн шинжилгээ хийцгээе.Бид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна.

  • Дансны жагсаалтад API ашиглан ажиллах боломжгүй “Хөрөнгө оруулалтын банк” байдаг
  • Талбарууд camelCase хэлбэрээр ирдэг бол баримт бичигт эдгээр талбаруудыг доогуур_оноогоор харуулсан болохыг анхаарна уу. 
  • Энэ нь хаа сайгүй байх болно, тиймээс та зүгээр л бичиг баримтаас талбар авч хуулж болохгүй.

Ашигтай:

  • Та энэ кодыг төслийн салбараас олох боломжтой

https://github.com/pskucherov/tcsstat/tree/step1 https://github.com/pskucherov/tcsstat/compare/step1   

Хөтөч дээр Tinkoff Invest API-аас өгөгдөл зурах

Би next.js болон socket.io-г авсан. Энэ бол хүчтэй зөвлөмж биш, өөрийн үзэмжээр сонго. 

npx create-next-app@latest npm болон socket.io socket.io-client

Бид нэн даруй дараагийн+сокет+инвестапи нөхөрлөлийн алхам руу шилжиж, бүх нарийн ширийнийг энэ алхамын  Ашигтай хэсгээс үзнэ үү. Би дэлгэрэнгүй мэдээллийг тайлбарлах болно: 

  • Nodejs (сервер) талд pages/api/investapi.js файл байна. Энд бид socket.io серверийг үүсгэж, investapi руу холбогдоно.
  • Хөтөч (үйлчлүүлэгч) тал дээр бид серверт залгуураар холбогдож, брокероос дансны өгөгдлийг хүсэх болно. 
  • Бид сервер дээрх брокероос өгөгдлийг хүлээн авч, дараа нь үйлчлүүлэгч рүү илгээдэг. Үйлчлүүлэгч дээр хүлээн авах үед тэдгээрийг хөтөч дээр харуулна. 

Үр дүн:  хөтчийн консол дээр бид дансны талаарх мэдээллийг харж болно. Өөрөөр хэлбэл, сүүлийн алхамд бид серверийн консол (nodejs) дахь дансны талаарх мэдээллийг харсан бөгөөд одоогийн алхамд бид энэ мэдээллийг үйлчлүүлэгч (хөтөч) рүү шилжүүлсэн.

Бид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна.

Одоо үүнийг хөтчөөс данс сонгох боломжтой болгоё, хэрэв тэмдэг байхгүй бол консол руу алдаа илгээгдэнэ. Ажил нь энгийн бөгөөд шинэ зүйл биш тул би зөвхөн амлалтуудын холбоосыг өгдөг

  1. https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
  2. https://github.com/pskucherov/tcsstat/commit/b28ac973a57494f5232589b4cb6b9fb13b8af759 

Ашигтай:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Дээрх зүйл хэцүү байгаа хүмүүст бид энэ үе шатанд үлдэж, кодтой харьцах болно. Хэрэв танд асуулт байвал – асуу. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Зуучлалын тайлан, гүйлгээг хүлээн авах

Брокерын тайлан, гүйлгээг хүлээн авах гурван арга байдаг

  1. GetBrokerReport
  2. Гадаадын ногдол ашиг гаргагч
  3. GetOperationsByCursor

Анхнаасаа дараахь зүйлийг мэдэх нь чухал юм. 

  • Брокерын тайланг T-3 горимд гаргадаг, i.e. арилжааг бодит гүйцэтгэлийн дараа тэнд харуулна. 
  • Үүний дагуу энэ тайланг сүүлийн хоёр өдөр хүссэн тохиолдолд гурав хоногийн дараа бэлэн болно. 
  • Сүүлийн өдрүүдийн гүйлгээг авахын тулд бид гүйлгээг хүлээн авах аргыг ашигладаг боловч брокерийн тайлан гарсны дараа тэдгээрийн ID болон агуулга өөрчлөгдөж болно гэдгийг санаарай.

GetBrokerReport

Брокерын тайланг авахын тулд та дансны id, тайлангийн эхлэл, дуусах огноог авах хэрэгтэй, гэхдээ 31 хоногоос хэтрэхгүй. Бид API руу _broker_report_request үүсгэх хүсэлтийг илгээж , хариуд нь taskId авна. Үүний дараа бид энэ taskId-г ашиглан _брокерын_тайлагнах_хариу авах хэсгээс мэдээлэл авдаг .

Тиймээс баримт бичигт бичсэнээр, бодит байдал дээр нарийн ширийн зүйл байдаг. Гараа ажигла:

  • Та TaskID-г яг эдгээр өдрүүдэд үүрд хадгалах хэрэгтэй. 
  • Хэрэв та үүнийг алдсан бол хүссэн огнооны хувьд тайлан нь эхлээд үүсгэх хүсэлтийн хариуд ирэх болно. 
  • Тэгээд ерөөсөө ирэхгүй.

Код бичиж эхэлцгээе

Одоогийн огнооноос хасахыг харгалзан огноог авах арга

const getDateSubDay = (дэд өдөр = 5, эхлэл = үнэн) => {     const огноо = шинэ огноо();     date.setUTCDate(date.getUTCDate() – дэд өдөр);       if (эхлэх) {         date.setUTCHours(0, 0, 0, 0);     } else {         date.setUTCHours(23, 59, 59, 999);     }       буцах огноо; };

Тайлан үүсгэх хүсэлт 

const brokerReport = хүлээж байна (sdk.operations.getBrokerReport)({         generBrokerReportRequest: {             accountId,             from,             to,         }, });

Үр дүн:

  • Тушаалын эхний гүйцэтгэлийн үр дүнд бид taskId-ийг авдаг. 
  • Тайланг брокерын талаас гаргаж эхэлдэг. Хэзээ бэлэн болсон нь тодорхойгүй байна, бид хүлээж, тайланг хүлээж байхдаа taskId-г үе үе татаж авдаг.
  • Яагаад? Учир нь тайлан бэлэн болоогүй бол алдаа гаргадаг. Хэрэв брокерын талд тайлан бэлэн биш байгаа бол энэ нь таны кодын алдаа юм. Боловсруулна уу: 30058|INVALID_ARGUMENT|даалгавар хараахан дуусаагүй байна, дараа дахин оролдоно уу

Тайлан хүлээж авах, хүлээн авах код нь иймэрхүү харагдаж байна.

const timer = async time => {     new Promise буцаах(шийдвэрлэх => setTimeout(шийдвэрлэх, цаг)); }   const getBrokerResponseByTaskId = async (taskId, хуудас = 0) => {     оролдох {         буцах хүлээх (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 хуудас,             },         });     } catch (e) {         console.log(‘хүлээх’, e);         хүлээх цаг хэмжигч (10000);         буцах хүлээж getBrokerResponseByTaskId(taskId, хуудас);     } };

Дараа нь ижил ид шид тохиолддог. Бид скриптээ зогсоож, дахин эхлүүлнэ, бидэнд taskId байхгүй. Бид taskId хүсэлтийн тусламжтайгаар кодыг гүйцэтгэдэг боловч бид taskId-г авахаа больсон, харин тэр даруй тайланг хүлээн авдаг. Ид шид! Тэгээд үргэлж ийм байсан бол бүх зүйл сайхан байх байсан. Гэхдээ нэг сарын дараа огт мэдээлэл байхгүй болно. Ашигтай :

  • Бага зэрэг онолыг энд , энд тайлбарласан болно .
  • Кодоо нийлүүлээд төсөл нь нэг иймэрхүү харагдах болно.

https://github.com/pskucherov/tcsstat/tree/step3.1 https://github.com/pskucherov/tcsstat/compare/step3.1

  • Хэрэв хэн нэгэн үүнтэй тулгарвал энэ асуудалд тавтай морилно уу . Тэд энэ ид шидийг зассаны дараа энэ нь хүчээ алдаж, ямар нэгэн байдлаар өөр болно. Гэхдээ одоогийн байдлаар (2023.03.21) яг ийм байдлаар ажиллаж байна.

Гадаадын ногдол ашиг гаргагч

Энэ аргыг өмнөхтэй төстэй гэж хэн нэгэн бодож магадгүй бөгөөд та зөвхөн үйлдлүүдийн нэрийг өөрчлөх ганц аргыг ашиглаж болно. Гэхдээ тэд таамаглаагүй!  Тэнд байгаа нэршил нь аргын хувьд ч, буцаасан мэдээллийн хувьд ч тэс өөр. Мөн хуудасны тоо 0-ээс эхэлж, дараа нь 1-ээс эхэлдэг. Энэ бүхэнд андуурахгүйн тулд хоёр өөр аргыг бичих нь илүү хялбар байдаг. Энэ нь хачирхалтай, учир нь ажлын логик нь адилхан. Нэг арга хийх гэтэл нилээн удаан нулимж, код багатай. Энд ямар ч жишээ байхгүй болно.

GetOperationsByCursor

Гурвын хамгийн дуртай нь. Хэдийгээр хамгийн үнэн зөв биш, гэхдээ хамгийн тохиромжтой. Бид данс үүсгэж эхэлснээс хойш хамгийн дээд хугацаа хүртэл (данс хаах эсвэл одоо байгаа) хүсэлт гаргадаг. Бид хариултыг авч, курсорыг авч, өгөгдөл байгаа бол дахин хүсэлт гаргадаг.  Мөн код нь дээрх жишээнүүдээс илүү товч юм.

const timer = async time => {     new Promise буцаах(шийдвэрлэх => setTimeout(шийдвэрлэх, цаг)); }   const getOperationsByCursor = async (sdk, accountId, from, to, cursor = ”) => {     try {         const reqData = {             accountId, -аас             ,             хүртэл,             хязгаар: 1000,             төлөв: sdk.OperationState.OPERATION_STATE_EXECUTED,             Комиссгүй, худал:             withoutTrades: false,             withoutOvernights: худал,             курсор,         };           буцах await sdk.operations.getOperationsByCursor(reqData);     } catch (e) {         timer (60000) хүлээж байна;         буцах await getOperationsByCursor(sdk, accountId, from, to, cursor = ”);     } };

Ажиллуулах ноорог энд байна: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Одоо бид хүлээн авах үйлдлүүдийг энд нэмэхэд бэлэн боллоо. бидний өргөдөл. Хэрэв зөв хийгдсэн бол та дансны бүх хугацаанд брокерийн тайланг авах хэрэгтэй. Мөн дутуу өгөгдлийн хувьд ижил Т-3-уудыг ажиллагаанаас дахин ачаална. Гэхдээ үүнийг тусдаа нийтлэл болгон хувааж болно. Таны тулгарах гол нюансуудын нэг бол үйл ажиллагаа, брокерийн тайланг наах явдал юм.

  •  Хэрэв та өнөөдөр шаардлагатай огноогоор зуучлалын тайлан, гүйлгээг хүлээн авсан бол бүгдийг нь мэдээллийн санд оруулбал ямар ч асуудал гарахгүй. 
  • Маргааш тайлан болон үйлдлээс өгөгдлийн дараагийн хэсгийг хүлээн авч, тэдгээрийг одоо байгаа мэдээллийн сантай синхрончлохоор шийдэх үед танд асуудал гарах болно. 
  • Боловсруулсны дараа id таарахгүй эсвэл өөрчилсөн тухай маш олон нюансууд
  • Дараа нь OTC зах зээлийн хувьд id нь огт таарахгүй.
  •  Түүнчлэн API-ийн онцлогоос шалтгаалан синхрончлох хэрэгслүүдийн нюансууд дахин давхцдаггүй. Гэхдээ энэ бол өөр түүх юм.

Үйлдлүүдийн талаарх мэдээллийг авах боломжийг програмдаа нэмье. Мэдээллийг хаана боловсруулж, хадгалах вэ гэдэг нь гол асуулт байх болно.

  •  Хэрэв та өөрөө үүнийг хийвэл өөр өөр төхөөрөмжөөс ижил өгөгдлийг ашиглах болно. Дараа нь та сервер дээр өгөгдлийг боловсруулж, хадгалах хэрэгтэй.
  • Хэрэв танд олон янзын хэрэглэгчид маш олон янзын өгөгдөл ашигладаг бол хэрэглэгчдийн хурд эсвэл таны талд төмрийг хэмнэх нь юу чухал болохыг шийдэх хэрэгтэй. Хязгааргүй их хэмжээний техник хангамжийг төлж чадах хүн өөрийн сервер дээрх бүх зүйлийг тооцож, хэрэглэгчдэд маш хурдтай болгож, утасны хувьд маш чухал зай, ачаалал гэх мэт хэрэглэгчийн нөөцийг хэмнэдэг.

Хариуд нь хөтөч дээр тоолох нь зарчмын хувьд хамгийн оновчтой шийдэл биш юм. Тиймээс, үнэтэй биш зүйл бол бид үүнийг сервер дээрээ авч үздэг. Бид үлдсэнийг нь үйлчлүүлэгчид үлдээдэг. Би сервер дээрх комиссыг авч, тооцоолохыг үнэхээр хүсч байна. Гэхдээ энд “интерактив” гэж нэрлэгддэг нюанс гарч ирдэг. Танд олон мянган хагалгаа байгаа бөгөөд тэдгээрийг хүлээн авахад таван минут шаардлагатай гэж бодъё. Энэ үед хэрэглэгч юутай болох вэ? Спиннер? Ахиц дэвшил? Хэр их байршуулсан талаар Infa? Хэрэглэгч ямар нэг зүйлийг аль хэдийн харж байгаа үед “идэвхтэй хүлээх”-ийг ашиглах нь хамгийн тохиромжтой. Үр дүн нь энд байна :Бид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна.

  • Хуудсыг ачаалж байна
  • Бүх нэхэмжлэхийг хүсч байна
  • Үүний дараа гүйцэтгэсэн гүйлгээний шимтгэлтэй бүх гүйлгээг бүх дансны хувьд хүссэн байна. Мэдээллийг хүлээн авах үед энэ нь хөтөч дээр гарч ирдэг.

Үйл явдал болгонд өгөгдлийг шүүхгүйн тулд бид бүртгэл тус бүрдээ өөрийн үйл явдлыг татдаг. Үүн шиг:

socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, {                 зүйл: өгөгдөл?. зүйл,                 Прогресс: Boolean(nextCursor), });

Эхлэх ноорог энд байна: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Үргэлжлүүлж байна. Та энэ мөрийг уншсандаа үнэхээр сайхан байна! 

Сонирхсон мэдээллийн тооцоо, гаралт

Хэнд ямар мэдээлэл хэрэгтэй байгаагаас шалтгаална. Тиймээс би танд тулгарах гол нюансуудыг шууд хэлье.

Үнэтэй ажиллах 

Мөнгөний гүйлгээг зөвхөн бүхэл тоогоор хийх ёстой гэдгийг санхүүтэй ажилладаг хүн бүр мэддэг. Аравтын бутархайн дараах утгуудын алдаа, олон тооны үйлдлүүдийн хуримтлагдсан алдаанаас болж. Ийм учраас бүх үнийг дараах MoneyValue форматаар танилцуулж байнаБид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна.

талбар төрөл Тодорхойлолт
валют мөр ISO валютын код
нэгж int64 Нийлбэрийн бүхэл хэсэг нь сөрөг тоо байж болно
нано int32 Хэмжээний бутархай хэсэг нь сөрөг тоо байж болно

Бид тэдгээрийг тусад нь боловсруулж, дараа нь үнийн түвшинд хүргэдэг.

ишлэл.нэгж + ишлэл.нано / 1e9

Фьючерсийн гэрээний өртөг

Фьючерсийн үнийг оноогоор илэрхийлдэг бөгөөд хэрэв танд валютын ирээдүй байгаа бол та ханшийг мэдэх хэрэгтэй. Мэдээжийн хэрэг, оноогоор үнэ, үнийн алхам. Хэрэв та гүйлгээний ашгийг тооцох үед энэ нь гөлөг болно, учир нь. хэрэв та үнийг тоо хэмжээгээр үржүүлж нийт дүнг тооцвол. Энд та болгоомжтой байх хэрэгтэй. Одоохондоо энэ нь хэрхэн өрнөхийг харах болно. Энэ нь валютын фьючерсэд хамаатай, бусад газруудад бүх зүйл хэвийн байна.Бид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна. Бид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна.

OTC зах зээл

Энэ зах зээл нь маш олон онцлог шинж чанартай тул үүн дээрх үйлдлүүдийг тусад нь судалж үзье.Та үйлдлүүдийг синхрончилж эхлэхэд багажийг зөв тохируулахын тулд figi / ticker-ийг ижил хэлбэрт оруулах хэрэгтэй болно. Та үүнийг брокерийн тайлантай синхрончилж эхлэхэд ижил гүйлгээний арилжааны ID нь гүйлгээний эхэнд үсэг байгаа бөгөөд тэдгээр нь брокерийн тайланд байхгүй болно. Тиймээс, тэдгээрийг харьцуулах боломжгүй … ahem-ahem … харьцуулах! Би арилжааны цаг, тэмдэгт болон нэг арилжааны дугаарыг нөгөөд агуулагдаж байгаатай таарсан. Зөв, би мэдэхгүй. Хэн ийм зүйлтэй тулгараад, хэнд санаа тавьдаг бол энэ асуудал дээр ирж эсвэл шинээр эхлүүлээрэй.Бид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна.

Багаж хэрэгсэл дээрх математик үйлдлүүд

Бүх жагсаалтыг харахгүйгээр математикийн үйлдлүүдийг хийх боломжгүй юм. Зөөлөн дээр дулаан нэмэхгүйн тулд бид валютыг шалгаж, валют таарч, оноогоо хүссэн валют руу хөрвүүлсэн гэдэгт итгэлтэй байвал л боловсруулдаг. Банкны дугаартай ажиллах мэдлэгтэй болсноор бид данс бүрт зарцуулсан комиссыг тооцоолох болно. Үүнтэй адил: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Бид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна.    

Бичил үйлчилгээ бэлэн боллоо!

https://github.com/pskucherov/tcsstat Гэрийн даалгаврын хувьд та үйлчилгээ удаан холболттой, холболт тасарсан үед, интернет тасарсан үед, алдаа гарсан эсвэл брокерын хязгаарлалтын хугацаа дууссан эсэхийг шалгаж болно. 

Дүгнэлт, ирээдүйн төлөвлөгөө

  • Үндсэн үйлдлүүд болон Invest API-тай ажиллах талаар сурсан
  • зарцуулсан цаг ~ 10 цаг
  • Хэцүү түвшин ~ бага+ / бага дунд 

Хэрэв та микросервисийг үргэлжлүүлэн сайжруулвал үүнтэй төстэй зүйл гарч ирж магадгүй юм

https://opexbot.info

  Өөрийгөө ойлгох, гүйх, тоолохоос залхуурсан хүмүүсийн хувьд энэ бол миний хөгжил. Би тэнд хэрэглэгчдийн хүсэлтээр аналитик нэмэхээр төлөвлөж байна. Хэрэв танд нийтлэл таалагдсан бол миний телеграм сувагт бүртгүүлээрэй . Бид Tinkoff Invest API ашиглан брокерийн тайлан болон комиссын тооцоог автоматжуулах зорилгоор бичил үйлчилгээг хөгжүүлж байна.

Pavel
Rate author
Add a comment

  1. Isakiiev

    Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.

    Reply