@@ -35,76 +35,81 @@ pub enum TradeStatus {
3535 UNKNOWN = -1 ,
3636 /// Quote is not registered
3737 NO_REGISTER_QUOTE = 0 ,
38- /// Clearing
38+ /// Clearing before the market opens.
3939 CLEAN = 101 ,
40- /// Opening auction
40+ /// Opening auction.
4141 OPEN_BID = 102 ,
42- /// Morning break, currently used by VIX indexes
42+ /// Morning break, currently used by VIX indexes.
4343 MORNING_CLOSING = 103 ,
44- /// Trading
44+ /// Regular trading.
4545 TRADING = 105 ,
46- /// Midday break
46+ /// Midday break.
4747 NOON_CLOSING = 106 ,
48- /// Closing auction
48+ /// Closing auction.
4949 CLOSE_BID = 107 ,
50- /// Closed
50+ /// Market closed.
5151 CLOSING = 108 ,
52- /// Dark pool waiting to open
52+ /// Dark trading waiting to open.
5353 DARK_WAIT = 110 ,
54- /// Dark pool trading
54+ /// Dark trading.
5555 DARK_TRADING = 111 ,
56- /// Dark pool closed
56+ /// Dark trading closed.
5757 DARK_CLOSING = 112 ,
58- /// After-hours fixed-price trading
58+ /// After-hours fixed-price trading.
5959 AFTER_FIX = 120 ,
60- /// Half-day market closed
60+ /// Half-day market closed. Defined by the market status table but currently
61+ /// unused.
6162 HALF_CLOSING = 121 ,
62- /// Not opened
63+ /// Not opened because the exchange is waiting to open under special
64+ /// conditions.
6365 NOT_OPENED = 122 ,
64- /// Realtime quotes
66+ /// Temporary intraday break. The historical variant name is kept for
67+ /// compatibility.
6568 REALTIME_QUOTE = 123 ,
66- /// US pre-market
69+ /// US pre-market.
6770 US_PREV = 201 ,
68- /// US regular trading
71+ /// US regular trading.
6972 US_TRADING = 202 ,
70- /// US post-market
73+ /// US post-market.
7174 US_AFTER = 203 ,
72- /// US closed
75+ /// US closed.
7376 US_CLOSING = 204 ,
74- /// US halted
77+ /// US halted.
7578 US_STOP = 205 ,
76- /// US clearing before pre-market
79+ /// US clearing plus pre-market.
7780 US_CLEAN = 206 ,
78- /// US overnight trading
81+ /// US overnight trading.
7982 US_NIGHT = 207 ,
80- /// US pre-market clearing
83+ /// US pre-market clearing alias returned by the quote engine.
8184 US_PREV_MARKET_CLEAN = 209 ,
82- /// US post-market clearing
85+ /// US post-market clearing alias returned by the quote engine.
8386 US_AFTER_MARKET_CLEAN = 210 ,
84- /// Stock refresh
87+ /// Stock refresh. Deprecated in the status definition.
8588 REFRESH = 1000 ,
86- /// Delisted
89+ /// Delisted.
8790 DELIST = 1001 ,
88- /// Preparing to list
91+ /// Preparing to list.
8992 PREPARE = 1002 ,
90- /// Code changed
93+ /// Code changed.
9194 CODE_CHANGE = 1003 ,
92- /// Halted
95+ /// Halted.
9396 STOP = 1004 ,
94- /// Waiting to open
97+ /// Waiting to open, typically for a US IPO auction.
9598 WILL_OPEN = 1005 ,
96- /// Split or merge suspended
99+ /// Split or merge suspended.
97100 COMMON_SUSPEND = 1006 ,
98- /// Expired
101+ /// Expired.
99102 EXPIRE = 1007 ,
100- /// No quote
103+ /// No quote data.
101104 NO_QUOTE = 1008 ,
102- /// Not listed
105+ /// Not listed. The historical variant name is kept for compatibility.
103106 UNITED = 1009 ,
104- /// Trading halted
107+ /// Terminated trading, usually for warrants.
105108 TRADING_HALT = 1010 ,
106- /// Waiting to list
109+ /// Waiting to list, usually for new warrants.
107110 WAIT_LISTING = 1011 ,
111+ /// Fuse.
112+ FUSE = 2001 ,
108113}
109114
110115impl From < i32 > for TradeStatus {
@@ -165,7 +170,7 @@ impl TradeStatus {
165170 TradeStatus :: DARK_CLOSING => "Closing" ,
166171 TradeStatus :: AFTER_FIX => "After Fix" ,
167172 TradeStatus :: NOT_OPENED => "Not Open" ,
168- TradeStatus :: REALTIME_QUOTE => "Realtime Quotes " ,
173+ TradeStatus :: REALTIME_QUOTE => "Temporary Break " ,
169174 TradeStatus :: US_PREV | TradeStatus :: US_CLEAN => "Pre-Market" ,
170175 TradeStatus :: US_AFTER => "Post-Market" ,
171176 TradeStatus :: US_STOP | TradeStatus :: STOP => "Stop" ,
@@ -178,9 +183,10 @@ impl TradeStatus {
178183 TradeStatus :: COMMON_SUSPEND => "Common Suspend" ,
179184 TradeStatus :: EXPIRE => "Expire" ,
180185 TradeStatus :: NO_QUOTE => "No Quote" ,
181- TradeStatus :: UNITED => "United " ,
182- TradeStatus :: TRADING_HALT => "Trading Halt " ,
186+ TradeStatus :: UNITED => "Not Listed " ,
187+ TradeStatus :: TRADING_HALT => "Terminated " ,
183188 TradeStatus :: WAIT_LISTING => "Wait Listing" ,
189+ TradeStatus :: FUSE => "Fuse" ,
184190 }
185191 }
186192
@@ -288,11 +294,12 @@ pub struct MarketStatusResponse {
288294pub struct MarketTimeItem {
289295 /// Market code
290296 pub market : Market ,
291- /// Trade status
297+ /// Market trade status. See [`TradeStatus`] for the code table.
292298 pub trade_status : TradeStatus ,
293299 /// Current market time (unix timestamp string)
294300 pub timestamp : String ,
295- /// Delayed-quote trade status
301+ /// Delayed-quote market trade status. See [`TradeStatus`] for the code
302+ /// table.
296303 pub delay_trade_status : TradeStatus ,
297304 /// Delayed-quote market time (unix timestamp string)
298305 pub delay_timestamp : String ,
@@ -360,10 +367,11 @@ mod tests {
360367 let cases = [
361368 ( TradeStatus :: MORNING_CLOSING , "Morning Break" ) ,
362369 ( TradeStatus :: NOON_CLOSING , "Mid-Day Break" ) ,
363- ( TradeStatus :: REALTIME_QUOTE , "Realtime Quotes " ) ,
370+ ( TradeStatus :: REALTIME_QUOTE , "Temporary Break " ) ,
364371 ( TradeStatus :: US_STOP , "Stop" ) ,
365- ( TradeStatus :: TRADING_HALT , "Trading Halt " ) ,
372+ ( TradeStatus :: TRADING_HALT , "Terminated " ) ,
366373 ( TradeStatus :: WAIT_LISTING , "Wait Listing" ) ,
374+ ( TradeStatus :: FUSE , "Fuse" ) ,
367375 ( TradeStatus :: UNKNOWN , "Unknown" ) ,
368376 ( TradeStatus :: NO_REGISTER_QUOTE , "Unknown" ) ,
369377 ] ;
@@ -373,6 +381,37 @@ mod tests {
373381 }
374382 }
375383
384+ #[ test]
385+ fn market_trade_status_codes_match_phase_definition_document ( ) {
386+ let codes = [
387+ 101 , 102 , 103 , 105 , 106 , 107 , 108 , 110 , 111 , 112 , 120 , 121 , 122 , 123 , 201 , 202 , 203 ,
388+ 204 , 206 , 207 , 1000 , 1001 , 1002 , 1003 , 1004 , 1005 , 1006 , 1007 , 1008 , 1009 , 1010 , 1011 ,
389+ 2001 ,
390+ ] ;
391+
392+ for code in codes {
393+ assert_eq ! ( TradeStatus :: from( code) . code( ) , code, "status code {code}" ) ;
394+ }
395+ }
396+
397+ #[ test]
398+ fn market_trade_status_names_match_phase_definition_document ( ) {
399+ let cases = [
400+ ( 123 , "Temporary Break" ) ,
401+ ( 1009 , "Not Listed" ) ,
402+ ( 1010 , "Terminated" ) ,
403+ ( 2001 , "Fuse" ) ,
404+ ] ;
405+
406+ for ( code, expected) in cases {
407+ assert_eq ! (
408+ TradeStatus :: from( code) . name( ) ,
409+ expected,
410+ "status code {code}"
411+ ) ;
412+ }
413+ }
414+
376415 #[ test]
377416 fn market_time_item_uses_market_trade_status_type ( ) {
378417 let item = serde_json:: from_str :: < crate :: market:: MarketTimeItem > (
0 commit comments