futu_rest/routes/
qot.rs

1//! 行情 REST API 路由
2//!
3//! 所有行情相关接口通过 proto_request 适配到现有 handler。
4
5use axum::extract::{Json, State};
6use axum::http::StatusCode;
7use serde_json::Value;
8
9use futu_core::proto_id;
10use futu_proto::qot_get_basic_qot;
11use futu_proto::qot_get_broker;
12use futu_proto::qot_get_capital_distribution;
13use futu_proto::qot_get_capital_flow;
14use futu_proto::qot_get_future_info;
15use futu_proto::qot_get_ipo_list;
16use futu_proto::qot_get_kl;
17use futu_proto::qot_get_market_state;
18use futu_proto::qot_get_option_chain;
19use futu_proto::qot_get_order_book;
20use futu_proto::qot_get_owner_plate;
21use futu_proto::qot_get_plate_security;
22use futu_proto::qot_get_plate_set;
23use futu_proto::qot_get_reference;
24use futu_proto::qot_get_rt;
25use futu_proto::qot_get_security_snapshot;
26use futu_proto::qot_get_static_info;
27use futu_proto::qot_get_sub_info;
28use futu_proto::qot_get_ticker;
29use futu_proto::qot_get_user_security;
30use futu_proto::qot_get_warrant;
31use futu_proto::qot_request_history_kl;
32use futu_proto::qot_stock_filter;
33use futu_proto::qot_sub;
34
35use crate::adapter::{self, RestState};
36
37type ApiResult = Result<Json<Value>, (StatusCode, Json<Value>)>;
38
39/// POST /api/subscribe — 订阅/退订行情
40pub async fn subscribe(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
41    adapter::proto_request::<qot_sub::Request, qot_sub::Response>(
42        &state,
43        proto_id::QOT_SUB,
44        Some(body),
45    )
46    .await
47}
48
49/// GET /api/sub-info — 查询当前订阅
50pub async fn get_sub_info(State(state): State<RestState>) -> ApiResult {
51    adapter::proto_request::<qot_get_sub_info::Request, qot_get_sub_info::Response>(
52        &state,
53        proto_id::QOT_GET_SUB_INFO,
54        None,
55    )
56    .await
57}
58
59/// POST /api/quote — 获取实时报价
60pub async fn get_basic_qot(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
61    adapter::proto_request::<qot_get_basic_qot::Request, qot_get_basic_qot::Response>(
62        &state,
63        proto_id::QOT_GET_BASIC_QOT,
64        Some(body),
65    )
66    .await
67}
68
69/// POST /api/kline — 获取K线数据
70pub async fn get_kl(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
71    adapter::proto_request::<qot_get_kl::Request, qot_get_kl::Response>(
72        &state,
73        proto_id::QOT_GET_KL,
74        Some(body),
75    )
76    .await
77}
78
79/// POST /api/orderbook — 获取摆盘
80pub async fn get_order_book(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
81    adapter::proto_request::<qot_get_order_book::Request, qot_get_order_book::Response>(
82        &state,
83        proto_id::QOT_GET_ORDER_BOOK,
84        Some(body),
85    )
86    .await
87}
88
89/// POST /api/broker — 获取经纪队列
90pub async fn get_broker(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
91    adapter::proto_request::<qot_get_broker::Request, qot_get_broker::Response>(
92        &state,
93        proto_id::QOT_GET_BROKER,
94        Some(body),
95    )
96    .await
97}
98
99/// POST /api/ticker — 获取逐笔
100pub async fn get_ticker(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
101    adapter::proto_request::<qot_get_ticker::Request, qot_get_ticker::Response>(
102        &state,
103        proto_id::QOT_GET_TICKER,
104        Some(body),
105    )
106    .await
107}
108
109/// POST /api/rt — 获取分时数据
110pub async fn get_rt(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
111    adapter::proto_request::<qot_get_rt::Request, qot_get_rt::Response>(
112        &state,
113        proto_id::QOT_GET_RT,
114        Some(body),
115    )
116    .await
117}
118
119/// POST /api/snapshot — 获取快照
120pub async fn get_snapshot(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
121    adapter::proto_request::<qot_get_security_snapshot::Request, qot_get_security_snapshot::Response>(
122        &state, proto_id::QOT_GET_SECURITY_SNAPSHOT, Some(body),
123    ).await
124}
125
126/// POST /api/static-info — 获取静态信息
127pub async fn get_static_info(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
128    adapter::proto_request::<qot_get_static_info::Request, qot_get_static_info::Response>(
129        &state,
130        proto_id::QOT_GET_STATIC_INFO,
131        Some(body),
132    )
133    .await
134}
135
136/// POST /api/plate-set — 获取板块集合
137pub async fn get_plate_set(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
138    adapter::proto_request::<qot_get_plate_set::Request, qot_get_plate_set::Response>(
139        &state,
140        proto_id::QOT_GET_PLATE_SET,
141        Some(body),
142    )
143    .await
144}
145
146/// POST /api/plate-security — 获取板块内股票
147pub async fn get_plate_security(
148    State(state): State<RestState>,
149    Json(body): Json<Value>,
150) -> ApiResult {
151    adapter::proto_request::<qot_get_plate_security::Request, qot_get_plate_security::Response>(
152        &state,
153        proto_id::QOT_GET_PLATE_SECURITY,
154        Some(body),
155    )
156    .await
157}
158
159/// POST /api/reference — 获取关联数据
160pub async fn get_reference(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
161    adapter::proto_request::<qot_get_reference::Request, qot_get_reference::Response>(
162        &state,
163        proto_id::QOT_GET_REFERENCE,
164        Some(body),
165    )
166    .await
167}
168
169/// POST /api/owner-plate — 获取所属板块
170pub async fn get_owner_plate(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
171    adapter::proto_request::<qot_get_owner_plate::Request, qot_get_owner_plate::Response>(
172        &state,
173        proto_id::QOT_GET_OWNER_PLATE,
174        Some(body),
175    )
176    .await
177}
178
179/// POST /api/option-chain — 获取期权链
180pub async fn get_option_chain(
181    State(state): State<RestState>,
182    Json(body): Json<Value>,
183) -> ApiResult {
184    adapter::proto_request::<qot_get_option_chain::Request, qot_get_option_chain::Response>(
185        &state,
186        proto_id::QOT_GET_OPTION_CHAIN,
187        Some(body),
188    )
189    .await
190}
191
192/// POST /api/warrant — 获取窝轮
193pub async fn get_warrant(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
194    adapter::proto_request::<qot_get_warrant::Request, qot_get_warrant::Response>(
195        &state,
196        proto_id::QOT_GET_WARRANT,
197        Some(body),
198    )
199    .await
200}
201
202/// POST /api/capital-flow — 获取资金流向
203pub async fn get_capital_flow(
204    State(state): State<RestState>,
205    Json(body): Json<Value>,
206) -> ApiResult {
207    adapter::proto_request::<qot_get_capital_flow::Request, qot_get_capital_flow::Response>(
208        &state,
209        proto_id::QOT_GET_CAPITAL_FLOW,
210        Some(body),
211    )
212    .await
213}
214
215/// POST /api/capital-distribution — 获取资金分布
216pub async fn get_capital_distribution(
217    State(state): State<RestState>,
218    Json(body): Json<Value>,
219) -> ApiResult {
220    adapter::proto_request::<
221        qot_get_capital_distribution::Request,
222        qot_get_capital_distribution::Response,
223    >(&state, proto_id::QOT_GET_CAPITAL_DISTRIBUTION, Some(body))
224    .await
225}
226
227/// POST /api/user-security — 获取自选股
228pub async fn get_user_security(
229    State(state): State<RestState>,
230    Json(body): Json<Value>,
231) -> ApiResult {
232    adapter::proto_request::<qot_get_user_security::Request, qot_get_user_security::Response>(
233        &state,
234        proto_id::QOT_GET_USER_SECURITY,
235        Some(body),
236    )
237    .await
238}
239
240/// POST /api/stock-filter — 条件选股
241pub async fn stock_filter(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
242    adapter::proto_request::<qot_stock_filter::Request, qot_stock_filter::Response>(
243        &state,
244        proto_id::QOT_STOCK_FILTER,
245        Some(body),
246    )
247    .await
248}
249
250/// POST /api/ipo-list — 获取IPO列表
251pub async fn get_ipo_list(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
252    adapter::proto_request::<qot_get_ipo_list::Request, qot_get_ipo_list::Response>(
253        &state,
254        proto_id::QOT_GET_IPO_LIST,
255        Some(body),
256    )
257    .await
258}
259
260/// POST /api/future-info — 获取期货信息
261pub async fn get_future_info(State(state): State<RestState>, Json(body): Json<Value>) -> ApiResult {
262    adapter::proto_request::<qot_get_future_info::Request, qot_get_future_info::Response>(
263        &state,
264        proto_id::QOT_GET_FUTURE_INFO,
265        Some(body),
266    )
267    .await
268}
269
270/// POST /api/market-state — 获取市场状态
271pub async fn get_market_state(
272    State(state): State<RestState>,
273    Json(body): Json<Value>,
274) -> ApiResult {
275    adapter::proto_request::<qot_get_market_state::Request, qot_get_market_state::Response>(
276        &state,
277        proto_id::QOT_GET_MARKET_STATE,
278        Some(body),
279    )
280    .await
281}
282
283/// POST /api/history-kline — 请求历史K线
284pub async fn request_history_kl(
285    State(state): State<RestState>,
286    Json(body): Json<Value>,
287) -> ApiResult {
288    adapter::proto_request::<qot_request_history_kl::Request, qot_request_history_kl::Response>(
289        &state,
290        proto_id::QOT_REQUEST_HISTORY_KL,
291        Some(body),
292    )
293    .await
294}