Við erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.

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

Innblásendurnir á bak við þróun tölfræðiþjónustunnar fyrir Tinkoff Investments voru:

Hvað verður rætt?

  • Aðeins beitti hluti um þróun.
  • Raunveruleg þekking og reynsla, sem skipta miklu máli í vinnu með fjármálagerninga.
  • Yfirlit yfir málefni til að vinna að

Svo ég vil reikna út viðskiptatölfræði og gera það á þægilegan hátt. 

Þróa tölfræðiþjónustu skref fyrir skref: 

  1. Tenging við Tinkoff Invest API
  2. Teikning gagna frá Tinkoff Invest API í vafra
  3. Tekið á móti miðlunarskýrslum og viðskiptum
  4. Útreikningur og framleiðsla á áhugaverðum upplýsingum
  5. Niðurstöður og áætlanir um framtíðina

Tenging við Tinkoff Invest API

Til að tengjast API geturðu tekið hvaða sdk sem er úr skjölunum https://github.com/Tinkoff/investAPI#sdk . Eða npm pakki ` tinkoff-sdk-grpc-js `. Það er mikilvægt að pakkinn sé uppfærður í nýjustu útgáfuna af hönnuðum. Settu upp

npm ég tinkoff-sdk-grpc-js

Athuga

const { createSdk } = require(‘tinkoff-sdk-grpc-js’);   // Tákn sem hægt er að fá svona  const TOKEN = ‘YOURAPI’;   // Nafn forritsins sem þú getur fundið í TCS logs. const appName = ‘tcsstat’;   const sdk = createSdk(TOKEN, appName); (async () => {     console.log(bíða eftir sdk.users.getAccounts()); })();

Niðurstaða: listi yfir reikninga þína mun birtast í stjórnborðinu. Til dæmis skulum við greina blæbrigðin:Við erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.

  • Í listanum yfir reikninga er „Fjárfestingarbanki“ sem þú getur ekki unnið með með því að nota API
  • Vinsamlegast athugaðu að reitirnir koma í camelCase, en í skjölunum eru þessir reitir sýndir í under_score. 
  • Þetta verður svona alls staðar, svo þú getur ekki bara tekið og afritað reit úr skjölunum.

Nothæft:

  • Þú getur fundið þennan kóða í verkefnagreininni

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

Teikning gagna frá Tinkoff Invest API í vafra

Ég tók next.js og socket.io. Þetta eru ekki sterk meðmæli, veldu að eigin vali. 

npx create-next-app@news npm og socket.io socket.io-client

Við höldum strax áfram í vináttuskrefið næsta+socket+investapi, og sjáum Gagnlegt hluta þessa skrefs fyrir allar upplýsingar.  Ég mun lýsa smáatriðum: 

  • Á nodejs (miðlara) hliðinni er pages/api/investapi.js skrá. Þetta er þar sem við búum til socket.io netþjóninn og tengjumst investapi.
  • Á vafranum (viðskiptavinur) hliðinni tengjumst við netþjóninum í gegnum fals og biðjum um reikningsgögn frá miðlara. 
  • Við fáum gögn frá miðlaranum á netþjóninum og sendum þau síðan til viðskiptavinarins. Þegar þeir eru mótteknir á biðlara birtast þeir í vafranum. 

Niðurstaða:  í vafraborðinu getum við séð upplýsingar um reikninga. Það er, í síðasta skrefi sáum við upplýsingar um reikninga í miðlara stjórnborðinu (nodejs), í núverandi skrefi, fluttum við þessar upplýsingar til viðskiptavinarins (vafra).

Við erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.

Nú skulum við gera það þannig að þú getur valið reikning úr vafranum, og ef það er enginn tákn, þá er villa send á stjórnborðið. Verkið er einfalt og ekkert nýtt, svo ég gef aðeins tengla á skuldbindingar

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

Nothæft:

  • Hvernig á að eignast vini næst og fals er lýst í smáatriðum hér
  • Vinakóði næsta+socket+investapi:

https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Fyrir þá sem ofangreint er erfitt, þá höldum við áfram á þessu stigi og tökumst á við kóðann. Ef þú hefur spurningar – spurðu. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2

Tekið á móti miðlunarskýrslum og viðskiptum

Það eru þrjár aðferðir til að fá miðlunarskýrslur og viðskipti

  1. GetBrokerReport
  2. Fáðu arð Erlendur útgefandi
  3. Get OperationsByCursor

