PyAlgoEngine 0.12.3__cp315-cp315-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. algo_engine/__infra__.pxd +3 -0
  2. algo_engine/__init__.pxd +3 -0
  3. algo_engine/__init__.py +107 -0
  4. algo_engine/apps/__init__.py +17 -0
  5. algo_engine/apps/backtest/__init__.py +20 -0
  6. algo_engine/apps/backtest/doc_server.py +328 -0
  7. algo_engine/apps/backtest/static/styles/dash.css +48 -0
  8. algo_engine/apps/backtest/templates/dash.html +20 -0
  9. algo_engine/apps/backtest/templates/index.html +40 -0
  10. algo_engine/apps/backtest/tester.py +252 -0
  11. algo_engine/apps/backtest/web_app.py +125 -0
  12. algo_engine/apps/bokeh_server.py +245 -0
  13. algo_engine/apps/demo/__init__.py +0 -0
  14. algo_engine/apps/demo/test.py +40 -0
  15. algo_engine/apps/sim_input/__init__.py +23 -0
  16. algo_engine/apps/sim_input/client.py +412 -0
  17. algo_engine/apps/sim_input/sim_keyboard.py +88 -0
  18. algo_engine/apps/sim_input/sim_mouse.py +137 -0
  19. algo_engine/apps/sim_input/window.py +162 -0
  20. algo_engine/backtest/__init__.py +19 -0
  21. algo_engine/backtest/__main__.py +51 -0
  22. algo_engine/backtest/metrics.py +179 -0
  23. algo_engine/backtest/replay.py +635 -0
  24. algo_engine/backtest/sim_match.py +506 -0
  25. algo_engine/base/__infra__.pxd +3 -0
  26. algo_engine/base/__init__.pxd +3 -0
  27. algo_engine/base/__init__.py +60 -0
  28. algo_engine/base/c_allocator_protocol.c +11608 -0
  29. algo_engine/base/c_allocator_protocol.cp315-win_amd64.pyd +0 -0
  30. algo_engine/base/c_allocator_protocol.pxd +24 -0
  31. algo_engine/base/c_allocator_protocol.pyi +68 -0
  32. algo_engine/base/c_allocator_protocol.pyx +111 -0
  33. algo_engine/base/c_intern_string.c +5908 -0
  34. algo_engine/base/c_intern_string.cp315-win_amd64.pyd +0 -0
  35. algo_engine/base/c_intern_string.pxd +14 -0
  36. algo_engine/base/c_intern_string.pyi +22 -0
  37. algo_engine/base/c_intern_string.pyx +17 -0
  38. algo_engine/base/c_market_data/__infra__.pxd +196 -0
  39. algo_engine/base/c_market_data/__init__.pxd +196 -0
  40. algo_engine/base/c_market_data/__init__.py +24 -0
  41. algo_engine/base/c_market_data/c_candlestick.c +18996 -0
  42. algo_engine/base/c_market_data/c_candlestick.cp315-win_amd64.pyd +0 -0
  43. algo_engine/base/c_market_data/c_candlestick.pxd +27 -0
  44. algo_engine/base/c_market_data/c_candlestick.pyi +217 -0
  45. algo_engine/base/c_market_data/c_candlestick.pyx +255 -0
  46. algo_engine/base/c_market_data/c_internal.c +14059 -0
  47. algo_engine/base/c_market_data/c_internal.cp315-win_amd64.pyd +0 -0
  48. algo_engine/base/c_market_data/c_internal.pxd +14 -0
  49. algo_engine/base/c_market_data/c_internal.pyi +47 -0
  50. algo_engine/base/c_market_data/c_internal.pyx +41 -0
  51. algo_engine/base/c_market_data/c_market_data.c +30420 -0
  52. algo_engine/base/c_market_data/c_market_data.cp315-win_amd64.pyd +0 -0
  53. algo_engine/base/c_market_data/c_market_data.h +1464 -0
  54. algo_engine/base/c_market_data/c_market_data.pxd +414 -0
  55. algo_engine/base/c_market_data/c_market_data.pyi +550 -0
  56. algo_engine/base/c_market_data/c_market_data.pyx +701 -0
  57. algo_engine/base/c_market_data/c_market_data_buffer.c +29407 -0
  58. algo_engine/base/c_market_data/c_market_data_buffer.cp315-win_amd64.pyd +0 -0
  59. algo_engine/base/c_market_data/c_market_data_buffer.h +941 -0
  60. algo_engine/base/c_market_data/c_market_data_buffer.pxd +143 -0
  61. algo_engine/base/c_market_data/c_market_data_buffer.pyi +355 -0
  62. algo_engine/base/c_market_data/c_market_data_buffer.pyx +571 -0
  63. algo_engine/base/c_market_data/c_market_data_config.h +29 -0
  64. algo_engine/base/c_market_data/c_tick.c +44303 -0
  65. algo_engine/base/c_market_data/c_tick.cp315-win_amd64.pyd +0 -0
  66. algo_engine/base/c_market_data/c_tick.pxd +53 -0
  67. algo_engine/base/c_market_data/c_tick.pyi +466 -0
  68. algo_engine/base/c_market_data/c_tick.pyx +673 -0
  69. algo_engine/base/c_market_data/c_trade_utils.c +28702 -0
  70. algo_engine/base/c_market_data/c_trade_utils.cp315-win_amd64.pyd +0 -0
  71. algo_engine/base/c_market_data/c_trade_utils.pxd +53 -0
  72. algo_engine/base/c_market_data/c_trade_utils.pyi +602 -0
  73. algo_engine/base/c_market_data/c_trade_utils.pyx +609 -0
  74. algo_engine/base/c_market_data/c_transaction.c +23558 -0
  75. algo_engine/base/c_market_data/c_transaction.cp315-win_amd64.pyd +0 -0
  76. algo_engine/base/c_market_data/c_transaction.pxd +27 -0
  77. algo_engine/base/c_market_data/c_transaction.pyi +433 -0
  78. algo_engine/base/c_market_data/c_transaction.pyx +460 -0
  79. algo_engine/base/console_utils.py +1070 -0
  80. algo_engine/base/finance_decimal.py +258 -0
  81. algo_engine/base/telemetrics.py +18 -0
  82. algo_engine/engine/__infra__.pxd +10 -0
  83. algo_engine/engine/__init__.pxd +10 -0
  84. algo_engine/engine/__init__.py +40 -0
  85. algo_engine/engine/algo_engine.py +904 -0
  86. algo_engine/engine/c_event_engine.c +16325 -0
  87. algo_engine/engine/c_event_engine.cp315-win_amd64.pyd +0 -0
  88. algo_engine/engine/c_event_engine.pxd +25 -0
  89. algo_engine/engine/c_event_engine.pyi +68 -0
  90. algo_engine/engine/c_market_engine.c +24258 -0
  91. algo_engine/engine/c_market_engine.cp315-win_amd64.pyd +0 -0
  92. algo_engine/engine/c_market_engine.pxd +87 -0
  93. algo_engine/engine/c_market_engine.pyi +357 -0
  94. algo_engine/engine/event_engine.py +53 -0
  95. algo_engine/engine/trade_engine.py +2037 -0
  96. algo_engine/exchange_profile/__infra__.pxd +100 -0
  97. algo_engine/exchange_profile/__init__.pxd +100 -0
  98. algo_engine/exchange_profile/__init__.py +53 -0
  99. algo_engine/exchange_profile/c_ex_profile_base.c +87 -0
  100. algo_engine/exchange_profile/c_ex_profile_base.h +1204 -0
  101. algo_engine/exchange_profile/c_ex_profile_cn.c +968 -0
  102. algo_engine/exchange_profile/c_ex_profile_cn.h +39 -0
  103. algo_engine/exchange_profile/c_exchange_profile.c +52375 -0
  104. algo_engine/exchange_profile/c_exchange_profile.cp315-win_amd64.pyd +0 -0
  105. algo_engine/exchange_profile/c_exchange_profile.pxd +336 -0
  106. algo_engine/exchange_profile/c_exchange_profile.pyi +883 -0
  107. algo_engine/exchange_profile/c_exchange_profile.pyx +1495 -0
  108. algo_engine/exchange_profile/c_profile_cn.c +7798 -0
  109. algo_engine/exchange_profile/c_profile_cn.cp315-win_amd64.pyd +0 -0
  110. algo_engine/exchange_profile/c_profile_cn.pxd +1 -0
  111. algo_engine/exchange_profile/c_profile_cn.pyi +3 -0
  112. algo_engine/exchange_profile/c_profile_cn.pyx +1 -0
  113. algo_engine/exchange_profile/c_profile_default.c +7798 -0
  114. algo_engine/exchange_profile/c_profile_default.cp315-win_amd64.pyd +0 -0
  115. algo_engine/exchange_profile/c_profile_default.pxd +1 -0
  116. algo_engine/exchange_profile/c_profile_default.pyi +3 -0
  117. algo_engine/exchange_profile/c_profile_default.pyx +1 -0
  118. algo_engine/exchange_profile/c_profile_dispatcher.c +7798 -0
  119. algo_engine/exchange_profile/c_profile_dispatcher.cp315-win_amd64.pyd +0 -0
  120. algo_engine/exchange_profile/c_profile_dispatcher.pxd +1 -0
  121. algo_engine/exchange_profile/c_profile_dispatcher.pyi +3 -0
  122. algo_engine/exchange_profile/c_profile_dispatcher.pyx +1 -0
  123. algo_engine/includes/algo_engine/base/c_allocator_protocol.c +11608 -0
  124. algo_engine/includes/algo_engine/base/c_intern_string.c +5908 -0
  125. algo_engine/includes/algo_engine/base/c_market_data/c_candlestick.c +18996 -0
  126. algo_engine/includes/algo_engine/base/c_market_data/c_internal.c +14059 -0
  127. algo_engine/includes/algo_engine/base/c_market_data/c_market_data.c +30420 -0
  128. algo_engine/includes/algo_engine/base/c_market_data/c_market_data.h +1464 -0
  129. algo_engine/includes/algo_engine/base/c_market_data/c_market_data_buffer.c +29407 -0
  130. algo_engine/includes/algo_engine/base/c_market_data/c_market_data_buffer.h +941 -0
  131. algo_engine/includes/algo_engine/base/c_market_data/c_market_data_config.h +29 -0
  132. algo_engine/includes/algo_engine/base/c_market_data/c_tick.c +44303 -0
  133. algo_engine/includes/algo_engine/base/c_market_data/c_trade_utils.c +28702 -0
  134. algo_engine/includes/algo_engine/base/c_market_data/c_transaction.c +23558 -0
  135. algo_engine/includes/algo_engine/engine/c_event_engine.c +16325 -0
  136. algo_engine/includes/algo_engine/engine/c_market_engine.c +24258 -0
  137. algo_engine/includes/algo_engine/exchange_profile/c_ex_profile_base.c +87 -0
  138. algo_engine/includes/algo_engine/exchange_profile/c_ex_profile_base.h +1204 -0
  139. algo_engine/includes/algo_engine/exchange_profile/c_ex_profile_cn.c +968 -0
  140. algo_engine/includes/algo_engine/exchange_profile/c_ex_profile_cn.h +39 -0
  141. algo_engine/includes/algo_engine/exchange_profile/c_exchange_profile.c +52375 -0
  142. algo_engine/includes/algo_engine/exchange_profile/c_profile_cn.c +7798 -0
  143. algo_engine/includes/algo_engine/exchange_profile/c_profile_default.c +7798 -0
  144. algo_engine/includes/algo_engine/exchange_profile/c_profile_dispatcher.c +7798 -0
  145. algo_engine/monitor/__init__.py +15 -0
  146. algo_engine/monitor/advanced_data_interface.py +334 -0
  147. algo_engine/strategy/__init__.py +44 -0
  148. algo_engine/strategy/strategy_engine.py +441 -0
  149. algo_engine/utils/__init__.py +3 -0
  150. algo_engine/utils/commit_regularizer.py +49 -0
  151. algo_engine/utils/data_utils.py +296 -0
  152. pyalgoengine-0.12.3.dist-info/METADATA +142 -0
  153. pyalgoengine-0.12.3.dist-info/RECORD +156 -0
  154. pyalgoengine-0.12.3.dist-info/WHEEL +5 -0
  155. pyalgoengine-0.12.3.dist-info/licenses/LICENSE +21 -0
  156. pyalgoengine-0.12.3.dist-info/top_level.txt +2 -0
