Skip to main content

futu_qot/
basic_qot.rs

1use futu_core::error::{FutuError, Result};
2use futu_core::proto_id;
3use futu_net::client::FutuClient;
4
5use crate::types::{BasicQot, Security};
6
7/// 获取基本行情
8///
9/// 查询指定股票的实时基本报价数据。
10/// 需要先通过 `subscribe` 订阅 SubType::Basic 类型。
11pub async fn get_basic_qot(client: &FutuClient, securities: &[Security]) -> Result<Vec<BasicQot>> {
12    let req = futu_proto::qot_get_basic_qot::Request {
13        c2s: futu_proto::qot_get_basic_qot::C2s {
14            security_list: securities.iter().map(|s| s.to_proto()).collect(),
15            header: None,
16        },
17    };
18
19    let body = prost::Message::encode_to_vec(&req);
20    let resp_frame = client.request(proto_id::QOT_GET_BASIC_QOT, body).await?;
21
22    let resp: futu_proto::qot_get_basic_qot::Response =
23        prost::Message::decode(resp_frame.body.as_ref()).map_err(FutuError::Proto)?;
24
25    if resp.ret_type != 0 {
26        return Err(FutuError::ServerError {
27            ret_type: resp.ret_type,
28            msg: resp.ret_msg.unwrap_or_default(),
29        });
30    }
31
32    let s2c = resp
33        .s2c
34        .ok_or(FutuError::Codec("missing s2c in GetBasicQot".into()))?;
35
36    Ok(s2c
37        .basic_qot_list
38        .iter()
39        .map(BasicQot::from_proto)
40        .collect())
41}