cfquant 0.2.56__tar.gz → 0.2.58__tar.gz

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 (233) hide show
  1. {cfquant-0.2.56 → cfquant-0.2.58}/LICENSE +21 -21
  2. {cfquant-0.2.56 → cfquant-0.2.58}/LTtx/tx/LTtx_server.py +57 -57
  3. {cfquant-0.2.56 → cfquant-0.2.58}/LTtx/tx/tx.py +34 -34
  4. {cfquant-0.2.56 → cfquant-0.2.58}/MANIFEST.in +55 -55
  5. {cfquant-0.2.56 → cfquant-0.2.58}/PKG-INFO +3 -1
  6. {cfquant-0.2.56 → cfquant-0.2.58}/README.md +7 -6
  7. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/__init__.py +18 -18
  8. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/_editable_install.py +585 -547
  9. cfquant-0.2.58/cfquant/algo.py +517 -0
  10. cfquant-0.2.58/cfquant/algo_broker.py +219 -0
  11. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/batch_orders.py +418 -418
  12. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/build_info.py +67 -67
  13. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/callback_dispatcher.py +218 -218
  14. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/cftrader.py +200 -137
  15. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/cli.py +400 -400
  16. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/client.py +147 -143
  17. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/config.py +6 -6
  18. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/diagnostics.py +126 -126
  19. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/flow_control.py +171 -171
  20. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/level2.py +197 -197
  21. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/log_management.py +118 -118
  22. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/management.py +468 -452
  23. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/normal_bridge.py +1662 -1563
  24. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/order_identity.py +190 -190
  25. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/order_meta.py +819 -819
  26. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/pipe_bridge.py +87 -87
  27. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/pipe_client.py +76 -76
  28. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/pipe_hub.py +651 -651
  29. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/pipe_transport.py +286 -286
  30. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/protocol.py +323 -323
  31. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_binding_settings.py +39 -39
  32. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_bridge.py +1848 -1843
  33. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_component_agent.js +258 -249
  34. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_component_login.py +389 -321
  35. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_credentials.py +78 -78
  36. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_dependencies.py +158 -158
  37. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_pipe_runtime.py +189 -189
  38. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_strategy_deploy.py +342 -342
  39. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_strategy_package.py +69 -69
  40. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/qmt_strategy_runtime.py +253 -253
  41. cfquant-0.2.58/cfquant/qmt_update.py +366 -0
  42. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/quote_history.py +122 -122
  43. cfquant-0.2.58/cfquant/quote_leases.py +69 -0
  44. cfquant-0.2.58/cfquant/quote_service.py +186 -0
  45. cfquant-0.2.58/cfquant/remote_adapter.py +265 -0
  46. cfquant-0.2.58/cfquant/remote_management.py +407 -0
  47. cfquant-0.2.58/cfquant/remote_supervisor.py +120 -0
  48. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/rpc_timing.py +61 -61
  49. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/runtime_report.py +371 -371
  50. cfquant-0.2.58/cfquant/shared_quotes.py +347 -0
  51. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/stock_connect.py +80 -80
  52. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/10_/345/221/275/344/273/244/350/241/214/346/216/245/345/217/243/346/265/213/350/257/225.py +120 -120
  53. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/11_/346/231/256/351/200/232/346/241/245/346/216/245/346/264/276/345/217/221/346/265/213/350/257/225.py +81 -81
  54. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/12_/350/256/242/345/215/225/345/244/207/346/263/250/346/265/213/350/257/225.py +2 -2
  55. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/13_/347/256/241/351/201/223/344/270/255/345/277/203/350/277/236/346/216/245/346/265/213/350/257/225.py +184 -184
  56. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/14_/350/277/220/350/241/214/346/227/266/346/212/245/345/221/212/346/265/213/350/257/225.py +54 -54
  57. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/15_/347/275/221/351/241/265/347/212/266/346/200/201/347/274/223/345/255/230/346/265/213/350/257/225.py +1010 -1010
  58. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/16_/345/220/257/345/212/250/345/256/211/350/243/205/346/265/213/350/257/225.py +434 -399
  59. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/17_/345/244/247QMT/346/216/245/345/217/243/351/200/202/351/205/215/346/265/213/350/257/225.py +503 -503
  60. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/18_/351/253/230/347/272/247/346/250/241/345/274/217/345/256/236/346/234/272/350/201/224/350/260/203.py +433 -433
  61. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/19_/345/256/236/346/234/272/350/201/224/350/260/203/345/210/244/345/256/232/346/265/213/350/257/225.py +62 -62
  62. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/1_/350/241/214/346/203/205/346/216/245/346/224/266/346/265/213/350/257/225.py +300 -300
  63. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/20_/350/201/224/350/260/203/351/227/256/351/242/230/344/277/256/345/244/215/346/265/213/350/257/225.py +2 -2
  64. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/21_/345/215/225/350/202/241/350/241/214/346/203/205/350/256/242/351/230/205/346/265/213/350/257/225.py +291 -291
  65. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/22_/350/277/236/346/216/245/350/257/212/346/226/255/346/265/213/350/257/225.py +113 -113
  66. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/23_/347/244/272/344/276/213/351/205/215/347/275/256/346/265/213/350/257/225.py +214 -214
  67. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/24_/350/264/246/346/210/267/347/274/223/345/255/230/346/214/211/351/234/200/345/210/267/346/226/260/346/265/213/350/257/225.py +473 -473
  68. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/25_/350/264/246/346/210/267/347/274/223/345/255/230/351/241/265/351/235/242/346/265/213/350/257/225.py +170 -170
  69. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/26_/345/205/250/346/216/250/350/256/242/351/230/205/346/265/213/350/257/225.py +533 -514
  70. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/27_/345/205/250/346/216/250/350/256/242/351/230/205/351/241/265/351/235/242/346/265/213/350/257/225.py +143 -143
  71. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/28_Level2/346/216/245/345/217/243/351/200/202/351/205/215/346/265/213/350/257/225.py +428 -428
  72. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/29_Level2/350/241/214/346/203/205/346/265/213/350/257/225.py +114 -114
  73. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/2_/346/225/260/346/215/256/350/216/267/345/217/226/346/265/213/350/257/225.py +507 -507
  74. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/30_cftrader/346/211/271/351/207/217/344/270/213/345/215/225/346/200/247/350/203/275/345/237/272/345/207/206.py +215 -215
  75. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/31_cftrader/346/250/241/346/213/237/350/264/246/345/217/267/346/211/271/351/207/217/344/270/213/345/215/225/346/265/213/350/257/225.py +685 -685
  76. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/32_/345/274/202/346/255/245/344/270/213/345/215/225/346/265/213/350/257/225.py +176 -176
  77. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/33_/345/220/214/346/255/245/344/270/213/345/215/225/345/233/236/350/260/203/346/265/213/350/257/225.py +160 -160
  78. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/34_/345/205/250/346/216/250/345/206/205/351/203/250/345/273/266/350/277/237/346/265/213/350/257/225.py +77 -77
  79. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/3_/346/225/260/346/215/256/344/270/213/350/275/275/346/265/213/350/257/225.py +229 -229
  80. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/4_/344/272/244/346/230/223/345/247/224/346/211/230/346/237/245/350/257/242/346/265/213/350/257/225.py +335 -335
  81. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/5_/347/234/237/345/256/236/344/270/213/345/215/225/346/265/213/350/257/225.py +879 -879
  82. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/6_/345/233/236/350/260/203/346/265/213/350/257/225.py +614 -614
  83. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/7_/345/220/214/346/255/245/345/274/202/346/255/245/344/270/213/345/215/225/346/265/213/350/257/225.py +504 -504
  84. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/8_/346/210/220/344/272/244/350/256/242/345/215/225/345/222/214/345/247/224/346/211/230/350/256/242/345/215/225/346/237/245/350/257/242/346/265/213/350/257/225.py +246 -246
  85. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/9_/345/217/257/346/222/244/350/256/242/345/215/225/346/265/213/350/257/225.py +352 -352
  86. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/_helpers.py +64 -64
  87. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/readme.md +202 -202
  88. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_account_query_timing.py +131 -131
  89. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_advanced_parity.py +153 -153
  90. cfquant-0.2.58/cfquant/tests/test_algo.py +293 -0
  91. cfquant-0.2.58/cfquant/tests/test_algo_broker.py +107 -0
  92. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_api_tester_browser.py +334 -334
  93. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_api_tester_web.py +209 -209
  94. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_binding_delete_confirmation.py +91 -91
  95. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_binding_live_refresh_browser.py +95 -95
  96. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_binding_runtime_browser.py +115 -109
  97. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_callback_recovery.py +287 -287
  98. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_callback_requests.py +298 -298
  99. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_cftrader.py +626 -626
  100. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_cftrader_tutorial.py +283 -182
  101. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_cftrader_web.py +261 -261
  102. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_credit_compat.py +452 -452
  103. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_dataframe_encoding.py +192 -192
  104. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_json_serialization.py +186 -186
  105. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_latency_flow_control.py +610 -601
  106. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_lite_account_routing.py +128 -128
  107. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_lite_deployment_paths.py +179 -179
  108. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_lite_parity.py +140 -140
  109. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_lite_qmt_dispatch.py +348 -348
  110. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_local_trading_calendar.py +154 -154
  111. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_log_management.py +56 -56
  112. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_management.py +486 -486
  113. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_management_batch.py +55 -55
  114. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_market_data_fallback.py +52 -52
  115. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_market_timing.py +238 -238
  116. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_order_identity.py +212 -212
  117. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_order_time_callback.py +71 -71
  118. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_project_updater.py +210 -210
  119. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_python_api_reference.py +88 -88
  120. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_qmt_auto_login_browser.py +286 -199
  121. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_qmt_auto_login_integration.py +474 -356
  122. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_qmt_binding_settings.py +137 -123
  123. cfquant-0.2.58/cfquant/tests/test_qmt_component_login.py +347 -0
  124. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_qmt_dependencies.py +107 -107
  125. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_qmt_fileless.py +408 -408
  126. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_qmt_strategy_browser.py +584 -583
  127. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_qmt_strategy_deploy.py +973 -973
  128. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_qmt_strategy_web.py +439 -439
  129. cfquant-0.2.58/cfquant/tests/test_qmt_update.py +74 -0
  130. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_quote_latency.py +225 -235
  131. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_quote_latency_encoding.py +107 -107
  132. cfquant-0.2.58/cfquant/tests/test_quote_service.py +177 -0
  133. cfquant-0.2.58/cfquant/tests/test_remote_management.py +352 -0
  134. cfquant-0.2.58/cfquant/tests/test_remote_management_browser.py +40 -0
  135. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_remote_version_check.py +72 -72
  136. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_setup_qmt_prompt.py +99 -99
  137. cfquant-0.2.58/cfquant/tests/test_shared_quotes.py +199 -0
  138. cfquant-0.2.58/cfquant/tests/test_shared_quotes_generated.py +35 -0
  139. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_startup_recovery.py +62 -62
  140. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_stock_connect.py +250 -250
  141. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_stock_connect_browser.py +24 -24
  142. cfquant-0.2.58/cfquant/tests/test_subscription_congestion.py +120 -0
  143. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_table_conversion.py +122 -122
  144. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_trade_strategy_callback.py +273 -273
  145. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_trader_subscription_recovery.py +452 -345
  146. cfquant-0.2.58/cfquant/tests/test_trading_monitor.py +533 -0
  147. cfquant-0.2.58/cfquant/tests/test_trading_monitor_browser.py +217 -0
  148. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_tutorial_reader.py +326 -322
  149. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_tx_auto_import.py +26 -26
  150. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_tx_shutdown.py +377 -377
  151. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/trading_calendar.py +107 -107
  152. cfquant-0.2.58/cfquant/trading_monitor.py +557 -0
  153. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tx.py +1984 -1984
  154. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tx_trade_bridge.py +326 -310
  155. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/version.py +5 -5
  156. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/xtdata.py +245 -235
  157. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/xttrader.py +247 -243
  158. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/xttype.py +1409 -1409
  159. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant.egg-info/PKG-INFO +3 -1
  160. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant.egg-info/SOURCES.txt +23 -2
  161. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant.egg-info/requires.txt +3 -0
  162. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant_pipe_hub.py +39 -39
  163. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant_web_server.py +1586 -1189
  164. {cfquant-0.2.56 → cfquant-0.2.58}/pyproject.toml +63 -62
  165. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts/CFQUANT.py +127 -127
  166. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts/CFQUANT_LITE.py +495 -28
  167. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts/CFQUANT_TRADE_LOWLAT.py +84 -84
  168. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts/__init__.py +1 -1
  169. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts//345/220/214/350/264/246/345/217/267/347/213/254/347/253/213/345/270/202/345/234/272/CFQUANT_LITE_SH.py +495 -28
  170. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts//345/220/214/350/264/246/345/217/267/347/213/254/347/253/213/345/270/202/345/234/272/CFQUANT_LITE_SZ.py +495 -28
  171. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts//345/220/214/350/264/246/345/217/267/347/213/254/347/253/213/345/270/202/345/234/272/CFQUANT_TRADE_LOWLAT_SH.py +84 -84
  172. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts//345/220/214/350/264/246/345/217/267/347/213/254/347/253/213/345/270/202/345/234/272/CFQUANT_TRADE_LOWLAT_SZ.py +84 -84
  173. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts//345/220/214/350/264/246/345/217/267/347/213/254/347/253/213/345/270/202/345/234/272/readme.md +19 -19
  174. {cfquant-0.2.56 → cfquant-0.2.58}/requirements.txt +16 -14
  175. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/__init__.py +1 -1
  176. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/api-tester.js +206 -206
  177. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/app.js +15078 -14986
  178. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/cftrader-api-data.js +249 -176
  179. cfquant-0.2.58/web_dashboard/docs.js +79 -0
  180. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/index.html +3463 -3300
  181. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/python-api-data.js +8 -8
  182. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/python-api.js +257 -256
  183. cfquant-0.2.58/web_dashboard/remote-management.js +52 -0
  184. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/styles.css +443 -335
  185. cfquant-0.2.58/web_dashboard/trading-monitor.js +282 -0
  186. cfquant-0.2.56/cfquant/tests/log/cftrader/346/250/241/346/213/237/350/264/246/345/217/267/346/211/271/351/207/217/344/270/213/345/215/225/346/265/213/350/257/225_20260911_024617.md +0 -12
  187. cfquant-0.2.56/cfquant/tests/log/cftrader/346/250/241/346/213/237/350/264/246/345/217/267/346/211/271/351/207/217/344/270/213/345/215/225/346/265/213/350/257/225_20260921_175732.md +0 -12
  188. cfquant-0.2.56/cfquant/tests/test_qmt_component_login.py +0 -165
  189. cfquant-0.2.56/web_dashboard/docs.js +0 -48
  190. {cfquant-0.2.56 → cfquant-0.2.58}/LTtx/__init__.py +0 -0
  191. {cfquant-0.2.56 → cfquant-0.2.58}/LTtx/tx/Config.txt +0 -0
  192. {cfquant-0.2.56 → cfquant-0.2.58}/LTtx/tx/__init__.py +0 -0
  193. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/account_routing.py +0 -0
  194. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/channels.py +0 -0
  195. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/hub.py +0 -0
  196. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/logging_i18n.py +0 -0
  197. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/tests/test_trading_dates.py +0 -0
  198. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant/xtconstant.py +0 -0
  199. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant.egg-info/dependency_links.txt +0 -0
  200. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant.egg-info/entry_points.txt +0 -0
  201. {cfquant-0.2.56 → cfquant-0.2.58}/cfquant.egg-info/top_level.txt +0 -0
  202. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts/CFQUANT_CTYPE_ALL_LOWLAT.py +0 -0
  203. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts//345/220/214/350/264/246/345/217/267/347/213/254/347/253/213/345/270/202/345/234/272/CFQUANT_CTYPE_ALL_LOWLAT_SH.py" +0 -0
  204. {cfquant-0.2.56 → cfquant-0.2.58}/qmt_scripts//345/220/214/350/264/246/345/217/267/347/213/254/347/253/213/345/270/202/345/234/272/CFQUANT_CTYPE_ALL_LOWLAT_SZ.py" +0 -0
  205. {cfquant-0.2.56 → cfquant-0.2.58}/setup.cfg +0 -0
  206. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/avatars/amber-pulse.svg +0 -0
  207. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/avatars/copper-grid.svg +0 -0
  208. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/avatars/market-blue.svg +0 -0
  209. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/avatars/rose-circuit.svg +0 -0
  210. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/avatars/signal-green.svg +0 -0
  211. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/avatars/slate-wave.svg +0 -0
  212. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/avatars/teal-orbit.svg +0 -0
  213. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/avatars/violet-node.svg +0 -0
  214. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/favicon.svg +0 -0
  215. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-10.png +0 -0
  216. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-11.png +0 -0
  217. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-12.png +0 -0
  218. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-13.png +0 -0
  219. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-14.png +0 -0
  220. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-15.png +0 -0
  221. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-16.png +0 -0
  222. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-17.png +0 -0
  223. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-18.png +0 -0
  224. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-19.png +0 -0
  225. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-20.png +0 -0
  226. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-21.png +0 -0
  227. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-4.png +0 -0
  228. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-5.png +0 -0
  229. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-6.png +0 -0
  230. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-7.png +0 -0
  231. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-8.png +0 -0
  232. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-9.png +0 -0
  233. {cfquant-0.2.56 → cfquant-0.2.58}/web_dashboard/vendor/mermaid.min.js +0 -0
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 tao
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 tao
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -16,24 +16,24 @@ import datetime
16
16
  import importlib