@@ -0,0 +1,968 @@
1
+ #include <algo_engine/exchange_profile/c_ex_profile_cn.h>
2
+
3
+ // ========== Pre-defined Calendar Events ==========
4
+
5
+ const session_date_t EX_PROFILE_CN_HOLIDAYS_PRECOMPUTED[] = {
6
+ {.year = 1991, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
7
+ {.year = 1991, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
8
+ {.year = 1991, .month = 2, .day = 18, .stype = SESSION_TYPE_NON_TRADING},
9
+ {.year = 1991, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
10
+ {.year = 1991, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
11
+ {.year = 1991, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
12
+ {.year = 1992, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
13
+ {.year = 1992, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
14
+ {.year = 1992, .month = 2, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
15
+ {.year = 1992, .month = 2, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
16
+ {.year = 1992, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
17
+ {.year = 1992, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
18
+ {.year = 1992, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
19
+ {.year = 1993, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
20
+ {.year = 1993, .month = 1, .day = 25, .stype = SESSION_TYPE_NON_TRADING},
21
+ {.year = 1993, .month = 1, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
22
+ {.year = 1993, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
23
+ {.year = 1994, .month = 2, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
24
+ {.year = 1994, .month = 2, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
25
+ {.year = 1994, .month = 2, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
26
+ {.year = 1994, .month = 2, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
27
+ {.year = 1994, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
28
+ {.year = 1994, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
29
+ {.year = 1994, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
30
+ {.year = 1994, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
31
+ {.year = 1995, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
32
+ {.year = 1995, .month = 1, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
33
+ {.year = 1995, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
34
+ {.year = 1995, .month = 2, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
35
+ {.year = 1995, .month = 2, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
36
+ {.year = 1995, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
37
+ {.year = 1995, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
38
+ {.year = 1995, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
39
+ {.year = 1995, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
40
+ {.year = 1996, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
41
+ {.year = 1996, .month = 2, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
42
+ {.year = 1996, .month = 2, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
43
+ {.year = 1996, .month = 2, .day = 21, .stype = SESSION_TYPE_NON_TRADING},
44
+ {.year = 1996, .month = 2, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
45
+ {.year = 1996, .month = 2, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
46
+ {.year = 1996, .month = 2, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
47
+ {.year = 1996, .month = 2, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
48
+ {.year = 1996, .month = 2, .day = 28, .stype = SESSION_TYPE_NON_TRADING},
49
+ {.year = 1996, .month = 2, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
50
+ {.year = 1996, .month = 3, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
51
+ {.year = 1996, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
52
+ {.year = 1996, .month = 9, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
53
+ {.year = 1996, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
54
+ {.year = 1996, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
55
+ {.year = 1997, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
56
+ {.year = 1997, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
57
+ {.year = 1997, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
58
+ {.year = 1997, .month = 2, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
59
+ {.year = 1997, .month = 2, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
60
+ {.year = 1997, .month = 2, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
61
+ {.year = 1997, .month = 2, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
62
+ {.year = 1997, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
63
+ {.year = 1997, .month = 2, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
64
+ {.year = 1997, .month = 2, .day = 13, .stype = SESSION_TYPE_NON_TRADING},
65
+ {.year = 1997, .month = 2, .day = 14, .stype = SESSION_TYPE_NON_TRADING},
66
+ {.year = 1997, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
67
+ {.year = 1997, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
68
+ {.year = 1997, .month = 6, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
69
+ {.year = 1997, .month = 7, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
70
+ {.year = 1997, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
71
+ {.year = 1997, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
72
+ {.year = 1997, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
73
+ {.year = 1998, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
74
+ {.year = 1998, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
75
+ {.year = 1998, .month = 1, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
76
+ {.year = 1998, .month = 1, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
77
+ {.year = 1998, .month = 1, .day = 28, .stype = SESSION_TYPE_NON_TRADING},
78
+ {.year = 1998, .month = 1, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
79
+ {.year = 1998, .month = 1, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
80
+ {.year = 1998, .month = 2, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
81
+ {.year = 1998, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
82
+ {.year = 1998, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
83
+ {.year = 1998, .month = 2, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
84
+ {.year = 1998, .month = 2, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
85
+ {.year = 1998, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
86
+ {.year = 1998, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
87
+ {.year = 1998, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
88
+ {.year = 1999, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
89
+ {.year = 1999, .month = 2, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
90
+ {.year = 1999, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
91
+ {.year = 1999, .month = 2, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
92
+ {.year = 1999, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
93
+ {.year = 1999, .month = 2, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
94
+ {.year = 1999, .month = 2, .day = 17, .stype = SESSION_TYPE_NON_TRADING},
95
+ {.year = 1999, .month = 2, .day = 18, .stype = SESSION_TYPE_NON_TRADING},
96
+ {.year = 1999, .month = 2, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
97
+ {.year = 1999, .month = 2, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
98
+ {.year = 1999, .month = 2, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
99
+ {.year = 1999, .month = 2, .day = 24, .stype = SESSION_TYPE_NON_TRADING},
100
+ {.year = 1999, .month = 2, .day = 25, .stype = SESSION_TYPE_NON_TRADING},
101
+ {.year = 1999, .month = 2, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
102
+ {.year = 1999, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
103
+ {.year = 1999, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
104
+ {.year = 1999, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
105
+ {.year = 1999, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
106
+ {.year = 1999, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
107
+ {.year = 1999, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
108
+ {.year = 1999, .month = 12, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
109
+ {.year = 1999, .month = 12, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
110
+ {.year = 2000, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
111
+ {.year = 2000, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
112
+ {.year = 2000, .month = 2, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
113
+ {.year = 2000, .month = 2, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
114
+ {.year = 2000, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
115
+ {.year = 2000, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
116
+ {.year = 2000, .month = 2, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
117
+ {.year = 2000, .month = 2, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
118
+ {.year = 2000, .month = 2, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
119
+ {.year = 2000, .month = 2, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
120
+ {.year = 2000, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
121
+ {.year = 2000, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
122
+ {.year = 2000, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
123
+ {.year = 2000, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
124
+ {.year = 2000, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
125
+ {.year = 2000, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
126
+ {.year = 2000, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
127
+ {.year = 2000, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
128
+ {.year = 2000, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
129
+ {.year = 2000, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
130
+ {.year = 2000, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
131
+ {.year = 2001, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
132
+ {.year = 2001, .month = 1, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
133
+ {.year = 2001, .month = 1, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
134
+ {.year = 2001, .month = 1, .day = 24, .stype = SESSION_TYPE_NON_TRADING},
135
+ {.year = 2001, .month = 1, .day = 25, .stype = SESSION_TYPE_NON_TRADING},
136
+ {.year = 2001, .month = 1, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
137
+ {.year = 2001, .month = 1, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
138
+ {.year = 2001, .month = 1, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
139
+ {.year = 2001, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
140
+ {.year = 2001, .month = 2, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
141
+ {.year = 2001, .month = 2, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
142
+ {.year = 2001, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
143
+ {.year = 2001, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
144
+ {.year = 2001, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
145
+ {.year = 2001, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
146
+ {.year = 2001, .month = 5, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
147
+ {.year = 2001, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
148
+ {.year = 2001, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
149
+ {.year = 2001, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
150
+ {.year = 2001, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
151
+ {.year = 2001, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
152
+ {.year = 2002, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
153
+ {.year = 2002, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
154
+ {.year = 2002, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
155
+ {.year = 2002, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
156
+ {.year = 2002, .month = 2, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
157
+ {.year = 2002, .month = 2, .day = 13, .stype = SESSION_TYPE_NON_TRADING},
158
+ {.year = 2002, .month = 2, .day = 14, .stype = SESSION_TYPE_NON_TRADING},
159
+ {.year = 2002, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
160
+ {.year = 2002, .month = 2, .day = 18, .stype = SESSION_TYPE_NON_TRADING},
161
+ {.year = 2002, .month = 2, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
162
+ {.year = 2002, .month = 2, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
163
+ {.year = 2002, .month = 2, .day = 21, .stype = SESSION_TYPE_NON_TRADING},
164
+ {.year = 2002, .month = 2, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
165
+ {.year = 2002, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
166
+ {.year = 2002, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
167
+ {.year = 2002, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
168
+ {.year = 2002, .month = 5, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
169
+ {.year = 2002, .month = 5, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
170
+ {.year = 2002, .month = 9, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
171
+ {.year = 2002, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
172
+ {.year = 2002, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
173
+ {.year = 2002, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
174
+ {.year = 2002, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
175
+ {.year = 2002, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
176
+ {.year = 2003, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
177
+ {.year = 2003, .month = 1, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
178
+ {.year = 2003, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
179
+ {.year = 2003, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
180
+ {.year = 2003, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
181
+ {.year = 2003, .month = 2, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
182
+ {.year = 2003, .month = 2, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
183
+ {.year = 2003, .month = 2, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
184
+ {.year = 2003, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
185
+ {.year = 2003, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
186
+ {.year = 2003, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
187
+ {.year = 2003, .month = 5, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
188
+ {.year = 2003, .month = 5, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
189
+ {.year = 2003, .month = 5, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
190
+ {.year = 2003, .month = 5, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
191
+ {.year = 2003, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
192
+ {.year = 2003, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
193
+ {.year = 2003, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
194
+ {.year = 2003, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
195
+ {.year = 2003, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
196
+ {.year = 2004, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
197
+ {.year = 2004, .month = 1, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
198
+ {.year = 2004, .month = 1, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
199
+ {.year = 2004, .month = 1, .day = 21, .stype = SESSION_TYPE_NON_TRADING},
200
+ {.year = 2004, .month = 1, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
201
+ {.year = 2004, .month = 1, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
202
+ {.year = 2004, .month = 1, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
203
+ {.year = 2004, .month = 1, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
204
+ {.year = 2004, .month = 1, .day = 28, .stype = SESSION_TYPE_NON_TRADING},
205
+ {.year = 2004, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
206
+ {.year = 2004, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
207
+ {.year = 2004, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
208
+ {.year = 2004, .month = 5, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
209
+ {.year = 2004, .month = 5, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
210
+ {.year = 2004, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
211
+ {.year = 2004, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
212
+ {.year = 2004, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
213
+ {.year = 2004, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
214
+ {.year = 2004, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
215
+ {.year = 2005, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
216
+ {.year = 2005, .month = 2, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
217
+ {.year = 2005, .month = 2, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
218
+ {.year = 2005, .month = 2, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
219
+ {.year = 2005, .month = 2, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
220
+ {.year = 2005, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
221
+ {.year = 2005, .month = 2, .day = 14, .stype = SESSION_TYPE_NON_TRADING},
222
+ {.year = 2005, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
223
+ {.year = 2005, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
224
+ {.year = 2005, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
225
+ {.year = 2005, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
226
+ {.year = 2005, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
227
+ {.year = 2005, .month = 5, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
228
+ {.year = 2005, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
229
+ {.year = 2005, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
230
+ {.year = 2005, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
231
+ {.year = 2005, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
232
+ {.year = 2005, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
233
+ {.year = 2006, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
234
+ {.year = 2006, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
235
+ {.year = 2006, .month = 1, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
236
+ {.year = 2006, .month = 1, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
237
+ {.year = 2006, .month = 1, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
238
+ {.year = 2006, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
239
+ {.year = 2006, .month = 2, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
240
+ {.year = 2006, .month = 2, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
241
+ {.year = 2006, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
242
+ {.year = 2006, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
243
+ {.year = 2006, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
244
+ {.year = 2006, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
245
+ {.year = 2006, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
246
+ {.year = 2006, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
247
+ {.year = 2006, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
248
+ {.year = 2006, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
249
+ {.year = 2006, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
250
+ {.year = 2006, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
251
+ {.year = 2006, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
252
+ {.year = 2007, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
253
+ {.year = 2007, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
254
+ {.year = 2007, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
255
+ {.year = 2007, .month = 2, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
256
+ {.year = 2007, .month = 2, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
257
+ {.year = 2007, .month = 2, .day = 21, .stype = SESSION_TYPE_NON_TRADING},
258
+ {.year = 2007, .month = 2, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
259
+ {.year = 2007, .month = 2, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
260
+ {.year = 2007, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
261
+ {.year = 2007, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
262
+ {.year = 2007, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
263
+ {.year = 2007, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
264
+ {.year = 2007, .month = 5, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
265
+ {.year = 2007, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
266
+ {.year = 2007, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
267
+ {.year = 2007, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
268
+ {.year = 2007, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
269
+ {.year = 2007, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
270
+ {.year = 2007, .month = 12, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
271
+ {.year = 2008, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
272
+ {.year = 2008, .month = 2, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
273
+ {.year = 2008, .month = 2, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
274
+ {.year = 2008, .month = 2, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
275
+ {.year = 2008, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
276
+ {.year = 2008, .month = 2, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
277
+ {.year = 2008, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
278
+ {.year = 2008, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
279
+ {.year = 2008, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
280
+ {.year = 2008, .month = 6, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
281
+ {.year = 2008, .month = 9, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
282
+ {.year = 2008, .month = 9, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
283
+ {.year = 2008, .month = 9, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
284
+ {.year = 2008, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
285
+ {.year = 2008, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
286
+ {.year = 2008, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
287
+ {.year = 2009, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
288
+ {.year = 2009, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
289
+ {.year = 2009, .month = 1, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
290
+ {.year = 2009, .month = 1, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
291
+ {.year = 2009, .month = 1, .day = 28, .stype = SESSION_TYPE_NON_TRADING},
292
+ {.year = 2009, .month = 1, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
293
+ {.year = 2009, .month = 1, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
294
+ {.year = 2009, .month = 4, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
295
+ {.year = 2009, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
296
+ {.year = 2009, .month = 5, .day = 28, .stype = SESSION_TYPE_NON_TRADING},
297
+ {.year = 2009, .month = 5, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
298
+ {.year = 2009, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
299
+ {.year = 2009, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
300
+ {.year = 2009, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
301
+ {.year = 2009, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
302
+ {.year = 2009, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
303
+ {.year = 2009, .month = 10, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
304
+ {.year = 2010, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
305
+ {.year = 2010, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
306
+ {.year = 2010, .month = 2, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
307
+ {.year = 2010, .month = 2, .day = 17, .stype = SESSION_TYPE_NON_TRADING},
308
+ {.year = 2010, .month = 2, .day = 18, .stype = SESSION_TYPE_NON_TRADING},
309
+ {.year = 2010, .month = 2, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
310
+ {.year = 2010, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
311
+ {.year = 2010, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
312
+ {.year = 2010, .month = 6, .day = 14, .stype = SESSION_TYPE_NON_TRADING},
313
+ {.year = 2010, .month = 6, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
314
+ {.year = 2010, .month = 6, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
315
+ {.year = 2010, .month = 9, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
316
+ {.year = 2010, .month = 9, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
317
+ {.year = 2010, .month = 9, .day = 24, .stype = SESSION_TYPE_NON_TRADING},
318
+ {.year = 2010, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
319
+ {.year = 2010, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
320
+ {.year = 2010, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
321
+ {.year = 2010, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
322
+ {.year = 2010, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
323
+ {.year = 2011, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
324
+ {.year = 2011, .month = 2, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
325
+ {.year = 2011, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
326
+ {.year = 2011, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
327
+ {.year = 2011, .month = 2, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
328
+ {.year = 2011, .month = 2, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
329
+ {.year = 2011, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
330
+ {.year = 2011, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
331
+ {.year = 2011, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
332
+ {.year = 2011, .month = 6, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
333
+ {.year = 2011, .month = 9, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
334
+ {.year = 2011, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
335
+ {.year = 2011, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
336
+ {.year = 2011, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
337
+ {.year = 2011, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
338
+ {.year = 2011, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
339
+ {.year = 2012, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
340
+ {.year = 2012, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
341
+ {.year = 2012, .month = 1, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
342
+ {.year = 2012, .month = 1, .day = 24, .stype = SESSION_TYPE_NON_TRADING},
343
+ {.year = 2012, .month = 1, .day = 25, .stype = SESSION_TYPE_NON_TRADING},
344
+ {.year = 2012, .month = 1, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
345
+ {.year = 2012, .month = 1, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
346
+ {.year = 2012, .month = 4, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
347
+ {.year = 2012, .month = 4, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
348
+ {.year = 2012, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
349
+ {.year = 2012, .month = 4, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
350
+ {.year = 2012, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
351
+ {.year = 2012, .month = 6, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
352
+ {.year = 2012, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
353
+ {.year = 2012, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
354
+ {.year = 2012, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
355
+ {.year = 2012, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
356
+ {.year = 2012, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
357
+ {.year = 2013, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
358
+ {.year = 2013, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
359
+ {.year = 2013, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
360
+ {.year = 2013, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
361
+ {.year = 2013, .month = 2, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
362
+ {.year = 2013, .month = 2, .day = 13, .stype = SESSION_TYPE_NON_TRADING},
363
+ {.year = 2013, .month = 2, .day = 14, .stype = SESSION_TYPE_NON_TRADING},
364
+ {.year = 2013, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
365
+ {.year = 2013, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
366
+ {.year = 2013, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
367
+ {.year = 2013, .month = 4, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
368
+ {.year = 2013, .month = 4, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
369
+ {.year = 2013, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
370
+ {.year = 2013, .month = 6, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
371
+ {.year = 2013, .month = 6, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
372
+ {.year = 2013, .month = 6, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
373
+ {.year = 2013, .month = 9, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
374
+ {.year = 2013, .month = 9, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
375
+ {.year = 2013, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
376
+ {.year = 2013, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
377
+ {.year = 2013, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
378
+ {.year = 2013, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
379
+ {.year = 2013, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
380
+ {.year = 2014, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
381
+ {.year = 2014, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
382
+ {.year = 2014, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
383
+ {.year = 2014, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
384
+ {.year = 2014, .month = 2, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
385
+ {.year = 2014, .month = 2, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
386
+ {.year = 2014, .month = 4, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
387
+ {.year = 2014, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
388
+ {.year = 2014, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
389
+ {.year = 2014, .month = 6, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
390
+ {.year = 2014, .month = 9, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
391
+ {.year = 2014, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
392
+ {.year = 2014, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
393
+ {.year = 2014, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
394
+ {.year = 2014, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
395
+ {.year = 2014, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
396
+ {.year = 2015, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
397
+ {.year = 2015, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
398
+ {.year = 2015, .month = 2, .day = 18, .stype = SESSION_TYPE_NON_TRADING},
399
+ {.year = 2015, .month = 2, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
400
+ {.year = 2015, .month = 2, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
401
+ {.year = 2015, .month = 2, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
402
+ {.year = 2015, .month = 2, .day = 24, .stype = SESSION_TYPE_NON_TRADING},
403
+ {.year = 2015, .month = 4, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
404
+ {.year = 2015, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
405
+ {.year = 2015, .month = 6, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
406
+ {.year = 2015, .month = 9, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
407
+ {.year = 2015, .month = 9, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
408
+ {.year = 2015, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
409
+ {.year = 2015, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
410
+ {.year = 2015, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
411
+ {.year = 2015, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
412
+ {.year = 2015, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
413
+ {.year = 2016, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
414
+ {.year = 2016, .month = 2, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
415
+ {.year = 2016, .month = 2, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
416
+ {.year = 2016, .month = 2, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
417
+ {.year = 2016, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
418
+ {.year = 2016, .month = 2, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
419
+ {.year = 2016, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
420
+ {.year = 2016, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
421
+ {.year = 2016, .month = 6, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
422
+ {.year = 2016, .month = 6, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
423
+ {.year = 2016, .month = 9, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
424
+ {.year = 2016, .month = 9, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
425
+ {.year = 2016, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
426
+ {.year = 2016, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
427
+ {.year = 2016, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
428
+ {.year = 2016, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
429
+ {.year = 2016, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
430
+ {.year = 2017, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
431
+ {.year = 2017, .month = 1, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
432
+ {.year = 2017, .month = 1, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
433
+ {.year = 2017, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
434
+ {.year = 2017, .month = 2, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
435
+ {.year = 2017, .month = 2, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
436
+ {.year = 2017, .month = 4, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
437
+ {.year = 2017, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
438
+ {.year = 2017, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
439
+ {.year = 2017, .month = 5, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
440
+ {.year = 2017, .month = 5, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
441
+ {.year = 2017, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
442
+ {.year = 2017, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
443
+ {.year = 2017, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
444
+ {.year = 2017, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
445
+ {.year = 2017, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
446
+ {.year = 2018, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
447
+ {.year = 2018, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
448
+ {.year = 2018, .month = 2, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
449
+ {.year = 2018, .month = 2, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
450
+ {.year = 2018, .month = 2, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
451
+ {.year = 2018, .month = 2, .day = 21, .stype = SESSION_TYPE_NON_TRADING},
452
+ {.year = 2018, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
453
+ {.year = 2018, .month = 4, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
454
+ {.year = 2018, .month = 4, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
455
+ {.year = 2018, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
456
+ {.year = 2018, .month = 6, .day = 18, .stype = SESSION_TYPE_NON_TRADING},
457
+ {.year = 2018, .month = 9, .day = 24, .stype = SESSION_TYPE_NON_TRADING},
458
+ {.year = 2018, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
459
+ {.year = 2018, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
460
+ {.year = 2018, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
461
+ {.year = 2018, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
462
+ {.year = 2018, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
463
+ {.year = 2018, .month = 12, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
464
+ {.year = 2019, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
465
+ {.year = 2019, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
466
+ {.year = 2019, .month = 2, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
467
+ {.year = 2019, .month = 2, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
468
+ {.year = 2019, .month = 2, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
469
+ {.year = 2019, .month = 2, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
470
+ {.year = 2019, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
471
+ {.year = 2019, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
472
+ {.year = 2019, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
473
+ {.year = 2019, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
474
+ {.year = 2019, .month = 6, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
475
+ {.year = 2019, .month = 9, .day = 13, .stype = SESSION_TYPE_NON_TRADING},
476
+ {.year = 2019, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
477
+ {.year = 2019, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
478
+ {.year = 2019, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
479
+ {.year = 2019, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
480
+ {.year = 2019, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
481
+ {.year = 2020, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
482
+ {.year = 2020, .month = 1, .day = 24, .stype = SESSION_TYPE_NON_TRADING},
483
+ {.year = 2020, .month = 1, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
484
+ {.year = 2020, .month = 1, .day = 28, .stype = SESSION_TYPE_NON_TRADING},
485
+ {.year = 2020, .month = 1, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
486
+ {.year = 2020, .month = 1, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
487
+ {.year = 2020, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
488
+ {.year = 2020, .month = 4, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
489
+ {.year = 2020, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
490
+ {.year = 2020, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
491
+ {.year = 2020, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
492
+ {.year = 2020, .month = 6, .day = 25, .stype = SESSION_TYPE_NON_TRADING},
493
+ {.year = 2020, .month = 6, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
494
+ {.year = 2020, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
495
+ {.year = 2020, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
496
+ {.year = 2020, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
497
+ {.year = 2020, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
498
+ {.year = 2020, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
499
+ {.year = 2020, .month = 10, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
500
+ {.year = 2021, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
501
+ {.year = 2021, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
502
+ {.year = 2021, .month = 2, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
503
+ {.year = 2021, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
504
+ {.year = 2021, .month = 2, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
505
+ {.year = 2021, .month = 2, .day = 17, .stype = SESSION_TYPE_NON_TRADING},
506
+ {.year = 2021, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
507
+ {.year = 2021, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
508
+ {.year = 2021, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
509
+ {.year = 2021, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
510
+ {.year = 2021, .month = 6, .day = 14, .stype = SESSION_TYPE_NON_TRADING},
511
+ {.year = 2021, .month = 9, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
512
+ {.year = 2021, .month = 9, .day = 21, .stype = SESSION_TYPE_NON_TRADING},
513
+ {.year = 2021, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
514
+ {.year = 2021, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
515
+ {.year = 2021, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
516
+ {.year = 2021, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
517
+ {.year = 2021, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
518
+ {.year = 2022, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
519
+ {.year = 2022, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
520
+ {.year = 2022, .month = 2, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
521
+ {.year = 2022, .month = 2, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
522
+ {.year = 2022, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
523
+ {.year = 2022, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
524
+ {.year = 2022, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
525
+ {.year = 2022, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
526
+ {.year = 2022, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
527
+ {.year = 2022, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
528
+ {.year = 2022, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
529
+ {.year = 2022, .month = 6, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
530
+ {.year = 2022, .month = 9, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
531
+ {.year = 2022, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
532
+ {.year = 2022, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
533
+ {.year = 2022, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
534
+ {.year = 2022, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
535
+ {.year = 2022, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
536
+ {.year = 2023, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
537
+ {.year = 2023, .month = 1, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
538
+ {.year = 2023, .month = 1, .day = 24, .stype = SESSION_TYPE_NON_TRADING},
539
+ {.year = 2023, .month = 1, .day = 25, .stype = SESSION_TYPE_NON_TRADING},
540
+ {.year = 2023, .month = 1, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
541
+ {.year = 2023, .month = 1, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
542
+ {.year = 2023, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
543
+ {.year = 2023, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
544
+ {.year = 2023, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
545
+ {.year = 2023, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
546
+ {.year = 2023, .month = 6, .day = 22, .stype = SESSION_TYPE_NON_TRADING},
547
+ {.year = 2023, .month = 6, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
548
+ {.year = 2023, .month = 9, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
549
+ {.year = 2023, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
550
+ {.year = 2023, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
551
+ {.year = 2023, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
552
+ {.year = 2023, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
553
+ {.year = 2023, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
554
+ {.year = 2024, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
555
+ {.year = 2024, .month = 2, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
556
+ {.year = 2024, .month = 2, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
557
+ {.year = 2024, .month = 2, .day = 13, .stype = SESSION_TYPE_NON_TRADING},
558
+ {.year = 2024, .month = 2, .day = 14, .stype = SESSION_TYPE_NON_TRADING},
559
+ {.year = 2024, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
560
+ {.year = 2024, .month = 2, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
561
+ {.year = 2024, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
562
+ {.year = 2024, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
563
+ {.year = 2024, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
564
+ {.year = 2024, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
565
+ {.year = 2024, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
566
+ {.year = 2024, .month = 6, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
567
+ {.year = 2024, .month = 9, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
568
+ {.year = 2024, .month = 9, .day = 17, .stype = SESSION_TYPE_NON_TRADING},
569
+ {.year = 2024, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
570
+ {.year = 2024, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
571
+ {.year = 2024, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
572
+ {.year = 2024, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
573
+ {.year = 2024, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
574
+ {.year = 2025, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
575
+ {.year = 2025, .month = 1, .day = 28, .stype = SESSION_TYPE_NON_TRADING},
576
+ {.year = 2025, .month = 1, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
577
+ {.year = 2025, .month = 1, .day = 30, .stype = SESSION_TYPE_NON_TRADING},
578
+ {.year = 2025, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
579
+ {.year = 2025, .month = 2, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
580
+ {.year = 2025, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
581
+ {.year = 2025, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
582
+ {.year = 2025, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
583
+ {.year = 2025, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
584
+ {.year = 2025, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
585
+ {.year = 2025, .month = 6, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
586
+ {.year = 2025, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
587
+ {.year = 2025, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
588
+ {.year = 2025, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
589
+ {.year = 2025, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
590
+ {.year = 2025, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
591
+ {.year = 2025, .month = 10, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
592
+ {.year = 2026, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
593
+ {.year = 2026, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
594
+ {.year = 2026, .month = 2, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
595
+ {.year = 2026, .month = 2, .day = 17, .stype = SESSION_TYPE_NON_TRADING},
596
+ {.year = 2026, .month = 2, .day = 18, .stype = SESSION_TYPE_NON_TRADING},
597
+ {.year = 2026, .month = 2, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
598
+ {.year = 2026, .month = 2, .day = 20, .stype = SESSION_TYPE_NON_TRADING},
599
+ {.year = 2026, .month = 2, .day = 23, .stype = SESSION_TYPE_NON_TRADING},
600
+ {.year = 2026, .month = 4, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
601
+ {.year = 2026, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
602
+ {.year = 2026, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
603
+ {.year = 2026, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
604
+ {.year = 2026, .month = 6, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
605
+ {.year = 2026, .month = 9, .day = 25, .stype = SESSION_TYPE_NON_TRADING},
606
+ {.year = 2026, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
607
+ {.year = 2026, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
608
+ {.year = 2026, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
609
+ {.year = 2026, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
610
+ {.year = 2026, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING}
611
+ };
612
+
613
+ const session_date_t EX_PROFILE_CN_HOLIDAYS_ESTIMATED[] = {
614
+ {.year = 2027, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
615
+ {.year = 2027, .month = 2, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
616
+ {.year = 2027, .month = 2, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
617
+ {.year = 2027, .month = 2, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
618
+ {.year = 2027, .month = 2, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
619
+ {.year = 2027, .month = 2, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
620
+ {.year = 2027, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
621
+ {.year = 2027, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
622
+ {.year = 2027, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
623
+ {.year = 2027, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
624
+ {.year = 2027, .month = 6, .day = 9, .stype = SESSION_TYPE_NON_TRADING},
625
+ {.year = 2027, .month = 6, .day = 10, .stype = SESSION_TYPE_NON_TRADING},
626
+ {.year = 2027, .month = 6, .day = 11, .stype = SESSION_TYPE_NON_TRADING},
627
+ {.year = 2027, .month = 9, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
628
+ {.year = 2027, .month = 9, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
629
+ {.year = 2027, .month = 9, .day = 17, .stype = SESSION_TYPE_NON_TRADING},
630
+ {.year = 2027, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
631
+ {.year = 2027, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
632
+ {.year = 2027, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
633
+ {.year = 2027, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
634
+ {.year = 2027, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
635
+
636
+ {.year = 2028, .month = 1, .day = 26, .stype = SESSION_TYPE_NON_TRADING},
637
+ {.year = 2028, .month = 1, .day = 27, .stype = SESSION_TYPE_NON_TRADING},
638
+ {.year = 2028, .month = 1, .day = 28, .stype = SESSION_TYPE_NON_TRADING},
639
+ {.year = 2028, .month = 1, .day = 31, .stype = SESSION_TYPE_NON_TRADING},
640
+ {.year = 2028, .month = 2, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
641
+ {.year = 2028, .month = 4, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
642
+ {.year = 2028, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
643
+ {.year = 2028, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
644
+ {.year = 2028, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
645
+ {.year = 2028, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
646
+ {.year = 2028, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
647
+ {.year = 2028, .month = 5, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
648
+ {.year = 2028, .month = 5, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
649
+ {.year = 2028, .month = 5, .day = 29, .stype = SESSION_TYPE_NON_TRADING},
650
+ {.year = 2028, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
651
+ {.year = 2028, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
652
+ {.year = 2028, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
653
+ {.year = 2028, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
654
+ {.year = 2028, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
655
+ {.year = 2028, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
656
+ {.year = 2028, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
657
+ {.year = 2028, .month = 10, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
658
+
659
+ {.year = 2029, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
660
+ {.year = 2029, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
661
+ {.year = 2029, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
662
+ {.year = 2029, .month = 2, .day = 13, .stype = SESSION_TYPE_NON_TRADING},
663
+ {.year = 2029, .month = 2, .day = 14, .stype = SESSION_TYPE_NON_TRADING},
664
+ {.year = 2029, .month = 2, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
665
+ {.year = 2029, .month = 2, .day = 16, .stype = SESSION_TYPE_NON_TRADING},
666
+ {.year = 2029, .month = 2, .day = 19, .stype = SESSION_TYPE_NON_TRADING},
667
+ {.year = 2029, .month = 4, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
668
+ {.year = 2029, .month = 4, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
669
+ {.year = 2029, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
670
+ {.year = 2029, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
671
+ {.year = 2029, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
672
+ {.year = 2029, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
673
+ {.year = 2029, .month = 6, .day = 15, .stype = SESSION_TYPE_NON_TRADING},
674
+ {.year = 2029, .month = 9, .day = 21, .stype = SESSION_TYPE_NON_TRADING},
675
+ {.year = 2029, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
676
+ {.year = 2029, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
677
+ {.year = 2029, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
678
+ {.year = 2029, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
679
+ {.year = 2029, .month = 10, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
680
+
681
+ {.year = 2030, .month = 1, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
682
+ {.year = 2030, .month = 1, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
683
+ {.year = 2030, .month = 1, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
684
+ {.year = 2030, .month = 2, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
685
+ {.year = 2030, .month = 2, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
686
+ {.year = 2030, .month = 2, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
687
+ {.year = 2030, .month = 2, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
688
+ {.year = 2030, .month = 2, .day = 8, .stype = SESSION_TYPE_NON_TRADING},
689
+ {.year = 2030, .month = 4, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
690
+ {.year = 2030, .month = 5, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
691
+ {.year = 2030, .month = 5, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
692
+ {.year = 2030, .month = 5, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
693
+ {.year = 2030, .month = 6, .day = 5, .stype = SESSION_TYPE_NON_TRADING},
694
+ {.year = 2030, .month = 6, .day = 6, .stype = SESSION_TYPE_NON_TRADING},
695
+ {.year = 2030, .month = 6, .day = 7, .stype = SESSION_TYPE_NON_TRADING},
696
+ {.year = 2030, .month = 9, .day = 12, .stype = SESSION_TYPE_NON_TRADING},
697
+ {.year = 2030, .month = 9, .day = 13, .stype = SESSION_TYPE_NON_TRADING},
698
+ {.year = 2030, .month = 10, .day = 1, .stype = SESSION_TYPE_NON_TRADING},
699
+ {.year = 2030, .month = 10, .day = 2, .stype = SESSION_TYPE_NON_TRADING},
700
+ {.year = 2030, .month = 10, .day = 3, .stype = SESSION_TYPE_NON_TRADING},
701
+ {.year = 2030, .month = 10, .day = 4, .stype = SESSION_TYPE_NON_TRADING},
702
+ {.year = 2030, .month = 10, .day = 7, .stype = SESSION_TYPE_NON_TRADING}
703
+ };
704
+
705
+ const session_date_t EX_PROFILE_CN_CIRCUIT_BREAK_DATES[] = {
706
+ {.year = 2016, .month = 1, .day = 4, .stype = SESSION_TYPE_CIRCUIT_BREAK},
707
+ {.year = 2016, .month = 1, .day = 7, .stype = SESSION_TYPE_CIRCUIT_BREAK},
708
+ };
709
+
710
+ const size_t EX_PROFILE_CN_HOLIDAYS_PRECOMPUTED_COUNT = sizeof(EX_PROFILE_CN_HOLIDAYS_PRECOMPUTED) / sizeof(session_date_t);
711
+ const size_t EX_PROFILE_CN_HOLIDAYS_ESTIMATED_COUNT = sizeof(EX_PROFILE_CN_HOLIDAYS_ESTIMATED) / sizeof(session_date_t);
712
+ const size_t EX_PROFILE_CN_CIRCUIT_BREAK_DATES_COUNT = sizeof(EX_PROFILE_CN_CIRCUIT_BREAK_DATES) / sizeof(session_date_t);
713
+
714
+ // ========== Timestamp Constants ==========
715
+ // NOTE: #define (not static const double) — const variables are not constant
716
+ // expressions in ISO C, so MSVC rejects them in static initializers (C2099).
717
+
718
+ #define EX_PROFILE_CN_TS_OPENCALL_START HMS_TO_TS(9u, 15u, 0u) // 09:15:00
719
+ #define EX_PROFILE_CN_TS_OPENCALL_NO_CANCEL HMS_TO_TS(9u, 20u, 0u) // 09:20:00
720
+ #define EX_PROFILE_CN_TS_OPENCALL_UNCROSS HMS_TO_TS(9u, 25u, 0u) // 09:25:00 (uncross)
721
+ #define EX_PROFILE_CN_TS_SESSION_START HMS_TO_TS(9u, 30u, 0u) // 09:30:00
722
+ #define EX_PROFILE_CN_TS_BREAK_START HMS_TO_TS(11u, 30u, 0u) // 11:30:00
723
+ #define EX_PROFILE_CN_TS_BREAK_END HMS_TO_TS(13u, 0u, 0u) // 13:00:00
724
+ #define EX_PROFILE_CN_TS_CLOSECALL_START HMS_TO_TS(14u, 57u, 0u) // 14:57:00
725
+ #define EX_PROFILE_CN_TS_SESSION_END HMS_TO_TS(15u, 0u, 0u) // 15:00:00
726
+
727
+ const session_time_range_t EX_PROFILE_CN_OPENCALL_ACTIVE = {
728
+ .start = {.elapsed_seconds = -15.0 * SECONDS_PER_MINUTE, .hour = 9u, .minute = 15u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_OPEN_AUCTION},
729
+ .end = {.elapsed_seconds = -10.0 * SECONDS_PER_MINUTE, .hour = 9u, .minute = 20u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_OPEN_AUCTION},
730
+ .elapsed_seconds = 5 * SECONDS_PER_MINUTE,
731
+ };
732
+
733
+ const session_time_range_t EX_PROFILE_CN_OPENCALL_NO_CANCEL = {
734
+ .start = {.elapsed_seconds = -10.0 * SECONDS_PER_MINUTE, .hour = 9u, .minute = 20u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_OPEN_AUCTION},
735
+ .end = {.elapsed_seconds = -5.0 * SECONDS_PER_MINUTE, .hour = 9u, .minute = 25u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_OPEN_AUCTION},
736
+ .elapsed_seconds = 5 * SECONDS_PER_MINUTE,
737
+ };
738
+
739
+ const session_time_range_t EX_PROFILE_CN_OPENCALL_FROZEN = {
740
+ .start = {.elapsed_seconds = -5.0 * SECONDS_PER_MINUTE, .hour = 9u, .minute = 25u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_OPEN_AUCTION},
741
+ .end = {.elapsed_seconds = 0, .hour = 9u, .minute = 30u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_OPEN_AUCTION},
742
+ .elapsed_seconds = 5 * SECONDS_PER_MINUTE,
743
+ };
744
+
745
+ const call_auction EX_PROFILE_CN_OPENCALL_AUCTION = {
746
+ .auction_start = {.elapsed_seconds = -15.0 * SECONDS_PER_MINUTE, .hour = 9u, .minute = 15u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_OPEN_AUCTION},
747
+ .active = &EX_PROFILE_CN_OPENCALL_ACTIVE,
748
+ .no_cancel = &EX_PROFILE_CN_OPENCALL_NO_CANCEL,
749
+ .frozen = &EX_PROFILE_CN_OPENCALL_FROZEN,
750
+ .uncross = {.elapsed_seconds = -5.0 * SECONDS_PER_MINUTE, .hour = 9u, .minute = 25u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_OPEN_AUCTION},
751
+ .auction_end = {.elapsed_seconds = 0.0, .hour = 9u, .minute = 30u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_OPEN_AUCTION},
752
+ };
753
+
754
+ const session_time_range_t EX_PROFILE_CN_CLOSECALL_NO_CANCEL = {
755
+ .start = {.elapsed_seconds = 14220.0, .hour = 14u, .minute = 57u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_CLOSE_AUCTION},
756
+ .end = {.elapsed_seconds = 14400.0, .hour = 15u, .minute = 0u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_CLOSE_AUCTION},
757
+ .elapsed_seconds = 180.0,
758
+ };
759
+
760
+ const call_auction EX_PROFILE_CN_CLOSECALL_AUCTION = {
761
+ .auction_start = {.elapsed_seconds = 14220.0, .hour = 14u, .minute = 57u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_CLOSE_AUCTION},
762
+ .active = NULL,
763
+ .no_cancel = &EX_PROFILE_CN_CLOSECALL_NO_CANCEL,
764
+ .frozen = NULL,
765
+ .uncross = {.elapsed_seconds = 14400.0, .hour = 15u, .minute = 0u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_CLOSE_AUCTION},
766
+ .auction_end = {.elapsed_seconds = 14400.0, .hour = 15u, .minute = 0u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_CLOSE_AUCTION},
767
+ };
768
+
769
+ const session_break EX_PROFILE_CN_BREAK = {
770
+ .break_start = {.elapsed_seconds = 7200.0, .hour = 11u, .minute = 30u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_BREAK},
771
+ .break_end = {.elapsed_seconds = 7200.0, .hour = 13u, .minute = 0u, .second = 0u, .nanosecond = 0u, .phase = SESSION_PHASE_BREAK},
772
+ .break_start_ts = EX_PROFILE_CN_TS_BREAK_START, // 11:30:00
773
+ .break_end_ts = EX_PROFILE_CN_TS_BREAK_END, // 13:00:00
774
+ .break_length_seconds = EX_PROFILE_CN_TS_BREAK_END - EX_PROFILE_CN_TS_BREAK_START,
775
+ .next = NULL,
776
+ };
777
+
778
+ // ========== Forward Declaration ==========
779
+
780
+ static void c_ex_profile_on_activate_cn(const exchange_profile* profile);
781
+ static void c_ex_profile_on_deactivate_cn(const exchange_profile* profile);
782
+ static session_date_range_t* c_ex_profile_trade_calendar_cn(const session_date_t* start_date, const session_date_t* end_date);
783
+ static auction_phase c_ex_profile_resolve_auction_phase_cn(double ts);
784
+ static session_phase c_ex_profile_resolve_session_phase_cn(double ts);
785
+ static session_type c_ex_profile_resolve_session_type_cn(uint16_t year, uint8_t month, uint8_t day);
786
+
787
+ // ========== Utilities Functions ==========
788
+
789
+ bool c_ex_profile_cn_date_in_list(const session_date_t* date, const session_date_t* list, size_t n) {
790
+ if (!date || !list) return false;
791
+ for (size_t i = 0; i < n; ++i)
792
+ if (c_ex_profile_date_compare(date, list + i) == 0) return true;
793
+ return false;
794
+ }
795
+
796
+ bool c_ex_profile_cn_is_holiday(const session_date_t* date) {
797
+ if (c_ex_profile_cn_date_in_list(date, EX_PROFILE_CN_HOLIDAYS_PRECOMPUTED, EX_PROFILE_CN_HOLIDAYS_PRECOMPUTED_COUNT)) return true;
798
+ if (c_ex_profile_cn_date_in_list(date, EX_PROFILE_CN_HOLIDAYS_ESTIMATED, EX_PROFILE_CN_HOLIDAYS_ESTIMATED_COUNT)) return true;
799
+ return false;
800
+ }
801
+
802
+ bool c_ex_profile_cn_is_circuit_break(const session_date_t* date) {
803
+ return c_ex_profile_cn_date_in_list(date, EX_PROFILE_CN_CIRCUIT_BREAK_DATES, EX_PROFILE_CN_CIRCUIT_BREAK_DATES_COUNT);
804
+ }
805
+
806
+ void c_ex_profile_cn_get_calendar(void) {
807
+ if (EX_PROFILE_CN_TRADE_CALENDAR) return;
808
+ session_date_t start = {.year = EX_PROFILE_CN_PROFILE_MIN_YEAR, .month = 1u, .day = 1u, .stype = SESSION_TYPE_NON_TRADING};
809
+ session_date_t end = {.year = EX_PROFILE_CN_PROFILE_MAX_YEAR, .month = 12u, .day = 31u, .stype = SESSION_TYPE_NON_TRADING};
810
+ session_date_range_t* built = c_ex_profile_trade_calendar_cn(&start, &end);
811
+ if (!built) return;
812
+ EX_PROFILE_CN_TRADE_CALENDAR = (const session_date_range_t*) built;
813
+ }
814
+
815
+ // ========== Public APIs ==========
816
+
817
+ static void c_ex_profile_on_activate_cn(const exchange_profile* profile) {
818
+ if (!profile) return;
819
+ (void) profile;
820
+
821
+ if (EX_TRADE_CALENDAR_CACHE) free((void*) EX_TRADE_CALENDAR_CACHE);
822
+ if (!EX_PROFILE_CN_TRADE_CALENDAR) c_ex_profile_cn_get_calendar();
823
+ EX_TRADE_CALENDAR_CACHE = EX_PROFILE_CN_TRADE_CALENDAR;
824
+ EX_PROFILE_CN_IS_ACTIVATED = true;
825
+ }
826
+
827
+ static void c_ex_profile_on_deactivate_cn(const exchange_profile* profile) {
828
+ if (!profile) return;
829
+ (void) profile;
830
+
831
+ // To prevent EX_PROFILE_CN_TRADE_CALENDAR being freed by the default on_deactivate
832
+ // We must unset the EX_TRADE_CALENDAR_CACHE
833
+ EX_TRADE_CALENDAR_CACHE = NULL;
834
+ if (EX_TRADE_CALENDAR_CACHE == EX_PROFILE_CN_TRADE_CALENDAR) EX_TRADE_CALENDAR_CACHE = NULL;
835
+ EX_PROFILE_CN_IS_ACTIVATED = false;
836
+ }
837
+
838
+ static session_date_range_t* c_ex_profile_trade_calendar_cn(const session_date_t* start_date, const session_date_t* end_date) {
839
+ if (!start_date || !end_date) return NULL;
840
+ if (!c_ex_profile_date_is_valid(start_date) || !c_ex_profile_date_is_valid(end_date)) return NULL;
841
+
842
+ // Normalize order.
843
+ if (c_ex_profile_date_compare(start_date, end_date) == 1) {
844
+ const session_date_t* tmp = start_date;
845
+ start_date = end_date;
846
+ end_date = tmp;
847
+ }
848
+
849
+ session_date_range_t* calendar = c_ex_profile_date_range(start_date, end_date);
850
+ if (!calendar || calendar->n_days == 0u) return NULL;
851
+
852
+ // Mark stype, then compact in-place with two cursors (read/write).
853
+ const size_t n_total = calendar->n_days;
854
+ size_t write_i = 0u;
855
+ for (size_t read_i = 0u; read_i < n_total; ++read_i) {
856
+ session_date_t* d = calendar->dates + read_i;
857
+
858
+ if (c_ex_profile_is_weekend(d) || c_ex_profile_cn_is_holiday(d)) continue;
859
+
860
+ session_type stype = c_ex_profile_cn_is_circuit_break(d) ? SESSION_TYPE_CIRCUIT_BREAK : SESSION_TYPE_NORMINAL;
861
+ if (write_i != read_i) calendar->dates[write_i] = *d;
862
+ calendar->dates[write_i].stype = stype;
863
+ write_i += 1u;
864
+ }
865
+
866
+ if (write_i == 0u) {
867
+ free(calendar);
868
+ return NULL;
869
+ }
870
+
871
+ calendar->n_days = write_i;
872
+ calendar->start = calendar->dates[0u];
873
+ calendar->end = calendar->dates[write_i - 1u];
874
+ return calendar;
875
+ }
876
+
877
+ static auction_phase c_ex_profile_resolve_auction_phase_cn(double ts) {
878
+ // OPEN auction: 09:15:00 ~ 09:30:00
879
+ // 09:15:00 ~ 09:20:00: AUCTION_PHASE_ACTIVE
880
+ // 09:20:00 ~ 09:25:00: AUCTION_PHASE_NO_CANCEL
881
+ // 09:25:00: uncrossing
882
+ // 09:25:00 ~ 09:30:00: AUCTION_PHASE_FROZEN
883
+ // 09:30:00: AUCTION_PHASE_DONE
884
+
885
+ // CLOSE auction:
886
+ // 14:57:00 ~ 15:00:00: AUCTION_PHASE_NO_CANCEL
887
+ // 15:00:00: uncrossing and AUCTION_PHASE_DONE
888
+
889
+ if (ts < EX_PROFILE_CN_TS_OPENCALL_START) return AUCTION_PHASE_DONE;
890
+ if (ts < EX_PROFILE_CN_TS_OPENCALL_NO_CANCEL) return AUCTION_PHASE_ACTIVE;
891
+ if (ts < EX_PROFILE_CN_TS_OPENCALL_UNCROSS) return AUCTION_PHASE_NO_CANCEL;
892
+ if (ts == EX_PROFILE_CN_TS_OPENCALL_UNCROSS) return AUCTION_PHASE_UNCROSSING;
893
+ if (ts < EX_PROFILE_CN_TS_SESSION_START) return AUCTION_PHASE_FROZEN;
894
+ if (ts < EX_PROFILE_CN_TS_CLOSECALL_START) return AUCTION_PHASE_DONE;
895
+ if (ts < EX_PROFILE_CN_TS_SESSION_END) return AUCTION_PHASE_NO_CANCEL;
896
+ if (ts == EX_PROFILE_CN_TS_SESSION_END) return AUCTION_PHASE_UNCROSSING;
897
+ return AUCTION_PHASE_DONE;
898
+ }
899
+
900
+ static session_phase c_ex_profile_resolve_session_phase_cn(double ts) {
901
+ // prier to 09:15:00: SESSION_PHASE_PREOPEN
902
+ // 09:15:00 ~ 09:30:00: SESSION_PHASE_OPEN_AUCTION
903
+ // 09:30:00 ~ 11:30:00: SESSION_PHASE_CONTINUOUS
904
+ // 11:30:00 ~ 13:00:00: SESSION_PHASE_BREAK
905
+ // 13:00:00 ~ 14:57:00: SESSION_PHASE_CONTINUOUS
906
+ // 14:57:00 ~ 15:00:00: SESSION_PHASE_CLOSE_AUCTION
907
+ // after 15:00:00: SESSION_PHASE_CLOSED
908
+
909
+ if (ts < EX_PROFILE_CN_TS_OPENCALL_START) return SESSION_PHASE_PREOPEN;
910
+ if (ts < EX_PROFILE_CN_TS_SESSION_START) return SESSION_PHASE_OPEN_AUCTION;
911
+ if (ts <= EX_PROFILE_CN_TS_BREAK_START) return SESSION_PHASE_CONTINUOUS;
912
+ if (ts < EX_PROFILE_CN_TS_BREAK_END) return SESSION_PHASE_BREAK;
913
+ if (ts <= EX_PROFILE_CN_TS_CLOSECALL_START) return SESSION_PHASE_CONTINUOUS;
914
+ if (ts < EX_PROFILE_CN_TS_SESSION_END) return SESSION_PHASE_CLOSE_AUCTION;
915
+ return SESSION_PHASE_CLOSED;
916
+ }
917
+
918
+ static session_type c_ex_profile_resolve_session_type_cn(uint16_t year, uint8_t month, uint8_t day) {
919
+ if (year < EX_PROFILE_CN_PROFILE_MIN_YEAR || year > EX_PROFILE_CN_PROFILE_MAX_YEAR) return SESSION_TYPE_NON_TRADING;
920
+ session_date_t target = {.year = year, .month = month, .day = day, .stype = SESSION_TYPE_NORMINAL};
921
+ size_t idx = c_ex_profile_session_date_index(&target, EX_PROFILE_CN_TRADE_CALENDAR);
922
+ if (idx == (size_t) -1) return SESSION_TYPE_NON_TRADING;
923
+ const session_date_t* date = EX_PROFILE_CN_TRADE_CALENDAR->dates + idx;
924
+ if (c_ex_profile_date_compare(date, &target) == 0) return date->stype;
925
+ return SESSION_TYPE_NON_TRADING;
926
+ }
927
+
928
+ bool EX_PROFILE_CN_IS_ACTIVATED = false;
929
+
930
+ const session_date_range_t* EX_PROFILE_CN_TRADE_CALENDAR = NULL;
931
+
932
+ const exchange_profile EX_PROFILE_CN = {
933
+ .profile_id = "CN_STOCK",
934
+
935
+ .session_start = {
936
+ .elapsed_seconds = 0.0,
937
+ .hour = 9u,
938
+ .minute = 30u,
939
+ .second = 0u,
940
+ .nanosecond = 0u,
941
+ .phase = SESSION_PHASE_CONTINUOUS,
942
+ },
943
+ .session_end = {
944
+ .elapsed_seconds = 14400.0,
945
+ .hour = 15u,
946
+ .minute = 0u,
947
+ .second = 0u,
948
+ .nanosecond = 0u,
949
+ .phase = SESSION_PHASE_CLOSED,
950
+ },
951
+ .session_start_ts = EX_PROFILE_CN_TS_SESSION_START, // 09:30:00
952
+ .session_end_ts = EX_PROFILE_CN_TS_SESSION_END, // 15:00:00
953
+ .session_length_seconds = 14400.0, // 4h continuous trading excluding lunch break
954
+
955
+ .open_call_auction = &EX_PROFILE_CN_OPENCALL_AUCTION,
956
+ .close_call_auction = &EX_PROFILE_CN_CLOSECALL_AUCTION,
957
+ .session_breaks = &EX_PROFILE_CN_BREAK,
958
+
959
+ .time_zone = "Asia/Shanghai",
960
+ .tz_offset_seconds = 28800.0,
961
+
962
+ .on_activate = c_ex_profile_on_activate_cn,
963
+ .on_deactivate = c_ex_profile_on_deactivate_cn,
964
+ .trade_calendar = c_ex_profile_trade_calendar_cn,
965
+ .resolve_auction_phase = c_ex_profile_resolve_auction_phase_cn,
966
+ .resolve_session_phase = c_ex_profile_resolve_session_phase_cn,
967
+ .resolve_session_type = c_ex_profile_resolve_session_type_cn,
968
+ };