cfquant 0.2.36__tar.gz → 0.2.37__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.36 → cfquant-0.2.37}/PKG-INFO +1 -1
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/qmt_strategy_deploy.py +10 -12
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_qmt_strategy_deploy.py +11 -3
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/version.py +2 -2
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant.egg-info/PKG-INFO +1 -1
- {cfquant-0.2.36 → cfquant-0.2.37}/pyproject.toml +1 -1
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/app.js +1 -1
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/index.html +2 -2
- {cfquant-0.2.36 → cfquant-0.2.37}/LICENSE +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/LTtx/__init__.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/LTtx/tx/Config.txt +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/LTtx/tx/LTtx_server.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/LTtx/tx/__init__.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/LTtx/tx/tx.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/MANIFEST.in +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/README.md +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/__init__.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/_editable_install.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/account_routing.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/batch_orders.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/cftrader.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/channels.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/cli.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/client.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/config.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/hub.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/level2.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/log_management.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/logging_i18n.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/normal_bridge.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/order_meta.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/pipe_bridge.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/pipe_client.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/pipe_hub.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/pipe_transport.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/protocol.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/qmt_bridge.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/qmt_strategy_package.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/qmt_strategy_runtime.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/runtime_report.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/12_/350/256/242/345/215/225/345/244/207/346/263/250/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/16_/345/220/257/345/212/250/345/256/211/350/243/205/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/1_/350/241/214/346/203/205/346/216/245/346/224/266/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/22_/350/277/236/346/216/245/350/257/212/346/226/255/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/23_/347/244/272/344/276/213/351/205/215/347/275/256/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/26_/345/205/250/346/216/250/350/256/242/351/230/205/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/28_Level2/346/216/245/345/217/243/351/200/202/351/205/215/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/29_Level2/350/241/214/346/203/205/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/2_/346/225/260/346/215/256/350/216/267/345/217/226/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/32_/345/274/202/346/255/245/344/270/213/345/215/225/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/3_/346/225/260/346/215/256/344/270/213/350/275/275/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/5_/347/234/237/345/256/236/344/270/213/345/215/225/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/6_/345/233/236/350/260/203/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/9_/345/217/257/346/222/244/350/256/242/345/215/225/346/265/213/350/257/225.py" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/_helpers.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/readme.md +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_api_tester_browser.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_api_tester_web.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_binding_delete_confirmation.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_cftrader.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_cftrader_tutorial.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_cftrader_web.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_credit_compat.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_json_serialization.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_log_management.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_management_batch.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_project_updater.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_python_api_reference.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_qmt_strategy_browser.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_qmt_strategy_web.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_tutorial_reader.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tests/test_tx_auto_import.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tx.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/tx_trade_bridge.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/xtconstant.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/xtdata.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/xttrader.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant/xttype.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant.egg-info/SOURCES.txt +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant.egg-info/dependency_links.txt +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant.egg-info/entry_points.txt +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant.egg-info/requires.txt +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant.egg-info/top_level.txt +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant_pipe_hub.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/cfquant_web_server.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/qmt_scripts/CFQUANT.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/qmt_scripts/CFQUANT_CTYPE_ALL_LOWLAT.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/qmt_scripts/CFQUANT_LITE.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/qmt_scripts/CFQUANT_TRADE_LOWLAT.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/qmt_scripts/__init__.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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.36 → cfquant-0.2.37}/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.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/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" +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/requirements.txt +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/setup.cfg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/__init__.py +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/api-tester.js +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/avatars/amber-pulse.svg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/avatars/copper-grid.svg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/avatars/market-blue.svg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/avatars/rose-circuit.svg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/avatars/signal-green.svg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/avatars/slate-wave.svg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/avatars/teal-orbit.svg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/avatars/violet-node.svg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/cftrader-api-data.js +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/favicon.svg +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-10.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-11.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-12.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-13.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-14.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-15.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-16.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-17.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-18.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-19.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-20.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-21.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-4.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-5.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-6.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-7.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-8.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/image/qmt_deploy/image-9.png +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/python-api-data.js +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/python-api.js +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/styles.css +0 -0
- {cfquant-0.2.36 → cfquant-0.2.37}/web_dashboard/vendor/mermaid.min.js +0 -0
|
@@ -188,17 +188,15 @@ def _model_items(document):
|
|
|
188
188
|
return section, list(section.getElementsByTagName("item"))
|
|
189
189
|
|
|
190
190
|
|
|
191
|
-
def _strategy_slot_name(account_id, role="normal"):
|
|
192
|
-
"""Return a deterministic name
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
""
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
suffix = "_%s" % market if market in ("SH", "SZ") else ""
|
|
201
|
-
return ("CFQ_%s%s" % (account, suffix))[:64]
|
|
191
|
+
def _strategy_slot_name(account_id, mode="ctypes", role="normal"):
|
|
192
|
+
"""Return a deterministic, mode-specific name in cfquant's namespace."""
|
|
193
|
+
account = re.sub(r"[^A-Z0-9]+", "_", str(account_id or "").upper()).strip("_") or "ACCOUNT"
|
|
194
|
+
if len(account) > 20:
|
|
195
|
+
account = account[-5:]
|
|
196
|
+
mode = normalize_strategy_mode(mode).upper()
|
|
197
|
+
market = str(role or "normal").upper()
|
|
198
|
+
suffix = "_%s" % market if market in ("SH", "SZ") else ""
|
|
199
|
+
return ("CFQ_%s_%s%s" % (account, mode, suffix))[:64]
|
|
202
200
|
|
|
203
201
|
|
|
204
202
|
def _is_managed_strategy_name(name):
|
|
@@ -533,7 +531,7 @@ class QmtStrategyManager:
|
|
|
533
531
|
for role in group["roles"]:
|
|
534
532
|
old_role = previous_roles.get(role["role"])
|
|
535
533
|
old_name = old_role.get("name") if isinstance(old_role, dict) else ""
|
|
536
|
-
expected_name = _strategy_slot_name(row["account_id"], role["role"])
|
|
534
|
+
expected_name = _strategy_slot_name(row["account_id"], mode, role["role"])
|
|
537
535
|
if old_name == expected_name:
|
|
538
536
|
role_names[role["role"]] = old_name
|
|
539
537
|
else:
|
|
@@ -14,6 +14,7 @@ from cfquant.qmt_strategy_deploy import (
|
|
|
14
14
|
QmtStrategyManager, _account_binding, _atomic_write, _read_document,
|
|
15
15
|
_write_json, _resolve_account_binding, account_qmt_roots, managed_source, normalize_strategy_settings,
|
|
16
16
|
normalize_strategy_mode,
|
|
17
|
+
_strategy_slot_name,
|
|
17
18
|
)
|
|
18
19
|
from cfquant.qmt_strategy_package import _cipher, build_package
|
|
19
20
|
from cfquant.qmt_strategy_runtime import _CqStrategyLease
|
|
@@ -29,6 +30,11 @@ def test_strategy_mode_aliases_are_canonical(value, expected):
|
|
|
29
30
|
assert normalize_strategy_mode(value) == expected
|
|
30
31
|
|
|
31
32
|
|
|
33
|
+
def test_strategy_name_contains_mode_and_shortens_long_account():
|
|
34
|
+
name = _strategy_slot_name("ACCOUNT-12345678901234567890", "lite")
|
|
35
|
+
assert name == "CFQ_67890_LITE"
|
|
36
|
+
|
|
37
|
+
|
|
32
38
|
@pytest.fixture
|
|
33
39
|
def deployment(tmp_path):
|
|
34
40
|
root = tmp_path / "QMT"
|
|
@@ -261,7 +267,9 @@ def test_switch_and_delete_revoke_old_generation_and_disable_its_model(deploymen
|
|
|
261
267
|
manager.configure(row, infos)
|
|
262
268
|
new = next(iter(manager.jobs.values()))
|
|
263
269
|
assert old["generation"] != new["generation"]
|
|
264
|
-
assert old["roles"][0]["name"]
|
|
270
|
+
assert old["roles"][0]["name"] != new["roles"][0]["name"]
|
|
271
|
+
assert old["roles"][0]["name"].endswith("_CTYPES")
|
|
272
|
+
assert new["roles"][0]["name"].endswith("_LITE")
|
|
265
273
|
assert json.loads(Path(old["control_path"]).read_text())["mode"] == "lite"
|
|
266
274
|
running[0] = False
|
|
267
275
|
manager.process_once()
|
|
@@ -289,7 +297,7 @@ def test_historical_generated_name_is_disabled_for_the_same_account(deployment):
|
|
|
289
297
|
manager.configure(row, infos)
|
|
290
298
|
manager.process_once()
|
|
291
299
|
assert models(root)["CFQ_CTYPES_DEADBEEF_NORMAL"].getAttribute("startupAutorun") == "0"
|
|
292
|
-
assert next(iter(manager.jobs.values()))["roles"][0]["name"] == "CFQ_%
|
|
300
|
+
assert next(iter(manager.jobs.values()))["roles"][0]["name"] == "CFQ_%s_CTYPES" % ACCOUNT
|
|
293
301
|
|
|
294
302
|
|
|
295
303
|
def test_independent_identity_for_two_accounts_in_one_qmt(deployment):
|
|
@@ -501,7 +509,7 @@ def test_market_routes_only_import_market_entries_and_use_their_own_stock(deploy
|
|
|
501
509
|
for role in job["roles"]:
|
|
502
510
|
model = models(root)[role["name"]]
|
|
503
511
|
assert model.getAttribute("stock") == {"SH": "SH000300", "SZ": "SZ399001"}[role["role"]]
|
|
504
|
-
assert {role["name"] for role in job["roles"]} == {"CFQ_%
|
|
512
|
+
assert {role["name"] for role in job["roles"]} == {"CFQ_%s_CTYPES_SH" % ACCOUNT, "CFQ_%s_CTYPES_SZ" % ACCOUNT}
|
|
505
513
|
|
|
506
514
|
|
|
507
515
|
def descriptor(tmp_path, generation, role="normal"):
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>cfquant 控制台</title>
|
|
7
7
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
|
8
|
-
<link rel="stylesheet" href="/styles.css?v=
|
|
8
|
+
<link rel="stylesheet" href="/styles.css?v=web_20260922_04">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="webAuthOverlay" class="auth-overlay hidden" aria-live="polite">
|
|
@@ -3202,7 +3202,7 @@ else:
|
|
|
3202
3202
|
<script src="/cftrader-api-data.js?v=20260911_02"></script>
|
|
3203
3203
|
<script src="/api-tester.js?v=20260916_apikey_01"></script>
|
|
3204
3204
|
<script src="/python-api.js?v=20260911_api_test_01"></script>
|
|
3205
|
-
<script src="/app.js?v=
|
|
3205
|
+
<script src="/app.js?v=web_20260922_04"></script>
|
|
3206
3206
|
</body>
|
|
3207
3207
|
</html>
|
|
3208
3208
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|