17
17
  import subprocess
18
18
  import sys
19
- from packaging import version
20
-
21
- #运行需要的库
22
- DEFAULT_PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple"
23
-
24
-
25
- def _pip_index_args():
26
- index_url = os.environ.get("CFQUANT_PIP_INDEX_URL", DEFAULT_PIP_INDEX_URL).strip()
27
- return ["--index-url", index_url] if index_url else []
28
-
29
-
30
- need_packge = {
31
- 'psutil': {'pip_name': 'psutil', 'version': '1.0.0'},
32
- 'pandas': {'pip_name': 'pandas', 'version': '0.0.1'},
33
- 'tabulate': {'pip_name': 'tabulate', 'version': '0.0.1'},
34
- 'pandas_market_calendars': {'pip_name': 'pandas-market-calendars', 'version': '0.0.1'},
35
- 'pytz': {'pip_name': 'pytz', 'version': '0.0.0'},
36
- }
19
+ from packaging import version
20
+
21
+ #运行需要的库
22
+ DEFAULT_PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple"
23
+
24
+
25
+ def _pip_index_args():
26
+ index_url = os.environ.get("CFQUANT_PIP_INDEX_URL", DEFAULT_PIP_INDEX_URL).strip()
27
+ return ["--index-url", index_url] if index_url else []
28
+
29
+
30
+ need_packge = {
31
+ 'psutil': {'pip_name': 'psutil', 'version': '1.0.0'},
32
+ 'pandas': {'pip_name': 'pandas', 'version': '0.0.1'},
33
+ 'tabulate': {'pip_name': 'tabulate', 'version': '0.0.1'},
34
+ 'pandas_market_calendars': {'pip_name': 'pandas-market-calendars', 'version': '0.0.1'},
35
+ 'pytz': {'pip_name': 'pytz', 'version': '0.0.0'},
36
+ }
37
37
 