Frá upphafi er mikilvægt að vita: 

  • Miðlunarskýrslan er gerð í T-3 ham, þ.e. viðskipti birtast þar eftir raunverulega framkvæmd þeirra. 
  • Samkvæmt því, ef þú biður um þessa skýrslu fyrir síðustu tvo daga, verður hún tilbúin eftir þrjá daga. 
  • Til að gera samninga fyrir síðustu daga notum við aðferðina til að taka á móti aðgerðum, en mundu að auðkenni þeirra og innihald geta breyst eftir myndun miðlunarskýrslunnar.

GetBrokerReport

Til að fá miðlunarskýrslu þarftu að taka reikningskenni, upphafsdag og lokadag skýrslunnar, þó ekki meira en 31 dag. Við sendum beiðni um að búa til skýrslu til API í create _broker_report_request , fáðu taskId sem svar. Eftir það, með því að nota þetta taskId, fáum við gögn frá get _broker_report_response.

Svo segir í skjölunum, í raun eru blæbrigði. Passaðu þig á höndum þínum:
  • Þú þarft að vista TaskID að eilífu nákvæmlega fyrir þessar dagsetningar. 
  • Þar sem ef þú tapar henni, þá kemur skýrslan fyrst fyrir umbeðnar dagsetningar sem svar við kynslóðarbeiðninni, 
  • Og þá kemur það alls ekki.
Byrjum að skrifa kóða

Aðferð til að fá dagsetningu, að teknu tilliti til frádráttar frá núverandi dagsetningu

const getDateSubDay = (undirdagur = 5, byrjun = satt) => {     const date = new Date();     date.setUTCDate(date.getUTCDate() – undirdagur);       if (byrja) {         date.setUTCHours(0, 0, 0, 0);     } annað {         date.setUTCHours(23, 59, 59, 999);     }       skiladagur; };

Beiðni um skýrslugerð 

const brokerReport = await (sdk.operations.getBrokerReport)({         generateBrokerReportRequest: {             accountId,             from,             to,         }, });

Niðurstaða:

  • Sem afleiðing af fyrstu framkvæmd skipunarinnar fáum við taskId. 
  • Skýrslan byrjar að búa til hlið miðlarans. Þegar það er tilbúið er óþekkt, bíðum við og tökum reglulega upp taskId í aðdraganda skýrslunnar.
  • Hvers vegna? Vegna þess að ef skýrslan er ekki tilbúin, veldur hún villu. Ef skýrslan er ekki tilbúin hjá miðlara, þá er þetta villa í kóðanum þínum. Vinsamlega vinna úr: 30058|INVALID_ARGUMENT|verkefni ekki lokið enn, vinsamlegast reyndu aftur síðar

Kóðinn fyrir að bíða og fá skýrslu lítur einhvern veginn svona út.

const timer = ósamstilltur tími => {     skila nýju loforði (leysa => setTimeout(leysa, tími)); }   const getBrokerResponseByTaskId = async (taskId, page = 0) => {     try {         return await (sdk.operations.getBrokerReport)({             getBrokerReportRequest: {                 taskId,                 page,             },         });     } grípa (e) {         console.log(‘bíða’, e);         bíða tímamælir(10000);         aftur bíður getBrokerResponseByTaskId(verkefnisnúmer, síða);     } };

Þá gerist sami galdurinn. Við hættum handritinu okkar, byrjum það aftur, við höfum ekki taskId. Við keyrum kóðann með taskId beiðninni, en við fáum ekki lengur taskId, heldur strax skýrsluna. Galdur! Og allt væri í lagi ef þetta væri alltaf svona. En eftir mánuð verða engin gögn. Gagnlegt :

  • Smá fræði er útlistuð hér og hér .
  • Ef þú setur kóðann saman mun drögin líta einhvern veginn svona út.

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

  • Ef einhver rekst á þetta, velkominn í málið . Eftir að þeir gera við þennan galdur mun hann missa kraftinn og verða einhvern veginn öðruvísi. En eins og er núna (21/03/2023) virkar þetta bara svona.

Fáðu arð Erlendur útgefandi

Einhver gæti haldið að aðferðin sé svipuð þeirri fyrri og þú getur notað eina aðferð þar sem þú breytir aðeins heiti aðgerðanna. En þeir giskuðu ekki!  Nafngiftin þar er mjög mismunandi bæði í aðferðum og skiluðum upplýsingum. Og blaðsíðutalan byrjar frá 0, síðan frá 1. Til þess að ruglast ekki í þessu öllu er auðveldara að skrifa tvær mismunandi aðferðir. Sem er skrítið, því rökfræði vinnunnar er sú sama. Ég hrækti í langan tíma þegar ég reyndi að búa til eina aðferð og það var minna af kóða. Hér verða engin dæmi.

