Tinkoff Investments için istatistik hizmetinin geliştirilmesinin ardındaki ilham kaynakları şunlardı:
- Habré hakkında makale “Tinkoff Investments ne demiyor”
- platform kullanıcılarının isteklerinin analizi
- komisyonların hesaplanması hakkında bir makale .
- Ne tartışılacak?
- Adım adım bir istatistik hizmeti geliştirmek:
- Tinkoff Invest API’ye bağlantı
- Bir tarayıcıda Tinkoff Invest API’sinden veri çizme
- Aracılık raporlarının ve işlemlerinin alınması
- GetBrokerRaporu
- Geçerli tarihten çıkarma dikkate alınarak tarihi alma yöntemi
- Rapor oluşturma isteği
- Sonuç:
- Temettü AlYabancı İhraççı
- GetOperationsByCursor
- İlgili bilgilerin hesaplanması ve çıktısı
- Fiyatlarla çalışma
- vadeli işlem sözleşmelerinin maliyeti
- OTC pazarı
- Araçlar üzerinde matematiksel işlemler
- Mikro hizmet hazır!
- Sonuçlar ve gelecek için planlar
- https://opexbot.info
Ne tartışılacak?
- Geliştirme ile ilgili sadece uygulamalı kısım.
- Finansal araçlarla çalışırken çok önemli olan gerçek bilgi ve deneyim.
- Üzerinde çalışılacak konulara genel bakış
Bu yüzden ticaret istatistiklerini hesaplamak ve bunu uygun bir şekilde yapmak istiyorum.
Adım adım bir istatistik hizmeti geliştirmek:
- Tinkoff Invest API’ye bağlantı
- Bir tarayıcıda Tinkoff Invest API’sinden veri çizme
- Aracılık raporlarının ve işlemlerinin alınması
- İlgili bilgilerin hesaplanması ve çıktısı
- Sonuçlar ve gelecek için planlar
Tinkoff Invest API’ye bağlantı
API’ye bağlanmak için https://github.com/Tinkoff/investAPI#sdk belgelerindeki herhangi bir sdk’yi alabilirsiniz . Veya ” tinkoff-sdk-grpc-js ” npm paketi. Paketin geliştiriciler tarafından en son sürüme güncellenmesi önemlidir. Düzenlemek
npm ve tinkoff-sdk-grpc-js
Kontrol etme
const { createSdk } = gerekli(‘tinkoff-sdk-grpc-js’); // Bu şekilde elde edilebilecek jeton const TOKEN = ‘YOURAPI’; // TCS günlüklerinde bulunabileceğiniz uygulamanın adı. const uygulamaAdı = ‘tcsstat’; const sdk = createSdk(TOKEN, uygulamaAdı); (eşzamansız () => { console.log(bekliyor sdk.users.getAccounts()); })();
Sonuç: konsolda hesaplarınızın bir listesi görüntülenecektir. Örneğin, nüansları inceleyelim:
- Hesap listesinde, API kullanarak çalışamayacağınız bir “Yatırım bankası” var.
- Lütfen alanların camelCase’de geldiğini, belgelerde ise bu alanların under_score’da sunulduğunu unutmayın.
- Her yerde böyle olacak, yani bir alanı belgelerden alıp kopyalayamazsınız.
Kullanışlı:
- Bu kodu proje dalında bulabilirsiniz.
https://github.com/pskucherov/tcsstat/tree/step1 https://github.com/pskucherov/tcsstat/compare/step1
Bir tarayıcıda Tinkoff Invest API’sinden veri çizme
next.js ve socket.io’yu aldım. Bu güçlü bir öneri değil, kendi takdirinize bağlı olarak seçin.
npx create-next-app@latest npm i socket.io socket.io-client
Hemen next+socket+investapi arkadaşlık adımına geçiyoruz ve tüm detaylar için bu adımın Faydalı kısmına bakıyoruz. Ayrıntıları anlatacağım:
- Nodejs (sunucu) tarafında bir page/api/investapi.js dosyası bulunmaktadır. Burası socket.io sunucusunu oluşturduğumuz ve Investapi’ye bağlandığımız yer.
- Tarayıcı (istemci) tarafında ise bir soket üzerinden sunucuya bağlanıyoruz ve komisyoncudan hesap verilerini talep ediyoruz.
- Sunucudaki aracıdan veri alıyoruz, ardından müşteriye gönderiyoruz. İstemciye alındıklarında, tarayıcıda görüntülenirler.
Sonuç: tarayıcı konsolunda hesaplar hakkındaki bilgileri görebiliriz. Yani son adımda sunucu konsolundaki (nodejs) hesaplar hakkında bilgi gördük, şu anki adımda ise bu bilgiyi istemciye (tarayıcıya) aktardık.
Şimdi tarayıcıdan bir hesap seçebilmeniz için yapalım ve belirteç yoksa konsola bir hata gönderilir. İş basit ve yeni bir şey değil, bu yüzden sadece taahhütlere bağlantılar veriyorum
- https://github.com/pskucherov/tcsstat/commit/7e1ac57061e5e971588479015b06d8814d6609a9
- https://github.com/pskucherov/tcsstat/commit/b28ac973a57494f5232589b4cb6b9fb13b8af759
Kullanışlı:
- Sırada nasıl arkadaş olunacağı ve soket burada ayrıntılı olarak anlatılıyor .
- Arkadaşlık kodu next+socket+investapi:
https://github.com/pskucherov/tcsstat/commit/a443a4ac1bb4f0aa898f638128755fe7391ee381 Kimler için zor, o zaman bu aşamada kalıyor ve kodla ilgileniyoruz. Sorularınız varsa – sorun. https://github.com/pskucherov/tcsstat/tree/step2 https://github.com/pskucherov/tcsstat/compare/step1…step2
Aracılık raporlarının ve işlemlerinin alınması
Aracılık raporlarını ve işlemlerini almanın üç yöntemi vardır.
En başından beri bilmek önemlidir:
- Aracılık raporu T-3 modunda oluşturulur, örn. işlemler, fiilen yürütüldükten sonra orada görüntülenir.
- Buna göre son iki gün için bu raporu talep ederseniz üç gün içinde hazır olacaktır.
- Son günlerin işlemlerini almak için, işlem alma yöntemini kullanıyoruz, ancak aracılık raporu oluşturulduktan sonra kimliklerinin ve içeriklerinin değişebileceğini unutmayın.
GetBrokerRaporu
Aracılık raporu almak için hesap numarası, raporun başlangıç tarihi ve bitiş tarihini almanız gerekiyor ama 31 günü geçmemek şartıyla. API’ye bir rapor oluşturmak için _broker_report_request oluşturmak için bir istek gönderiyoruz , yanıt olarak bir görev kimliği alıyoruz. Bundan sonra, bu taskId’yi kullanarak get _broker_report_response’den veri alıyoruz .
- Tam olarak bu tarihler için TaskID’yi sonsuza kadar kaydetmeniz gerekir.
- Çünkü kaybederseniz, o zaman talep edilen tarihler için rapor ilk önce üretim talebine cevap olarak gelir,
- Ve sonra hiç gelmeyecek.
Geçerli tarihten çıkarma dikkate alınarak tarihi alma yöntemi
const getDateSubDay = (subDay = 5, start = true) => { const tarih = yeni Tarih(); date.setUTCDate(date.getUTCDate() – subDay); if (başlangıç) { tarih.setUTCHours(0, 0, 0, 0); } başka { tarih.setUTCHours(23, 59, 59, 999); } dönüş tarihi; };
Rapor oluşturma isteği
const brokerReport = wait (sdk.operations.getBrokerReport)({ buildBrokerReportRequest: { accountId, from, to, }, });
Sonuç:
- Komutun ilk çalıştırılmasının bir sonucu olarak, taskId’yi alırız.
- Rapor, komisyoncu tarafında oluşturulmaya başlar. Hazır olduğu bilinmediğinde, raporun beklentisiyle görev kimliğini bekler ve periyodik olarak çekeriz.
- Neden? Çünkü rapor hazır değilse error veriyor. Rapor komisyoncu tarafında hazır değilse, bu sizin kodunuzdaki bir hatadır. Lütfen işleyin: 30058|INVALID_ARGUMENT|görev henüz tamamlanmadı, lütfen daha sonra tekrar deneyin
Rapor bekleme ve alma kodu şuna benzer.
const zamanlayıcı = zaman uyumsuz zaman => { yeni söz ver(çözümle => setTimeout(çözümle, zaman)); } const getBrokerResponseByTaskId = zaman uyumsuz (taskId, page = 0) => { try { dönüş bekliyor (sdk.operations.getBrokerReport)({ getBrokerReportRequest: { taskId, page, }, }); } catch (e) { console.log(‘bekle’, e); bekleme zamanlayıcısı(10000); return wait getBrokerResponseByTaskId(taskId, page); } };
Sonra aynı sihir gerçekleşir. Komut dosyamızı durdurur, yeniden başlatırız, bir görev kimliğimiz yoktur. Kodu taskId isteğiyle çalıştırıyoruz, ancak artık taskId’yi değil, hemen raporu alıyoruz. Büyü! Ve her zaman böyle olsaydı her şey yoluna girecekti. Ancak bir ay içinde hiç veri olmayacak. Faydalı :
- Burada ve burada biraz teori özetlenmiştir .
- Kodu bir araya getirdiğinizde, taslak buna benzer bir şey olacaktır.
https://github.com/pskucherov/tcsstat/tree/step3.1 https://github.com/pskucherov/tcsstat/compare/step3.1
- Birisi bununla karşılaşırsa, soruna hoş geldiniz . Bu büyüyü onardıktan sonra gücünü kaybedecek ve bir şekilde farklı olacak. Ancak şu anda (21.03.2023) aynen böyle çalışıyor.
Temettü AlYabancı İhraççı
Birisi, yöntemin bir öncekine benzer olduğunu düşünebilir ve yalnızca işlemlerin adını değiştirdiğiniz tek bir yöntem kullanabilirsiniz. Ama tahmin edemediler! Oradaki adlandırma hem yöntemlerde hem de döndürülen bilgilerde çok farklıdır. Ve sayfa sayısı 0’dan sonra 1’den başlıyor. Tüm bunlarda kafanızın karışmaması için iki farklı yöntem yazmak daha kolay. Bu garip, çünkü işin mantığı aynıdır. Bir yöntem yapmaya çalıştığımda ve daha az kod olduğunda uzun süre tükürdüm. Burada hiçbir örnek olmayacak.
GetOperationsByCursor
Üçü arasında favorim. En doğru olmasa da, en uygun olanı. Bir hesap oluşturmanın başlangıcından mümkün olan maksimum tarihe kadar (bir hesabın veya mevcut hesabın kapatılması) talepte bulunuruz. Cevabı alıyoruz, imleci alıyoruz ve veri olduğu sürece yeniden talep ediyoruz. Ve kod, yukarıdaki örneklerde olduğundan daha özlüdür.
const zamanlayıcı = zaman uyumsuz zaman => { yeni söz ver(çözümle => setTimeout(çözümle, zaman)); } const getOperationsByCursor = async (sdk, accountId, from, to, imleç = ”) => { try { const reqData = { accountId, from, to, limit: 1000, state: sdk.OperationState.OPERATION_STATE_EXECUTED, withoutCommissions: false, olmadanTicaret: false, olmadanOvernights: false, imleç, }; dönüş bekliyor sdk.operations.getOperationsByCursor(reqData); } catch (e) { bekleme zamanlayıcısı(60000); return wait getOperationsByCursor(sdk, accountId, from, to, imleç = ”); } };
Çalıştırılacak taslak burada: https://github.com/pskucherov/tcsstat/tree/step3.3 https://github.com/pskucherov/tcsstat/compare/step3.3 Artık alma işlemlerini eklemeye hazırız. bizim uygulamamız. Doğru yapılırsa, hesabın tüm varlığı için aracılık raporları almanız gerekir. Ve kayıp veriler için, aynı T-3’ler operasyonlardan yeniden yüklenir. Ancak bu ayrı bir makaleye ayrılabilir. Karşılaşacağınız ana nüanslardan biri yapıştırma işlemleri ve aracılık raporudur.
- Bugün bir aracılık raporu ve gerekli tarihler için işlemler aldıysanız, hepsini veritabanına koyun, o zaman sorun olmaz.
- Yarın, rapor ve işlemlerden sonraki veri bölümünü aldığınızda ve bunları mevcut veritabanıyla senkronize etmeye karar verdiğinizde sorunlarla karşılaşacaksınız.
- İşlemden sonra eşleşmeyen veya değişen kimlikle ilgili birçok nüans
- O zaman OTC pazarı için kimlikler hiç uyuşmuyor.
- API’nin özellikleri nedeniyle yine çakışmayan senkronizasyon araçlarının nüanslarının yanı sıra. Ama bu başka bir hikaye.
İşlemler hakkında bilgi almayı uygulamamıza ekleyelim. Asıl soru, verilerin nerede işleneceği ve saklanacağı olacaktır.
- Kendiniz için yaparsanız, aynı verileri farklı cihazlardan tüketirsiniz. Ardından verileri sunucuda işlemeniz ve depolamanız gerekir.
- Birçok farklı kullanıcı tarafından tüketilen çok sayıda farklı veriye sahipseniz, neyin daha önemli olduğuna karar vermeniz gerekir: kullanıcıların hızı veya sizin tarafınızdaki demir tasarrufu. Sınırsız miktarda donanıma gücü yeten kişi, sunucusundaki her şeyi sayar ve kullanıcılar için süper hızlı hale getirerek, telefonlarda çok önemli olan pil ve trafik gibi kullanıcı kaynaklarından tasarruf sağlar.
Buna karşılık, tarayıcıda saymak prensipte en uygun çözüm değildir. Bu nedenle pahalı olmayanı sunucumuzda değerlendiriyoruz. Gerisini müşteriye bırakıyoruz. Sunucudaki komisyonu gerçekten almak ve hesaplamak istiyorum. Ama burada “etkileşim” denen nüans geliyor. Diyelim ki binlerce işleminiz var ve bunları almak beş dakika sürüyor. Kullanıcının şu anda elinde ne olacak? Döndürücü mü? İlerlemek? Ne kadarının yüklendiği hakkında bilgi? İşlemdeki kullanıcı zaten bir şey görebildiğinde “aktif bekleme”yi kullanmak idealdir. İşte Sonuç:
- sayfa yükleme
- Tüm faturalar isteniyor
- Bundan sonra yapılan işlemler için komisyonlu tüm işlemler tüm hesaplar için talep edilir. Veriler alındıkça, tarayıcıda işlenir.
Etkinliklerdeki verileri her seferinde filtrelememek için her hesap için kendi etkinliğimizi çekiyoruz. Bunun gibi:
socket.emit(‘sdk:getOperationsCommissionResult_’ + accountId, { öğeler: data?.items, inProgress: Boolean(nextCursor), });
Başlatılacak taslak burada: https://github.com/pskucherov/tcsstat/tree/step3 https://github.com/pskucherov/tcsstat/compare/step2…step3 Devam ediyor. Bu satırı okumuş olman harika!
İlgili bilgilerin hesaplanması ve çıktısı
Kimin hangi bilgiye ihtiyacı olduğuna bağlı. Bu nedenle, karşılaşacağınız ana nüansları hemen size söylüyorum.
Fiyatlarla çalışma
Para işlemlerinin sadece tam sayılarla yapılması gerektiğini finans ile çalışan herkes bilir. Ondalık noktadan sonraki değerlerin yanlışlığı ve çok sayıda işlemle kümülatif hata nedeniyle. Bu nedenle tüm fiyatlar aşağıdaki MoneyValue formatında sunulmaktadır.
alan | tip | Tanım |
---|---|---|
para birimi | sicim | Dize ISO para birimi kodu |
birimler | int64 | Toplamın tamsayı kısmı, negatif bir sayı olabilir |
nano | int32 | Tutarın kesirli kısmı, negatif bir sayı olabilir |
Bunları ayrı ayrı işliyoruz, ardından fiyat değerine getiriyoruz:
alıntı.birimler + alıntı.nano / 1e9
vadeli işlem sözleşmelerinin maliyeti
Vadeli işlemlerin fiyatı puan olarak sunulur, bir döviz geleceğiniz olduğunda, oranı bilmeniz gerekir. Ve tabii ki puan cinsinden fiyat ve fiyat adımı. İşlemlerden elde edilen kârı hesapladığınızda bu ateş edebilir çünkü. fiyatı miktar ile çarparak toplam tutarı hesaplarsanız. Burada dikkatli olmalısın. Şimdilik, nasıl gittiğini göreceğiz. Bu, döviz vadeli işlemleri için geçerlidir, diğer yerlerde bununla ilgili her şey yolundadır.
OTC pazarı
Bu piyasanın pek çok özelliği var, bu yüzden işlemleri ayrı ayrı inceleyelim Senkronize işlemlere başladığınızda, enstrümanı doğru eşleştirmek için figi / ticker’ı aynı forma getirmeniz gerektiği ortaya çıkacaktır. Bunu aracılık raporu ile senkronize etmeye başladığınızda aynı işlemin tradeID’sinin işlemlerde başında harfler olduğu ve bunların aracılık raporunda olmadığı ortaya çıkacaktır. Bu nedenle karşılaştırılamazlar … ahem-ahem … kıyaslanarak! Bir tradeId’in diğerinde bulunan ticaret zamanını, senedini ve eşleşmesini eşleştirdim. Doğru, bilmiyorum. Bununla kim karşılaşıyorsa ve kimin umurundaysa, konuya gelin ya da yeni bir tane başlatın.
Araçlar üzerinde matematiksel işlemler
Bakmadan tüm listeyle matematiksel işlemler yapmak mümkün değil. Soft’a ılık eklememek için, her zaman para birimini kontrol ederiz ve yalnızca para biriminin eşleştiğinden emin olduğumuzda işlem yaparız ve puanlar istenen para birimine dönüştürülür. Banka numaralarıyla çalışma hakkında bilgi sahibi olarak, hesapların her biri için harcanan komisyonu hesaplayacağız. Bunun gibi: https://github.com/pskucherov/tcsstat/tree/step4 https://github.com/pskucherov/tcsstat/compare/step3…step4
Mikro hizmet hazır!
https://github.com/pskucherov/tcsstat Ödev olarak, hizmetin yavaş bir bağlantıyla çalışıp çalışmadığını, bağlantıların ne zaman kesildiğini, İnternet bağlantısının ne zaman kesildiğini, komisyoncu tarafında hatalar veya limitlerin dolduğunu kontrol edebilirsiniz.
Sonuçlar ve gelecek için planlar
- Temel işlemler ve Invest API ile çalışma hakkında bilgi edinildi
- Harcanan süre ~ 10 saat
- Zorluk seviyesi ~ junior+ / düşük orta
Mikro hizmeti iyileştirmeye devam ederseniz, bunun gibi bir şeyle karşılaşabilirsiniz.
https://opexbot.info
Bu benim gelişimim, kendi başına anlamak, koşmak ve saymak için çok tembel olanlar için. Kullanıcıların isteği üzerine oraya analitik eklemeyi planlıyorum. Makaleyi beğendiyseniz, telegram kanalıma abone olun .
Полезная статья. Не могу представить, сколько усилий автора потребовалось, чтобы все описать. Благодарю.