38
38
 
39
39
  def _hidden_subprocess_kwargs():
@@ -87,16 +87,16 @@ def ensure_modules_with_version(modules: dict):
87
87
  raise ImportError()
88
88
  else:
89
89
  print(f"[AutoInstall] {import_name} 已安装,版本为 {installed_version},满足要求")
90
- except ImportError:
91
- if os.environ.get("CFQUANT_MANAGEMENT_TOKEN_FILE"):
92
- raise RuntimeError("Managed cfquant requires %s; install it in the configured Python environment" % pip_name)
90
+ except ImportError:
91
+ if os.environ.get("CFQUANT_MANAGEMENT_TOKEN_FILE"):
92
+ raise RuntimeError("Managed cfquant requires %s; install it in the configured Python environment" % pip_name)
93
93
  # 安装或升级
94
- install_target = pip_name if required_version == "latest" else "%s>=%s" % (pip_name, required_version)
94
+ install_target = pip_name if required_version == "latest" else "%s>=%s" % (pip_name, required_version)
95
95
  print(f"[AutoInstall] 正在安装/升级 {pip_name} → {required_version}...")
96
96
  try:
97
- subprocess.check_call([
98
- sys.executable, "-m", "pip", "install", install_target,
99
- ] + _pip_index_args(), **_hidden_subprocess_kwargs())
97
+ subprocess.check_call([
98
+ sys.executable, "-m", "pip", "install", install_target,
99
+ ] + _pip_index_args(), **_hidden_subprocess_kwargs())
100
100
  print(f"[AutoInstall] 成功安装 {pip_name} {required_version}")
