Innblásendurnir á bak við þróun tölfræðiþjónustunnar fyrir Tinkoff Investments voru:
- grein um Habré „Það sem Tinkoff Investments are not saying“
- greiningu á óskum vettvangsnotenda
- grein um útreikning þóknunar .
- Hvað verður rætt?
- Þróa tölfræðiþjónustu skref fyrir skref:
- Tenging við Tinkoff Invest API
- Teikning gagna frá Tinkoff Invest API í vafra
- Tekið á móti miðlunarskýrslum og viðskiptum
- GetBrokerReport
- Aðferð til að fá dagsetningu, að teknu tilliti til frádráttar frá núverandi dagsetningu
- Beiðni um skýrslugerð
- Niðurstaða:
- Fáðu arð Erlendur útgefandi
- Get OperationsByCursor
- Útreikningur og framleiðsla á áhugaverðum upplýsingum
- Vinna með verð
- Kostnaður við framtíðarsamninga
- OTC markaður
- Stærðfræðilegar aðgerðir á verkfærum
- Örþjónusta er tilbúin!
- Niðurstöður og áætlanir um framtíðina
- https://opexbot.info
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:
- Tenging við Tinkoff Invest API
- Teikning gagna frá Tinkoff Invest API í vafra
- Tekið á móti miðlunarskýrslum og viðskiptum
- Útreikningur og framleiðsla á áhugaverðum upplýsingum
- 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:
- Í 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).
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
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- 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
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.
- Þú þ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.
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:
- 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ði
sviði | gerð | Lýsing |
---|---|---|
gjaldmiðil | strengur | Strengur ISO gjaldmiðilskóði |
einingar | int64 | Heiltala hluti summu, getur verið neikvæð tala |
nanó | int32 | Hluti 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.
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.
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…step4
Ö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 .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.