Skip to content

Commit 6bbecb7

Browse files
committed
fix #298
1 parent d998219 commit 6bbecb7

4 files changed

Lines changed: 61 additions & 57 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
# [3.0.13] 2025-08-22
8+
9+
- fix [#298](https://github.com/longportapp/openapi/issues/298)
10+
711
# [3.0.12] 2025-08-08
812

913
- add `trade_session` for query all session intraday.

rust/crates/candlesticks/src/market.rs

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,10 @@ impl Market {
129129
{
130130
use Period::*;
131131

132-
assert!(ts.is_intraday() || (!ts.is_intraday() && period.is_minute()));
132+
if !ts.is_intraday() && !period.is_minute() {
133+
return None;
134+
}
135+
133136
let ts = ts.kind();
134137

135138
let t = t.to_timezone(self.timezone);
@@ -212,7 +215,6 @@ impl Market {
212215
{
213216
let trade_session = trade.trade_session();
214217

215-
debug_assert!(period != Period::Day);
216218
if let Some(input_trade_session) = input.as_ref().map(|c| c.trade_session()) {
217219
debug_assert!(input_trade_session == trade_session);
218220
}
@@ -308,36 +310,24 @@ impl Market {
308310
}
309311

310312
#[must_use]
311-
pub fn merge_quote_day<H, TS, C, Q, P, V, R>(
312-
&self,
313-
half_days: H,
314-
period: Period,
315-
input: Option<C>,
316-
quote: &Q,
317-
) -> UpdateAction<C>
313+
pub fn merge_quote_day<TS, C, Q, P, V, R>(&self, input: Option<C>, quote: &Q) -> UpdateAction<C>
318314
where
319-
H: Days,
320315
TS: TradeSessionType + Eq,
321316
C: CandlestickType<PriceType = P, VolumeType = V, TurnoverType = R, TradeSessionType = TS>,
322317
Q: QuoteType<PriceType = P, VolumeType = V, TurnoverType = R, TradeSessionType = TS>,
323318
{
324-
debug_assert_eq!(period, Period::Day);
325-
326319
let trade_session = quote.trade_session();
327320

321+
if !trade_session.is_intraday() {
322+
return UpdateAction::None;
323+
}
324+
328325
if let Some(input_trade_session) = input.as_ref().map(|c| c.trade_session()) {
329326
debug_assert!(input_trade_session == trade_session);
330327
}
331328

332329
let tz = self.timezone;
333-
let Some(time) = self.candlestick_time(
334-
trade_session,
335-
half_days,
336-
period,
337-
quote.time().to_timezone(tz),
338-
) else {
339-
return UpdateAction::None;
340-
};
330+
let time = quote.time().to_timezone(tz).replace_time(Time::MIDNIGHT);
341331

342332
match input {
343333
Some(prev) if time == prev.time() => {

rust/src/quote/core.rs

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{
55

66
use comfy_table::Table;
77
use itertools::Itertools;
8-
use longport_candlesticks::UpdateAction;
8+
use longport_candlesticks::{TradeSessionType, UpdateAction};
99
use longport_httpcli::HttpClient;
1010
use longport_proto::quote::{
1111
self, AdjustType, MarketTradeDayRequest, MarketTradeDayResponse, MultiSecurityRequest, Period,
@@ -839,16 +839,13 @@ impl Core {
839839
let half_days = self.trading_days.half_days(market_type);
840840

841841
for (period, candlesticks) in &mut security_data.candlesticks {
842-
let mtype = merge_type(security_data.board, push_quote.trade_session, *period);
842+
let Some(mtype) = merge_type(security_data.board, push_quote.trade_session, *period)
843+
else {
844+
continue;
845+
};
843846

844847
let action = if mtype == MergeType::QuoteDay {
845-
Some(candlesticks.merge_quote_day(
846-
market_type,
847-
half_days,
848-
security_data.board,
849-
*period,
850-
push_quote,
851-
))
848+
Some(candlesticks.merge_quote_day(market_type, security_data.board, push_quote))
852849
} else if mtype == MergeType::Quote {
853850
Some(candlesticks.merge_quote(
854851
market_type,
@@ -887,7 +884,8 @@ impl Core {
887884

888885
for trade in &push_trades.trades {
889886
for (period, candlesticks) in &mut security_data.candlesticks {
890-
if merge_type(security_data.board, trade.trade_session, *period) != MergeType::Trade
887+
if merge_type(security_data.board, trade.trade_session, *period)
888+
!= Some(MergeType::Trade)
891889
{
892890
continue;
893891
}
@@ -1042,12 +1040,20 @@ enum MergeType {
10421040
Quote,
10431041
}
10441042

1045-
fn merge_type(board: SecurityBoard, trade_session: TradeSession, period: Period) -> MergeType {
1043+
fn merge_type(
1044+
board: SecurityBoard,
1045+
trade_session: TradeSession,
1046+
period: Period,
1047+
) -> Option<MergeType> {
10461048
use Period::*;
10471049
use SecurityBoard::*;
10481050
use TradeSession::*;
10491051

1050-
match (board, trade_session, period) {
1052+
if !trade_session.is_intraday() && period >= Day {
1053+
return None;
1054+
}
1055+
1056+
Some(match (board, trade_session, period) {
10511057
(USDJI | USNSDQ | USSector | HKHS | HKSector | CNIX | CNSector | STI | SGSector, _, _) => {
10521058
if period == Day && trade_session == Intraday {
10531059
MergeType::QuoteDay
@@ -1057,7 +1063,7 @@ fn merge_type(board: SecurityBoard, trade_session: TradeSession, period: Period)
10571063
}
10581064
(_, _, Day) if trade_session == Intraday => MergeType::QuoteDay,
10591065
_ => MergeType::Trade,
1060-
}
1066+
})
10611067
}
10621068

10631069
async fn fetch_trading_days(cli: &WsClient) -> Result<TradingDays> {
@@ -1217,18 +1223,30 @@ mod tests {
12171223
use SecurityBoard::*;
12181224
use TradeSession::*;
12191225

1220-
assert_eq!(merge_type(USDJI, Intraday, Day), MergeType::QuoteDay);
1221-
assert_eq!(merge_type(USDJI, Overnight, Day), MergeType::Quote);
1222-
assert_eq!(merge_type(USDJI, Intraday, OneMinute), MergeType::Quote);
1223-
assert_eq!(merge_type(USDJI, Overnight, OneMinute), MergeType::Quote);
1224-
assert_eq!(merge_type(USDJI, Intraday, Week), MergeType::Quote);
1225-
assert_eq!(merge_type(USDJI, Overnight, Week), MergeType::Quote);
1226-
1227-
assert_eq!(merge_type(USMain, Intraday, Day), MergeType::QuoteDay);
1228-
assert_eq!(merge_type(USMain, Overnight, Day), MergeType::Trade);
1229-
assert_eq!(merge_type(USMain, Intraday, OneMinute), MergeType::Trade);
1230-
assert_eq!(merge_type(USMain, Intraday, OneMinute), MergeType::Trade);
1231-
assert_eq!(merge_type(USMain, Overnight, Week), MergeType::Trade);
1232-
assert_eq!(merge_type(USMain, Overnight, Week), MergeType::Trade);
1226+
assert_eq!(merge_type(USDJI, Intraday, Day), Some(MergeType::QuoteDay));
1227+
assert_eq!(merge_type(USDJI, Overnight, Day), None);
1228+
assert_eq!(
1229+
merge_type(USDJI, Intraday, OneMinute),
1230+
Some(MergeType::Quote)
1231+
);
1232+
assert_eq!(
1233+
merge_type(USDJI, Overnight, OneMinute),
1234+
Some(MergeType::Quote)
1235+
);
1236+
assert_eq!(merge_type(USDJI, Intraday, Week), Some(MergeType::Quote));
1237+
assert_eq!(merge_type(USDJI, Overnight, Week), None);
1238+
1239+
assert_eq!(merge_type(USMain, Intraday, Day), Some(MergeType::QuoteDay));
1240+
assert_eq!(merge_type(USMain, Overnight, Day), None);
1241+
assert_eq!(
1242+
merge_type(USMain, Intraday, OneMinute),
1243+
Some(MergeType::Trade)
1244+
);
1245+
assert_eq!(
1246+
merge_type(USMain, Overnight, OneMinute),
1247+
Some(MergeType::Trade)
1248+
);
1249+
assert_eq!(merge_type(USMain, Intraday, Week), Some(MergeType::Trade));
1250+
assert_eq!(merge_type(USMain, Overnight, Week), None);
12331251
}
12341252
}

rust/src/quote/store.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -138,25 +138,17 @@ impl Candlesticks {
138138
)
139139
}
140140

141-
pub(crate) fn merge_quote_day<H>(
141+
pub(crate) fn merge_quote_day(
142142
&mut self,
143143
market_type: Market,
144-
half_days: H,
145144
board: SecurityBoard,
146-
period: Period,
147145
push_quote: &PushQuote,
148-
) -> UpdateAction<Candlestick>
149-
where
150-
H: Days,
151-
{
152-
debug_assert!(period == Period::Day);
153-
146+
) -> UpdateAction<Candlestick> {
154147
let Some(market) = get_market(market_type, board) else {
155148
return UpdateAction::None;
156149
};
157150
let ts = push_quote.trade_session;
158-
let period = convert_period(period);
159-
market.merge_quote_day(half_days, period, self.merge_input(ts), push_quote)
151+
market.merge_quote_day(self.merge_input(ts), push_quote)
160152
}
161153

162154
pub(crate) fn merge_quote<H>(

0 commit comments

Comments
 (0)