101
101
  except Exception as e:
102
102
  print(f"[AutoInstall] 安装 {pip_name} 失败: {e}")
@@ -190,26 +190,26 @@ def _ensure_lttx_dir(path):
190
190
  def _lttx_file_path(file_name):
191
191
  return os.path.join(_ensure_lttx_dir(_lttx_file_data_dir()), file_name)
192
192
 
193
- def _lttx_dataframe_path(var):
194
- return os.path.join(_ensure_lttx_dir(_lttx_dataframe_data_dir()), "%s.csv" % var)
195
-
196
- def _lttx_dict_var_path():
197
- configured = os.environ.get("CFQUANT_LTTX_DICT_VAR_FILE")
198
- if configured:
199
- return os.path.abspath(configured)
200
- return os.path.join(_ensure_lttx_dir(_lttx_runtime_dir()), "data0.txt")
201
-
202
- def _lttx_log_dir():
193
+ def _lttx_dataframe_path(var):
194
+ return os.path.join(_ensure_lttx_dir(_lttx_dataframe_data_dir()), "%s.csv" % var)
195
+
196
+ def _lttx_dict_var_path():
197
+ configured = os.environ.get("CFQUANT_LTTX_DICT_VAR_FILE")
198
+ if configured:
199
+ return os.path.abspath(configured)
200
+ return os.path.join(_ensure_lttx_dir(_lttx_runtime_dir()), "data0.txt")
201
+
202
+ def _lttx_log_dir():
203
203
  configured = os.environ.get("CFQUANT_LTTX_LOG_DIR")