Get OperationsByCursor

Uppáhaldið mitt af þremur. Þó ekki það nákvæmasta, en það fullnægjandi. Við gerum beiðni frá upphafi stofnunar reiknings til hámarks mögulegrar dagsetningar (að loka reikningi eða núverandi). Við fáum svarið, tökum bendilinn og biðjum aftur um svo framarlega sem gögn eru til.  Og kóðinn er hnitmiðaðri en í dæmunum hér að ofan.

const timer = ósamstilltur tími => {     skila nýju loforði (leysa => setTimeout(leysa, tími)); }   const getOperationsByCursor = ósamstilltur (sdk, accountId, from, to, cursor = ”) => {     try {         const reqData = {             accountId,             from,             to,             limit: 1000,             state: sdk.OperationState.OPERATION_STATE_EXECUTED,             withoutCommissions: false,             withoutTrades: false,             withoutOvernights: false,             cursor,         };           aftur bíða sdk.operations.getOperationsByCursor(reqData);     } grípa (e) {         await timer(60000);         return await getOperationsByCursor(sdk, accountId, from, to, cursor = ”);     } };

Drögin sem á að keyra eru hér: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Nú erum við tilbúin að bæta við móttökuaðgerðum við umsókn okkar. Ef það er gert á réttan hátt, þá þarftu að fá verðbréfamiðlunarskýrslur fyrir alla tilvist reikningsins. Og fyrir gögnin sem vantar, sömu T-3, endurhlaða frá aðgerðum. En þetta má skipta í sérstaka grein. Af helstu blæbrigðum sem þú munt lenda í er að líma aðgerðir og miðlunarskýrslu.

  •  Ef þú fékkst í dag miðlunarskýrslu og viðskipti fyrir nauðsynlegar dagsetningar, settu það allt í gagnagrunninn, þá eru engin vandamál. 
  • Þú munt lenda í vandræðum á morgun þegar þú færð næsta hluta gagna úr skýrslunni og aðgerðunum og ákveður að samstilla þau við núverandi gagnagrunn. 
  • Mikið af blæbrigðum um misræmd eða breytt auðkenni eftir vinnslu
  • Síðan fyrir OTC-markaðinn passa auðkennin alls ekki saman.
  •  Eins og blæbrigði samstillingartækja, sem aftur fara ekki saman, vegna sérkenni API. En það er önnur saga.

Við skulum bæta upplýsingum um aðgerðir við umsókn okkar. Aðalspurningin verður hvar gögnin verða unnin og geymd.

  •  Ef þú gerir það fyrir sjálfan þig muntu neyta sömu gagna frá mismunandi tækjum. Síðan þarf að vinna úr og geyma gögn á þjóninum.
  • Ef þú ert með mikið af mismunandi gögnum sem neytt eru af mörgum mismunandi notendum, þá þarftu að ákveða hvað er mikilvægara: hraði notenda eða sparnaður járns á hliðinni. Sá sem hefur efni á óendanlega magni af vélbúnaði telur allt á netþjóninum sínum og gerir hann ofurhraðan fyrir notendur og sparar notendaauðlindir, svo sem rafhlöðu og umferð, sem er mjög mikilvægt í símum.

Aftur á móti er talning í vafranum ekki besta lausnin í grundvallaratriðum. Þess vegna, það sem er ekki dýrt, teljum við það á netþjóninum okkar. Við látum viðskiptavininn eftir. Ég vil endilega taka og reikna þóknunina á þjóninum. En hér kemur blæbrigðið sem kallast „gagnvirkni“. Segjum að þú hafir þúsundir aðgerða og það tekur fimm mínútur að fá þær. Hvað mun notandinn hafa á þessum tíma? Spinner? Framfarir? Infa um hversu miklu var hlaðið upp? Það er tilvalið að nota „virka bið“ þegar notandinn í ferlinu gæti þegar séð eitthvað. Hér er niðurstaðan:Við erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.

  • Hleðsla síðu
  • Óskað er eftir öllum reikningum
  • Eftir það er óskað eftir öllum færslum með þóknun fyrir framkvæmdar færslur fyrir alla reikninga. Þegar gögn berast eru þau birt í vafranum.

