td_api/
td_api.rs

1use ctp_rs::{
2    QryInstrumentField, ReqAuthenticateField, ReqUserLoginField, THOST_TE_RESUME_TYPE, TraderApi,
3    TraderSpiMsg,
4};
5use std::sync::{Arc, mpsc::channel};
6
7const BROKER_ID: &str = "...";
8const USER_ID: &str = "...";
9const PASSWORD: &str = "...";
10const APP_ID: &str = "...";
11const AUTH_CODE: &str = "...";
12const FRONT_ADDR: &str = "...";
13const FLOW_PATH: &str = "TraderFlow/";
14
15fn main() {
16    let (tx, rx) = channel();
17    let api = Arc::new(TraderApi::CreateTraderApiAndSpi(
18        tx,
19        FLOW_PATH.to_string(),
20        true,
21    ));
22    api.RegisterFront(FRONT_ADDR.to_string());
23    api.SubscribePublicTopic(THOST_TE_RESUME_TYPE::THOST_TERT_QUICK as i32);
24    api.SubscribePrivateTopic(THOST_TE_RESUME_TYPE::THOST_TERT_RESTART as i32);
25    api.Init();
26
27    loop {
28        let msg = rx.recv().unwrap();
29        match msg {
30            TraderSpiMsg::OnFrontConnected => {
31                println!("front connected");
32                let req = ReqAuthenticateField {
33                    BrokerID: BROKER_ID.to_string(),
34                    UserID: USER_ID.to_string(),
35                    AuthCode: AUTH_CODE.to_string(),
36                    AppID: APP_ID.to_string(),
37                    ..Default::default()
38                };
39                api.ReqAuthenticate(req, 0);
40            }
41            TraderSpiMsg::OnRspAuthenticate(_, rsp_info, _, _) => {
42                if rsp_info.ErrorID != 0 {
43                    println!("auth failed: {:?}", rsp_info);
44                    std::process::exit(1);
45                } else {
46                    println!("auth success: {:?}", rsp_info);
47
48                    let req = ReqUserLoginField {
49                        BrokerID: BROKER_ID.to_string(),
50                        UserID: USER_ID.to_string(),
51                        Password: PASSWORD.to_string(),
52                        ..Default::default()
53                    };
54                    api.ReqUserLogin(req, 0);
55                }
56            }
57            TraderSpiMsg::OnRspUserLogin(_, rsp_info, _, _) => {
58                if rsp_info.ErrorID != 0 {
59                    println!("user login failed: {:?}", rsp_info);
60                    std::process::exit(1);
61                } else {
62                    println!("user login success: {:?}", rsp_info);
63
64                    api.ReqQryInstrument(QryInstrumentField::default(), 0);
65                }
66            }
67            TraderSpiMsg::OnRspQryInstrument(instrument, rsp_info, _, _) => {
68                if instrument.is_null {
69                    eprintln!("qry instrument: {:?}", rsp_info);
70                    std::process::exit(1);
71                }
72
73                println!("{:?}", instrument);
74            }
75            _ => {}
76        }
77    }
78}