204
204
  if configured:
205
205
  return os.path.abspath(configured)
206
- log_dir = os.environ.get("CFQUANT_LOG_DIR")
207
- if log_dir:
208
- return os.path.abspath(os.path.join(log_dir, "lttx"))
209
- home = os.environ.get("CFQUANT_HOME")
210
- if home:
211
- return os.path.abspath(os.path.join(home, "log", "lttx"))
212
- return os.path.join(_project_root(), "log", "lttx")
206
+ log_dir = os.environ.get("CFQUANT_LOG_DIR")
207
+ if log_dir:
208
+ return os.path.abspath(os.path.join(log_dir, "lttx"))
209
+ home = os.environ.get("CFQUANT_HOME")
210
+ if home:
211
+ return os.path.abspath(os.path.join(home, "log", "lttx"))
212
+ return os.path.join(_project_root(), "log", "lttx")
213
213
 
214
214
  def _cleanup_lttx_logs(log_dir):
215
215
  try:
@@ -239,7 +239,7 @@ def main_save_log():
239
239
  os.makedirs(log_dir, exist_ok=True)
240
240
  _cleanup_lttx_logs(log_dir)
241
241
  except:
242
- log_dir = os.path.join(_project_root(), "log", "lttx")
242
+ log_dir = os.path.join(_project_root(), "log", "lttx")
243
243
  try:
244
244
  os.makedirs(log_dir, exist_ok=True)
245
245
  except:
@@ -255,8 +255,8 @@ def main_save_log():
255
255
  f.write(str(data)+'\n')
256
256
 
257
257
  msg = '%s>>>>>>>[info] LTtx程序启动'%(time.strftime("%Y-%m-%d %H:%M:%S"))
258
- log_thread = threading.Thread(target=main_save_log, name="lttx-log-writer", daemon=True)
259
- log_thread.start()
258
+ log_thread = threading.Thread(target=main_save_log, name="lttx-log-writer", daemon=True)
259
+ log_thread.start()
260
260
 
261
261
  def close_con(client):
262
262
  try:
@@ -831,9 +831,9 @@ def main_test():
831
831
  except Exception as e:
832
832
  print(e)
833
833
 
834
- def load_dict_var():
835
- try:
836
- config_path = _lttx_dict_var_path()
834
+ def load_dict_var():
835
+ try:
836
+ config_path = _lttx_dict_var_path()
837
837
 
838
838
  # 尝试打开并读取 JSON 文件
839
839
  with open(config_path, 'r', encoding='utf-8') as f:
@@ -1054,9 +1054,9 @@ def make_dir():
1054
1054
  except:
1055
1055
  pass
1056
1056
 
1057
- def main_save_dict_var():
1058
- global dict_var_on, dict_var
1059
- file_path = _lttx_dict_var_path()
1057
+ def main_save_dict_var():
1058
+ global dict_var_on, dict_var
1059
+ file_path = _lttx_dict_var_path()
1060
1060
 
1061
1061
  while True:
1062
1062
  if dict_var_on:
@@ -1117,7 +1117,7 @@ def main():
1117
1117
  update_time = '2025-09-04'
1118
1118
  import multiprocessing
1119
1119
  config = load_config()
1120
- port = int(os.environ.get('CFQUANT_LTTX_PORT') or config['port'])
1120
+ port = int(os.environ.get('CFQUANT_LTTX_PORT') or config['port'])
1121
1121
  tocken = config['token']
1122
1122
  ip = get_local_ip()
1123
1123
  if tcp_port_open('127.0.0.1', port):
@@ -1169,11 +1169,11 @@ dict_client = {}
1169
1169
  dict_client_status = {}
1170
1170
  dict_var = load_dict_var()#保存云变量
1171
1171
 
1172
- if __name__ == '__main__':
1173
- if os.environ.get("CFQUANT_LTTX_BACKGROUND") != "1":
1174
- threading.Thread(target = main_control).start()
1175
- main()
1176
- # threading.Thread(target = main).start()
1172
+ if __name__ == '__main__':
1173
+ if os.environ.get("CFQUANT_LTTX_BACKGROUND") != "1":
1174
+ threading.Thread(target = main_control).start()
1175
+ main()
1176
+ # threading.Thread(target = main).start()
1177
1177
 
1178
1178
 
1179
1179
 
@@ -17,18 +17,18 @@ import datetime
17
17
  import sys
18
18
  import subprocess
19
19
  import importlib