Til þess að sía ekki gögnin í atburðunum hverju sinni, tökum við okkar eigin atburði fyrir hvern reikning. Svona:

socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, {                 items: data?.items,                 inProgress: Boolean(nextCursor), });

Drögin sem á að ræsa eru hér: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Áfram. Það er frábært að þú skulir hafa lesið þessa línu! 

Útreikningur og framleiðsla á áhugaverðum upplýsingum

Fer eftir því hver þarf hvaða upplýsingar. Þess vegna segi ég þér strax helstu blæbrigðin sem þú munt lenda í.

Vinna með verð 

Allir sem vinna við fjármál vita að peningaviðskipti eiga aðeins að fara fram með heilum tölum. Vegna ónákvæmni gilda eftir aukastaf og uppsöfnuð villa með miklum fjölda aðgerða. Þess vegna eru öll verð sett fram á eftirfarandi MoneyValue sniðiVið erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.

sviðigerðLýsing
gjaldmiðilstrengurStrengur ISO gjaldmiðilskóði
einingarint64Heiltala hluti summu, getur verið neikvæð tala
nanóint32Hluti af upphæðinni getur verið neikvæð tala

Við vinnum þær sérstaklega og færum þær síðan í verðgildi:

quotation.units + quotation.nano / 1e9

Kostnaður við framtíðarsamninga

Verð á framtíðarsamningum er sett fram í punktum, þegar þú ert með framtíðargjaldmiðil þarftu að vita gengi. Og auðvitað verðið í punktum og verðþrepið. Þegar þú reiknar hagnað af viðskiptum, þetta getur skotið, því. ef þú reiknar heildarupphæðina með því að margfalda verðið með magninu. Hér þarf að fara varlega. Í bili sjáum við hvernig það fer. Þetta á við um framvirka gjaldeyri, annars staðar er allt í lagi með þetta.Við erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.Við erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.

OTC markaður

Þessi markaður hefur mikið af sérkennum, svo við skulum rannsaka reksturinn á honum sérstaklega.Þegar þú byrjar að samstilla aðgerðir kemur í ljós að þú þarft að koma figi / ticker í sama form til að passa við hljóðfærið rétt. Þegar þú byrjar að samstilla þetta við miðlunarskýrsluna kemur í ljós að tradeID sömu færslu hefur stafi í upphafi í viðskiptunum og þeir eru ekki í miðlunarskýrslunni. Þess vegna er ekki hægt að bera þá saman … ahem-ahem … til samanburðar! Ég passaði við viðskiptatíma, auðkenni og samsvarandi að eitt tradeId er að finna í öðru. Rétt, ég veit það ekki. Hver sem lendir í þessu og er sama um það, komdu að málinu eða byrjaðu á nýju.Við erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.

Stærðfræðilegar aðgerðir á verkfærum

Það er ómögulegt, án þess að skoða, að framkvæma stærðfræðilegar aðgerðir með öllum listanum. Til þess að bæta ekki heitu við mjúku athugum við alltaf gjaldmiðilinn og vinnum aðeins ef við erum viss um að gjaldmiðillinn passi og punktunum er breytt í þann gjaldmiðil sem óskað er eftir. Vopnaðir þekkingu um að vinna með bankanúmer munum við reikna út þóknunina sem varið er á hvern reikning. Eins og þetta: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4Við erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.   

Örþjónusta er tilbúin!

https://github.com/pskucherov/tcsstat Sem heimavinna er hægt að athuga hvort þjónustan virki með hægri tengingu, þegar tengingar eru rofnar, þegar internetið er aftengt, þegar villur eða útrunnið takmarkanir af hálfu miðlara. 

Niðurstöður og áætlanir um framtíðina

  • Lærði um grunnaðgerðir og vinnu með Invest API
  • Tími sem varið er ~ 10 klst
  • Erfiðleikastig ~ yngri+ / lág miðja 

Ef þú heldur áfram að betrumbæta örþjónustuna gætirðu endað með eitthvað eins og þetta

https://opexbot.info

  Þetta er þróun mín, fyrir þá sem eru of latir til að skilja, hlaupa og reikna á eigin spýtur. Ég ætla að bæta við greiningar þar að beiðni notenda. Ef þér líkaði við greinina skaltu gerast áskrifandi að símskeyti rásinni minni . Við erum að þróa örþjónustu sem notar Tinkoff Invest API til að gera sjálfvirkan miðlunarskýrslur og útreikning þóknunar.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Reply