md_api/
md_api.rs

1use ctp_rs::{MdApi, MdSpiMsg, ReqUserLoginField};
2use std::sync::{Arc, mpsc::channel};
3
4// for more fronts, see: http://www.openctp.cn/simenv.html
5const FRONT_ADDR: &str = "tcp://210.14.72.12:4602";
6const FLOW_PATH: &str = "MdFlow/";
7const INSTRUMENTS: &[&str] = &["au2509", "cu2509"];
8
9fn main() {
10    let (tx, rx) = channel();
11    let api = Arc::new(MdApi::CreateMdApiAndSpi(
12        tx,
13        FLOW_PATH.to_string(),
14        false,
15        false,
16        true,
17    ));
18    api.RegisterFront(FRONT_ADDR.to_string());
19    api.Init();
20
21    loop {
22        let msg = rx.recv().unwrap();
23        match msg {
24            MdSpiMsg::OnFrontConnected => {
25                println!("front connected");
26                let mut req = ReqUserLoginField::default();
27                req.BrokerID = "".to_string();
28                req.UserID = "".to_string();
29                req.Password = "".to_string();
30                api.ReqUserLogin(req, 0);
31            }
32            MdSpiMsg::OnRspUserLogin(_, rsp_info, _, _) => {
33                if rsp_info.ErrorID != 0 {
34                    println!("user login failed: {:?}", rsp_info);
35                    continue;
36                } else {
37                    println!("user login success: {:?}", rsp_info);
38                    let instruments: Vec<String> =
39                        INSTRUMENTS.iter().map(|&s| s.to_string()).collect();
40                    let len = instruments.len() as i32;
41                    api.SubscribeMarketData(instruments, len);
42                }
43            }
44            MdSpiMsg::OnRtnDepthMarketData(tick) => {
45                println!("{:?}", tick);
46            }
47            _ => {}
48        }
49    }
50}