20
- import pandas as pd
21
-
22
-
23
- DEFAULT_PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple"
24
-
25
-
26
- def _pip_index_args():
27
- index_url = os.environ.get("CFQUANT_PIP_INDEX_URL", DEFAULT_PIP_INDEX_URL).strip()
28
- return ["--index-url", index_url] if index_url else []
29
-
30
-
31
- def _hidden_subprocess_kwargs():
20
+ import pandas as pd
21
+
22
+
23
+ DEFAULT_PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple"
24
+
25
+
26
+ def _pip_index_args():
27
+ index_url = os.environ.get("CFQUANT_PIP_INDEX_URL", DEFAULT_PIP_INDEX_URL).strip()
28
+ return ["--index-url", index_url] if index_url else []
29
+
30
+
31
+ def _hidden_subprocess_kwargs():
32
32
  if os.name != "nt":
33
33
  return {}
34
34
  kwargs = {}
@@ -121,11 +121,11 @@ class txl:
121
121
  self.orjson_on = True
122
122
  return importlib.import_module(import_name)
123
123
  except ImportError:
124
- self.sys_price(f"[TxLink自动安装] 缺少依赖 {package_name},正在安装...请不要退出,安装完成后程序将正常运行")
125
- try:
126
- subprocess.check_call([
127
- sys.executable, "-m", "pip", "install", package_name,
128
- ] + _pip_index_args(), **_hidden_subprocess_kwargs())
124
+ self.sys_price(f"[TxLink自动安装] 缺少依赖 {package_name},正在安装...请不要退出,安装完成后程序将正常运行")
125
+ try:
126
+ subprocess.check_call([
127
+ sys.executable, "-m", "pip", "install", package_name,
128
+ ] + _pip_index_args(), **_hidden_subprocess_kwargs())
129
129
  self.orjson_on = True
130
130
  return importlib.import_module(import_name)
131
131
  except:
@@ -194,13 +194,13 @@ class txl:
194
194
  tx_log_dir = os.environ.get("CFQUANT_TX_LOG_DIR")
195
195
  if tx_log_dir:
196
196
  return os.path.abspath(tx_log_dir)
197
- log_dir = os.environ.get("CFQUANT_LOG_DIR")
198
- if log_dir:
199
- return os.path.abspath(os.path.join(log_dir, "lttx"))
200
- home = os.environ.get("CFQUANT_HOME")
201
- if home:
202
- return os.path.abspath(os.path.join(home, "log", "lttx"))
203
- return os.path.abspath(os.path.join(os.getcwd(), "log", "lttx"))
197
+ log_dir = os.environ.get("CFQUANT_LOG_DIR")
198
+ if log_dir:
199
+ return os.path.abspath(os.path.join(log_dir, "lttx"))
200
+ home = os.environ.get("CFQUANT_HOME")
201
+ if home:
202
+ return os.path.abspath(os.path.join(home, "log", "lttx"))
203
+ return os.path.abspath(os.path.join(os.getcwd(), "log", "lttx"))
204
204
 
205
205
  def delete_file(self,file_name):
206
206
  msg = '删除tx运行日志%s'%(file_name)
@@ -271,16 +271,16 @@ class txl:
271
271
  else:
272
272
  self.sys_print('当前版本已经是最新')
273
273
 
