#investing #invest #tinkoff #t-bank #tbank

yatis

Yet Another T-bank Investment Sdk

7 releases

new 0.1.1 Mar 13, 2025
0.1.0 Mar 9, 2025
0.0.5 Mar 9, 2025

#130 in Finance

Download history 254/week @ 2025-02-26 483/week @ 2025-03-05

737 downloads per month

Apache-2.0

6MB
1.5K SLoC

JavaScript 869 SLoC // 0.0% comments Rust 783 SLoC // 0.0% comments Shell 38 SLoC // 0.1% comments

YATIS - Yet Another TBank Investment Sdk

Usage

use yatis::*;
use t_types::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let token = std::env::var("SANDBOX_TOKEN").expect("need to set env var 'TOKEN'");
    let api = Api::create_invest_service(token)?; //creating api
    //let api = SandboxApi::create_invest_service(token)?; //or sandbox api
    trading(api).await
}
async fn trading(api: impl InvestApi) -> Result<(), Box<dyn std::error::Error>> {
    // You can execute unary requests:
    let share: ShareResponse = api.request(InstrumentRequest{ //use native types from investAPI
        id_type:InstrumentIdType::Ticker.into(),
        class_code:Some("TQBR".to_string()),
        id:"T".to_string()
    }).await?;
    println!("T: {share:?}\n");
    let figi = "TCS80A107UL4".to_string(); //T-Techno shares

    // Or create streams:
    let (s, mut r) = futures::channel::mpsc::channel::<StreamResponse>(10);
    api.start_stream(MarketDataServerSideStreamRequest {
        subscribe_last_price_request: Some(SubscribeLastPriceRequest {
            subscription_action: SubscriptionAction::Subscribe.into(),
            instruments: vec![LastPriceInstrument {figi,..Default::default()}],
            ..Default::default()
        }),
        ping_settings: Some(PingDelaySettings {ping_delay_ms: Some(5000)}), //used by yatis to detect hung connections
        subscribe_candles_request: None, subscribe_order_book_request: None, subscribe_trades_request: None, subscribe_info_request: None,
    }, s).await?;
    use futures::StreamExt;
    if let Some(response) = r.next().await { //or while instead of if
        println!("{response:?}");
    }

    Ok(())
}

Targets

  • more usability
  • easy to use any types of generated proto of investAPI
  • ability to create your own implementation of common traits, like InvestService, OwnedSender and StartStream
  • easy to use pool objects

Goals

  • Investing api implementation
  • Single api trait for all operations InvestApi
  • Unary operations (all)
  • Pool of reusable connections
  • Sandbox API with polymorphism (see examples)
  • Server side streams (all)
    • Authomatic reconnect on stucked connections
    • Resubscribtion on reconnect
    • Connections limitation by tariff
  • Bidirecional streams
    • Balanced pool of streams
    • Authomatic reconnect on stucked connections
    • Resubscribtion on reconnect
  • Arithmetic opertions with Quotation

Dependencies

~14–23MB
~418K SLoC