cfquant 0.2.57__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.
- {cfquant-0.2.57 → cfquant-0.2.58}/LICENSE +21 -21
- {cfquant-0.2.57 → cfquant-0.2.58}/LTtx/tx/LTtx_server.py +57 -57
- {cfquant-0.2.57 → cfquant-0.2.58}/LTtx/tx/tx.py +34 -34
- {cfquant-0.2.57 → cfquant-0.2.58}/MANIFEST.in +55 -55
- {cfquant-0.2.57 → cfquant-0.2.58}/PKG-INFO +2 -1
- {cfquant-0.2.57 → cfquant-0.2.58}/README.md +7 -6
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/__init__.py +18 -18
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/_editable_install.py +585 -585
- cfquant-0.2.58/cfquant/algo.py +517 -0
- cfquant-0.2.58/cfquant/algo_broker.py +219 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/batch_orders.py +418 -418
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/build_info.py +67 -67
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/callback_dispatcher.py +218 -218
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/cftrader.py +200 -137
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/cli.py +400 -400
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/client.py +147 -143
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/config.py +6 -6
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/diagnostics.py +126 -126
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/flow_control.py +171 -171
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/level2.py +197 -197
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/log_management.py +118 -118
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/management.py +468 -468
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/normal_bridge.py +1662 -1563
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/order_identity.py +190 -190
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/order_meta.py +819 -819
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/pipe_bridge.py +87 -87
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/pipe_client.py +76 -76
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/pipe_hub.py +651 -651
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/pipe_transport.py +286 -286
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/protocol.py +323 -323
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_binding_settings.py +39 -39
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_bridge.py +1848 -1843
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_component_agent.js +258 -258
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_component_login.py +389 -389
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_credentials.py +78 -78
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_dependencies.py +158 -158
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_pipe_runtime.py +189 -189
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_strategy_deploy.py +342 -342
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_strategy_package.py +69 -69
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_strategy_runtime.py +253 -253
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/qmt_update.py +366 -366
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/quote_history.py +122 -122
- cfquant-0.2.58/cfquant/quote_leases.py +69 -0
- cfquant-0.2.58/cfquant/quote_service.py +186 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/remote_adapter.py +265 -265
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/remote_management.py +407 -407
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/remote_supervisor.py +120 -120
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/rpc_timing.py +61 -61
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/runtime_report.py +371 -371
- cfquant-0.2.58/cfquant/shared_quotes.py +347 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/stock_connect.py +80 -80
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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 -434
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/29_Level2/350/241/214/346/203/205/346/265/213/350/257/225.py +114 -114
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/6_/345/233/236/350/260/203/346/265/213/350/257/225.py +614 -614
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/_helpers.py +64 -64
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/readme.md +202 -202
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_account_query_timing.py +131 -131
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_advanced_parity.py +153 -153
- cfquant-0.2.58/cfquant/tests/test_algo.py +293 -0
- cfquant-0.2.58/cfquant/tests/test_algo_broker.py +107 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_api_tester_browser.py +334 -334
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_api_tester_web.py +209 -209
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_binding_delete_confirmation.py +91 -91
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_binding_live_refresh_browser.py +95 -95
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_binding_runtime_browser.py +115 -109
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_callback_recovery.py +287 -287
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_callback_requests.py +298 -298
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_cftrader.py +626 -626
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_cftrader_tutorial.py +283 -182
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_cftrader_web.py +261 -261
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_credit_compat.py +452 -452
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_dataframe_encoding.py +192 -192
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_json_serialization.py +186 -186
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_latency_flow_control.py +610 -601
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_lite_account_routing.py +128 -128
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_lite_deployment_paths.py +179 -179
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_lite_parity.py +140 -140
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_lite_qmt_dispatch.py +348 -348
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_local_trading_calendar.py +154 -154
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_log_management.py +56 -56
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_management.py +486 -486
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_management_batch.py +55 -55
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_market_data_fallback.py +52 -52
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_market_timing.py +238 -238
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_order_identity.py +212 -212
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_order_time_callback.py +71 -71
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_project_updater.py +210 -210
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_python_api_reference.py +88 -88
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_auto_login_browser.py +286 -286
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_auto_login_integration.py +474 -474
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_binding_settings.py +137 -123
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_component_login.py +347 -347
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_dependencies.py +107 -107
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_fileless.py +408 -408
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_strategy_browser.py +584 -584
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_strategy_deploy.py +973 -973
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_strategy_web.py +439 -439
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_qmt_update.py +74 -74
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_quote_latency.py +225 -235
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_quote_latency_encoding.py +107 -107
- cfquant-0.2.58/cfquant/tests/test_quote_service.py +177 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_remote_management.py +352 -352
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_remote_management_browser.py +40 -40
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_remote_version_check.py +72 -72
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_setup_qmt_prompt.py +99 -99
- cfquant-0.2.58/cfquant/tests/test_shared_quotes.py +199 -0
- cfquant-0.2.58/cfquant/tests/test_shared_quotes_generated.py +35 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_startup_recovery.py +62 -62
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_stock_connect.py +250 -250
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_stock_connect_browser.py +24 -24
- cfquant-0.2.58/cfquant/tests/test_subscription_congestion.py +120 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_table_conversion.py +122 -122
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_trade_strategy_callback.py +273 -273
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_trader_subscription_recovery.py +452 -345
- cfquant-0.2.58/cfquant/tests/test_trading_monitor.py +533 -0
- cfquant-0.2.58/cfquant/tests/test_trading_monitor_browser.py +217 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_tutorial_reader.py +326 -322
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_tx_auto_import.py +26 -26
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_tx_shutdown.py +377 -377
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/trading_calendar.py +107 -107
- cfquant-0.2.58/cfquant/trading_monitor.py +557 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tx.py +1984 -1984
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tx_trade_bridge.py +326 -310
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/version.py +5 -5
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/xtdata.py +245 -235
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/xttrader.py +247 -243
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/xttype.py +1409 -1409
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant.egg-info/PKG-INFO +2 -1
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant.egg-info/SOURCES.txt +15 -2
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant_pipe_hub.py +39 -39
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant_web_server.py +567 -366
- {cfquant-0.2.57 → cfquant-0.2.58}/pyproject.toml +63 -63
- {cfquant-0.2.57 → cfquant-0.2.58}/qmt_scripts/CFQUANT.py +127 -127
- {cfquant-0.2.57 → cfquant-0.2.58}/qmt_scripts/CFQUANT_LITE.py +495 -28
- {cfquant-0.2.57 → cfquant-0.2.58}/qmt_scripts/CFQUANT_TRADE_LOWLAT.py +84 -84
- {cfquant-0.2.57 → cfquant-0.2.58}/qmt_scripts/__init__.py +1 -1
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → cfquant-0.2.58}/requirements.txt +16 -16
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/__init__.py +1 -1
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/api-tester.js +206 -206
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/app.js +15078 -15028
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/cftrader-api-data.js +249 -176
- cfquant-0.2.58/web_dashboard/docs.js +79 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/index.html +3463 -3344
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/python-api-data.js +8 -8
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/python-api.js +257 -256
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/remote-management.js +52 -52
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/styles.css +443 -339
- cfquant-0.2.58/web_dashboard/trading-monitor.js +282 -0
- cfquant-0.2.57/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
- cfquant-0.2.57/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
- cfquant-0.2.57/web_dashboard/docs.js +0 -48
- {cfquant-0.2.57 → cfquant-0.2.58}/LTtx/__init__.py +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/LTtx/tx/Config.txt +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/LTtx/tx/__init__.py +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/account_routing.py +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/channels.py +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/hub.py +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/logging_i18n.py +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/tests/test_trading_dates.py +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant/xtconstant.py +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant.egg-info/dependency_links.txt +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant.egg-info/entry_points.txt +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant.egg-info/requires.txt +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/cfquant.egg-info/top_level.txt +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/qmt_scripts/CFQUANT_CTYPE_ALL_LOWLAT.py +0 -0
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → 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
- {cfquant-0.2.57 → cfquant-0.2.58}/setup.cfg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/avatars/amber-pulse.svg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/avatars/copper-grid.svg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/avatars/market-blue.svg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/avatars/rose-circuit.svg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/avatars/signal-green.svg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/avatars/slate-wave.svg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/avatars/teal-orbit.svg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/avatars/violet-node.svg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/favicon.svg +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-10.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-11.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-12.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-13.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-14.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-15.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-16.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-17.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-18.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-19.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-20.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-21.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-4.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-5.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-6.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-7.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-8.png +0 -0
- {cfquant-0.2.57 → cfquant-0.2.58}/web_dashboard/image/qmt_deploy/image-9.png +0 -0
- {cfquant-0.2.57 → 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.
|
|
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
|
|
@@ -394,6 +394,7 @@ restart_cfquant.bat 重启
|
|
|
394
394
|
|---|---|
|
|
395
395
|
| QMT 综合部署教程 | [QMT 部署教程](docs/QMT部署教程.md) |
|
|
396
396
|
| cftrader 批量同步/异步下单与撤单 | [cftrader 批量交易与撤单](docs/cftrader批量交易.md),含 100 单本地基准 |
|
|
397
|
+
| cftrader TWAP / VWAP / POV | [算法交易与共享全推行情](docs/algorithm_trading.md),含自动订阅、生命周期和接口示例 |
|
|
397
398
|
| 通用模式部署 | [通用模式部署指南](docs/通用模式部署指南.md) |
|
|
398
399
|
| 极致模式部署 | [极致模式部署指南](docs/极致模式部署指南.md) |
|
|
399
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
|
+
]
|