274
- def sys_print(self,data,show_force=False):
275
- msg = '%sLTtx[info]>>>>:%s,'%(self.get_nowtime(),data)
276
- if self.sys_print_on or show_force:
277
- print(msg)
278
- self.save_log(msg)
279
-
280
- def sys_price(self,data,show_force=False):
281
- return self.sys_print(data,show_force=show_force)
282
-
283
- def send_file(self,file_name,show_on=True):
274
+ def sys_print(self,data,show_force=False):
275
+ msg = '%sLTtx[info]>>>>:%s,'%(self.get_nowtime(),data)
276
+ if self.sys_print_on or show_force:
277
+ print(msg)
278
+ self.save_log(msg)
279
+
280
+ def sys_price(self,data,show_force=False):
281
+ return self.sys_print(data,show_force=show_force)
282
+
283
+ def send_file(self,file_name,show_on=True):
284
284
  '''
285
285
  将本地文件上传至数据中心
286
286
 
@@ -1,55 +1,55 @@
1
- include README.md
2
- include requirements.txt
3
- include cfquant_web_server.py
4
- include cfquant_pipe_hub.py
5
-
6
- recursive-include cfquant *.py
7
- include cfquant/qmt_component_agent.js
8
- recursive-include cfquant/tests *.py *.md
9
- recursive-include LTtx *.py
10
- include LTtx/tx/Config.txt
11
-
12
- recursive-include web_dashboard *.html *.css *.js *.svg *.png
13
- recursive-include qmt_scripts *.py *.md
14
-
15
- recursive-exclude LTtx/tx/__pycache__ *
16
- recursive-exclude LTtx/tx/log_data *
17
- recursive-exclude LTtx/tx/tx_log *
18
- recursive-exclude runtime *
19
- recursive-exclude log *
20
- recursive-exclude docs *
21
- recursive-exclude scripts *
22
- recursive-exclude log_data *
23
- recursive-exclude tx_log *
24
- recursive-exclude reports *
25
- recursive-exclude dataframe_data *
26
- recursive-exclude file_data *
27
- recursive-exclude official_site *
28
- recursive-exclude offcial_site *
29
- recursive-exclude remotion_intro *
30
- recursive-exclude pip_library_dev *
31
- recursive-exclude .cfquant_project_updates *
32
- recursive-exclude .cfquant_updates *
33
- recursive-exclude .updates *
34
- recursive-exclude .cfquant_ops *
35
- recursive-exclude .pytest_cache *
36
- recursive-exclude .playwright-cli *
37
- recursive-exclude .local_archive *
38
- recursive-exclude .vscode *
39
-
40
- exclude AGENTS.md
41
- exclude .gitignore
42
- exclude *.bat
43
- exclude *.log
44
- exclude *.db
45
- exclude *.sqlite
46
- exclude *.sqlite3
47
- exclude *.mp4
48
- exclude *.mov
49
- exclude *.avi
50
- exclude *.mkv
51
- exclude *.webm
52
- exclude LTtx/tx/data0.txt
53
- global-exclude __pycache__/*
54
- global-exclude *.py[cod]
55
- global-exclude *.pyo
1
+ include README.md
2
+ include requirements.txt
3
+ include cfquant_web_server.py
4
+ include cfquant_pipe_hub.py
5
+
6
+ recursive-include cfquant *.py
7
+ include cfquant/qmt_component_agent.js
8
+ recursive-include cfquant/tests *.py *.md
9
+ recursive-include LTtx *.py
10
+ include LTtx/tx/Config.txt
11
+
12
+ recursive-include web_dashboard *.html *.css *.js *.svg *.png
13
+ recursive-include qmt_scripts *.py *.md
14
+
15
+ recursive-exclude LTtx/tx/__pycache__ *
16
+ recursive-exclude LTtx/tx/log_data *
17
+ recursive-exclude LTtx/tx/tx_log *
18
+ recursive-exclude runtime *
19
+ recursive-exclude log *
20
+ recursive-exclude docs *
21
+ recursive-exclude scripts *
22
+ recursive-exclude log_data *
23
+ recursive-exclude tx_log *
24
+ recursive-exclude reports *
25
+ recursive-exclude dataframe_data *
26
+ recursive-exclude file_data *
27
+ recursive-exclude official_site *
28
+ recursive-exclude offcial_site *
29
+ recursive-exclude remotion_intro *
30
+ recursive-exclude pip_library_dev *
31
+ recursive-exclude .cfquant_project_updates *
32
+ recursive-exclude .cfquant_updates *
33
+ recursive-exclude .updates *
34
+ recursive-exclude .cfquant_ops *
35
+ recursive-exclude .pytest_cache *
36
+ recursive-exclude .playwright-cli *
37
+ recursive-exclude .local_archive *
38
+ recursive-exclude .vscode *
39
+
40
+ exclude AGENTS.md
41
+ exclude .gitignore
42
+ exclude *.bat
43
+ exclude *.log
44
+ exclude *.db
45
+ exclude *.sqlite
46
+ exclude *.sqlite3
47
+ exclude *.mp4
48
+ exclude *.mov
49
+ exclude *.avi
50
+ exclude *.mkv
51
+ exclude *.webm
52
+ exclude LTtx/tx/data0.txt
53
+ global-exclude __pycache__/*
54
+ global-exclude *.py[cod]
55
+ global-exclude *.pyo
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cfquant
3
- Version: 0.2.56
3
+ Version: 0.2.58
4
4
  Summary: QMT local bridge and xtquant-compatible Python client.
5
5
  License: MIT
6
6
  Requires-Python: >=3.8
@@ -9,6 +9,7 @@ License-File: LICENSE
9
9
  Requires-Dist: pandas>=1.0
10
10
  Requires-Dist: packaging>=20
11
11
  Requires-Dist: psutil>=5.8
12
+ Requires-Dist: tomli>=1.1.0; python_version < "3.11"
12
13
  Requires-Dist: pycryptodome>=3.20
13
14
  Requires-Dist: pytz
14
15
  Requires-Dist: tabulate
@@ -393,6 +394,7 @@ restart_cfquant.bat 重启
393
394
  |---|---|
394
395
  | QMT 综合部署教程 | [QMT 部署教程](docs/QMT部署教程.md) |
395
396
  | cftrader 批量同步/异步下单与撤单 | [cftrader 批量交易与撤单](docs/cftrader批量交易.md),含 100 单本地基准 |
397
+ | cftrader TWAP / VWAP / POV | [算法交易与共享全推行情](docs/algorithm_trading.md),含自动订阅、生命周期和接口示例 |
396
398
  | 通用模式部署 | [通用模式部署指南](docs/通用模式部署指南.md) |
397
399
  | 极致模式部署 | [极致模式部署指南](docs/极致模式部署指南.md) |
398
400
  | 高级模式部署 | [高级模式部署指南](docs/高级模式部署指南.md) |
@@ -184,7 +184,7 @@ cfquant run
184
184
 
185
185
  - 源码部署后,网页里的“版本/更新”功能会按完整项目目录更新,适合从官网或 GitHub 拉取新版本。
186
186
  - 更新时会尽量保留本地配置、数据库、日志和运行目录,便于日常升级和回滚。
187
- - 完整项目更新会先关闭已绑定且正在运行的 QMT,按绑定模式覆盖 `qmt_scripts/` 里的入口脚本,然后重启对应 QMT 策略。
187
+ - 完整项目更新会先关闭已绑定且正在运行的 QMT,按绑定模式覆盖 `qmt_scripts/` 里的入口脚本,然后重启对应 QMT 策略。
188
188
  - 建议把源码目录固定下来,例如 `D:\cfquant`,不要频繁挪动目录。
189
189
 
190
190
  新用户建议先使用**通用模式**。所有部署配置都在 Web 控制台完成,保存绑定后系统会自动准备并管理 QMT 托管策略。
@@ -317,11 +317,11 @@ trader.disconnect()
317
317
 
318
318
  ### 回调和接口差异
319
319
 
320
- `XtQuantTrader`、`StockAccount`、常用行情查询和交易方法保持接近 `xtquant` 的调用方式,原有回调类通常可以继续使用。仍有部分 QMT 专有接口、字段和返回结构存在兼容边界,使用前请查看 [xtquant 原版接口适配清单](docs/xtquant原版接口适配清单.md) 和 [QMT 函数封装能力清单](docs/QMT函数封装能力清单.md)。
321
-
322
- 账号订阅成功后,SDK 会在后台约每两秒重新确认订阅。用户程序保持运行时,QMT、cfquant Web 或通信服务重启后,待桥接策略恢复授权、通道可用,SDK 会自动恢复该账号的新回调;默认 Web 路由和直接 Pipe/LTtx 连接均适用。主动 `unsubscribe(account)` 后不会再恢复该账号,`stop()` / `disconnect()` 会停止后台恢复。此机制只恢复账号订阅,不补发停机期间的回调,也不重试委托或撤单。升级 SDK 后需先重启一次用户程序加载新代码,此后无需随 QMT 重启用户程序。
323
-
324
- 推荐迁移顺序:**行情查询 → 资金/持仓 → 回调 → 模拟委托 → 模拟撤单 → 正式策略**。每一步都先在 Web 控制台接口测试和日志中确认,再进入下一步。
320
+ `XtQuantTrader`、`StockAccount`、常用行情查询和交易方法保持接近 `xtquant` 的调用方式,原有回调类通常可以继续使用。仍有部分 QMT 专有接口、字段和返回结构存在兼容边界,使用前请查看 [xtquant 原版接口适配清单](docs/xtquant原版接口适配清单.md) 和 [QMT 函数封装能力清单](docs/QMT函数封装能力清单.md)。
321
+
322
+ 账号订阅成功后,SDK 会在后台约每两秒重新确认订阅。用户程序保持运行时,QMT、cfquant Web 或通信服务重启后,待桥接策略恢复授权、通道可用,SDK 会自动恢复该账号的新回调;默认 Web 路由和直接 Pipe/LTtx 连接均适用。主动 `unsubscribe(account)` 后不会再恢复该账号,`stop()` / `disconnect()` 会停止后台恢复。此机制只恢复账号订阅,不补发停机期间的回调,也不重试委托或撤单。升级 SDK 后需先重启一次用户程序加载新代码,此后无需随 QMT 重启用户程序。
323
+
324
+ 推荐迁移顺序:**行情查询 → 资金/持仓 → 回调 → 模拟委托 → 模拟撤单 → 正式策略**。每一步都先在 Web 控制台接口测试和日志中确认,再进入下一步。
325
325
 
326
326
  ## Web 控制台
327
327
 
@@ -369,6 +369,7 @@ restart_cfquant.bat 重启
369
369
  |---|---|
370
370
  | QMT 综合部署教程 | [QMT 部署教程](docs/QMT部署教程.md) |
371
371
  | cftrader 批量同步/异步下单与撤单 | [cftrader 批量交易与撤单](docs/cftrader批量交易.md),含 100 单本地基准 |
372
+ | cftrader TWAP / VWAP / POV | [算法交易与共享全推行情](docs/algorithm_trading.md),含自动订阅、生命周期和接口示例 |
372
373
  | 通用模式部署 | [通用模式部署指南](docs/通用模式部署指南.md) |
373
374
  | 极致模式部署 | [极致模式部署指南](docs/极致模式部署指南.md) |
374
375
  | 高级模式部署 | [高级模式部署指南](docs/高级模式部署指南.md) |
@@ -9,31 +9,31 @@ cfquant: 面向 QMT 的 xtquant 兼容层。
9
9
  from cfquant.xttype import StockAccount
10
10
  """
11
11
 
12
- from . import xtconstant, xtdata, xttrader, xttype
13
- from . import cftrader
12
+ from . import xtconstant, xtdata, xttrader, xttype
13
+ from . import cftrader
14
14
  from .client import CfquantError, CfquantTimeout, configure, get_client
15
- from .version import __version__
16
- from .build_info import build_identity, get_git_commit
17
-
18
- _BUILD_IDENTITY = build_identity(__version__)
19
- GIT_COMMIT = _BUILD_IDENTITY["git_commit"]
20
- SHORT_GIT_COMMIT = _BUILD_IDENTITY["short_commit"]
21
- BUILD_VERSION = _BUILD_IDENTITY["build_version"]
15
+ from .version import __version__
16
+ from .build_info import build_identity, get_git_commit
17
+
18
+ _BUILD_IDENTITY = build_identity(__version__)
19
+ GIT_COMMIT = _BUILD_IDENTITY["git_commit"]
20
+ SHORT_GIT_COMMIT = _BUILD_IDENTITY["short_commit"]
21
+ BUILD_VERSION = _BUILD_IDENTITY["build_version"]
22
22
 
23
23
  __all__ = [
24
24
  "xtconstant",
25
25
  "xtdata",
26
- "xttrader",
27
- "cftrader",
26
+ "xttrader",
27
+ "cftrader",
28
28
  "xttype",
29
29
  "configure",
30
30
  "get_client",
31
31
  "CfquantError",
32
32
  "CfquantTimeout",
33
- "__version__",
34
- "GIT_COMMIT",
35
- "SHORT_GIT_COMMIT",
36
- "BUILD_VERSION",
37
- "get_git_commit",
38
- "build_identity",
39
- ]
33
+ "__version__",
34
+ "GIT_COMMIT",
35
+ "SHORT_GIT_COMMIT",
36
+ "BUILD_VERSION",
37
+ "get_git_commit",
38
+ "build_identity",
39
+ ]