Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API’yi kullanan bir mikro hizmet geliştiriyoruz.

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

Tinkoff Investments için istatistik hizmetinin geliştirilmesinin ardındaki ilham kaynakları şunlardı:

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: 

  1. Tinkoff Invest API’ye bağlantı
  2. Bir tarayıcıda Tinkoff Invest API’sinden veri çizme
  3. Aracılık raporlarının ve işlemlerinin alınması
  4. İlgili bilgilerin hesaplanması ve çıktısı
  5. 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:Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API'yi kullanan bir mikro hizmet geliştiriyoruz.

  • 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.

Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API'yi kullanan bir mikro hizmet geliştiriyoruz.

Ş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

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

Kullanışlı:

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.

  1. GetBrokerRaporu
  2. Temettü AlYabancı İhraççı
  3. GetOperationsByCursor

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 .

Dokümantasyon diyor ki, gerçekte nüanslar var. Ellerinize dikkat edin:

  • 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.
Hadi kod yazmaya başlayalım

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ç:Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API'yi kullanan bir mikro hizmet geliştiriyoruz.

  • 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.Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API'yi kullanan bir mikro hizmet geliştiriyoruz.

alantipTanım
para birimisicimDize ISO para birimi kodu
birimlerint64Toplamın tamsayı kısmı, negatif bir sayı olabilir
nanoint32Tutarı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.Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API'yi kullanan bir mikro hizmet geliştiriyoruz.Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API'yi kullanan bir mikro hizmet geliştiriyoruz.

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.Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API'yi kullanan bir mikro hizmet geliştiriyoruz.

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…step4Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API'yi kullanan bir mikro hizmet geliştiriyoruz.   

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 . Komisyon raporlarıyla çalışmayı ve komisyonları hesaplamayı otomatikleştirmek için Tinkoff Invest API'yi kullanan bir mikro hizmet geliştiriyoruz.

Pavel
Rate author
Add a comment

  1. Isakiiev

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

    Yanıtla