From 69c6c5633ae130db717c504d190781da1275da10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E5=BE=AE?= Date: Thu, 2 Jul 2026 00:57:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=AD=B9=E7=A0=81S/R=E9=9B=86=E6=88=90?= =?UTF-8?q?=E5=88=B0reassess=5Fstrategy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - calc_chip_sr(): 从筹码分布计算支撑/阻力 - reassess_strategy新增筹码S/R输出+共振检测 - 止损用枢轴(短期),目标参考筹码(中线) - 两者差距<3%时标记共振⚡ --- .../strategy_lifecycle.cpython-312.pyc | Bin 85154 -> 88523 bytes data/chip_cache/000657.json | 2 +- data/chip_cache/000700.json | 2 +- data/chip_cache/000711.json | 2 +- data/chip_cache/001309.json | 2 +- data/chip_cache/002594.json | 2 +- data/chip_cache/01070.json | 2 +- data/chip_cache/01088.json | 2 +- data/chip_cache/01211.json | 2 +- data/chip_cache/01478.json | 2 +- data/chip_cache/01888.json | 2 +- data/chip_cache/02202.json | 2 +- data/chip_cache/02318.json | 2 +- data/chip_cache/02359.json | 2 +- data/chip_cache/02388.json | 2 +- data/chip_cache/02628.json | 2 +- data/chip_cache/06160.json | 2 +- data/chip_cache/06869.json | 2 +- data/chip_cache/09868.json | 2 +- data/chip_cache/09988.json | 2 +- data/chip_cache/300035.json | 2 +- data/chip_cache/300124.json | 2 +- data/chip_cache/300308.json | 2 +- data/chip_cache/300548.json | 2 +- data/chip_cache/300750.json | 2 +- data/chip_cache/301308.json | 2 +- data/chip_cache/518880.json | 2 +- data/chip_cache/600519.json | 2 +- data/chip_cache/600563.json | 2 +- data/chip_cache/601318.json | 2 +- data/chip_cache/601899.json | 2 +- data/chip_cache/688411.json | 2 +- data/chip_cache/688630.json | 2 +- data/chip_cache/688639.json | 2 +- data/price_history.json | 66 +++++++++++++++++ scripts/chip_factors.py | 2 +- strategy_lifecycle.py | 68 ++++++++++++++++++ 37 files changed, 168 insertions(+), 34 deletions(-) diff --git a/__pycache__/strategy_lifecycle.cpython-312.pyc b/__pycache__/strategy_lifecycle.cpython-312.pyc index ca22d5f1494f068670581a0e4e214e452f816a22..0555d229600ed6a54c949f54d99678c068abbce5 100644 GIT binary patch delta 16384 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 X1nE}|bH@p9jtiVSS^MTB0`PwUrFpyh delta 13479 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

jXn!KJ* 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 OFML6f?#)61@P7cTUk)w+ diff --git a/data/chip_cache/000657.json b/data/chip_cache/000657.json index 7afe047..59cbe33 100644 --- a/data/chip_cache/000657.json +++ b/data/chip_cache/000657.json @@ -1 +1 @@ -{"winner_pct": 0.8905253861016628, "loser_pct": 0.10947461389833724, "bias": 0.0021894922779667446, "updated_at": "2026-07-02T00:35:07.027353"} \ No newline at end of file +{"winner_pct": 0.9806336040435885, "loser_pct": 0.01936639595641151, "bias": 0.0003873279191282302, "updated_at": "2026-07-02T00:44:45.975293"} \ No newline at end of file diff --git a/data/chip_cache/000700.json b/data/chip_cache/000700.json index 86809ab..651c3b2 100644 --- a/data/chip_cache/000700.json +++ b/data/chip_cache/000700.json @@ -1 +1 @@ -{"winner_pct": 0.7051650439382611, "loser_pct": 0.29483495606173893, "bias": 0.005896699121234778, "updated_at": "2026-07-02T00:35:08.872295"} \ No newline at end of file +{"winner_pct": 0.9366643901055676, "loser_pct": 0.06333560989443245, "bias": 0.001266712197888649, "updated_at": "2026-07-02T00:44:48.085198"} \ No newline at end of file diff --git a/data/chip_cache/000711.json b/data/chip_cache/000711.json index 3bf52b4..801cfc8 100644 --- a/data/chip_cache/000711.json +++ b/data/chip_cache/000711.json @@ -1 +1 @@ -{"winner_pct": 0.4599205028102528, "loser_pct": 0.5400794971897471, "bias": 0.010801589943794944, "updated_at": "2026-07-02T00:35:10.904477"} \ No newline at end of file +{"winner_pct": 0.8576946920402719, "loser_pct": 0.14230530795972807, "bias": 0.0028461061591945613, "updated_at": "2026-07-02T00:44:50.155122"} \ No newline at end of file diff --git a/data/chip_cache/001309.json b/data/chip_cache/001309.json index f5235aa..12e0aa5 100644 --- a/data/chip_cache/001309.json +++ b/data/chip_cache/001309.json @@ -1 +1 @@ -{"winner_pct": 0.9384281148873177, "loser_pct": 0.061571885112682245, "bias": 0.001231437702253645, "updated_at": "2026-07-02T00:35:13.007896"} \ No newline at end of file +{"winner_pct": 0.9896105603070028, "loser_pct": 0.010389439692997248, "bias": 0.0007439340403273239, "updated_at": "2026-07-02T00:44:52.287382"} \ No newline at end of file diff --git a/data/chip_cache/002594.json b/data/chip_cache/002594.json index 965d101..f587ced 100644 --- a/data/chip_cache/002594.json +++ b/data/chip_cache/002594.json @@ -1 +1 @@ -{"winner_pct": 0.06109805218679897, "loser_pct": 0.938901947813201, "bias": 0.01877803895626402, "updated_at": "2026-07-02T00:35:15.121583"} \ No newline at end of file +{"winner_pct": 0.1347851485695232, "loser_pct": 0.8652148514304768, "bias": 0.017304297028609538, "updated_at": "2026-07-02T00:44:54.433552"} \ No newline at end of file diff --git a/data/chip_cache/01070.json b/data/chip_cache/01070.json index 896cfd5..8a9d528 100644 --- a/data/chip_cache/01070.json +++ b/data/chip_cache/01070.json @@ -1 +1 @@ -{"winner_pct": 0.11515632261891377, "loser_pct": 0.8848436773810862, "bias": 0.017696873547621724, "updated_at": "2026-07-02T00:35:21.588604"} \ No newline at end of file +{"winner_pct": 0.9048415259336623, "loser_pct": 0.0951584740663377, "bias": 0.0019031694813267542, "updated_at": "2026-07-02T00:45:01.123204"} \ No newline at end of file diff --git a/data/chip_cache/01088.json b/data/chip_cache/01088.json index 89c6f9e..b0b5b42 100644 --- a/data/chip_cache/01088.json +++ b/data/chip_cache/01088.json @@ -1 +1 @@ -{"winner_pct": 0.01442763129876452, "loser_pct": 0.9855723687012354, "bias": 0.01971144737402471, "updated_at": "2026-07-02T00:35:23.448927"} \ No newline at end of file +{"winner_pct": 0.8241215447247867, "loser_pct": 0.17587845527521323, "bias": 0.0035175691055042645, "updated_at": "2026-07-02T00:45:03.212196"} \ No newline at end of file diff --git a/data/chip_cache/01211.json b/data/chip_cache/01211.json index e8d406b..18ce67e 100644 --- a/data/chip_cache/01211.json +++ b/data/chip_cache/01211.json @@ -1 +1 @@ -{"winner_pct": 0.012654394366315136, "loser_pct": 0.9873456056336849, "bias": 0.0197469121126737, "updated_at": "2026-07-02T00:35:25.515177"} \ No newline at end of file +{"winner_pct": 0.0019470276458546261, "loser_pct": 0.9980529723541453, "bias": 0.019961059447082905, "updated_at": "2026-07-02T00:45:05.297271"} \ No newline at end of file diff --git a/data/chip_cache/01478.json b/data/chip_cache/01478.json index dc03f53..6500080 100644 --- a/data/chip_cache/01478.json +++ b/data/chip_cache/01478.json @@ -1 +1 @@ -{"winner_pct": 0.02378383161135486, "loser_pct": 0.9762161683886451, "bias": 0.019524323367772902, "updated_at": "2026-07-02T00:35:27.617318"} \ No newline at end of file +{"winner_pct": 0.44137334122971467, "loser_pct": 0.5586266587702853, "bias": 0.011172533175405706, "updated_at": "2026-07-02T00:45:07.463245"} \ No newline at end of file diff --git a/data/chip_cache/01888.json b/data/chip_cache/01888.json index 01e03e7..385c2a9 100644 --- a/data/chip_cache/01888.json +++ b/data/chip_cache/01888.json @@ -1 +1 @@ -{"winner_pct": 0.9605101031912507, "loser_pct": 0.039489896808749314, "bias": 0.0007897979361749863, "updated_at": "2026-07-02T00:35:29.720189"} \ No newline at end of file +{"winner_pct": 0.9866163993464405, "loser_pct": 0.013383600653559464, "bias": 0.0006651935425033301, "updated_at": "2026-07-02T00:45:09.546450"} \ No newline at end of file diff --git a/data/chip_cache/02202.json b/data/chip_cache/02202.json index e5816e1..1d2d844 100644 --- a/data/chip_cache/02202.json +++ b/data/chip_cache/02202.json @@ -1 +1 @@ -{"winner_pct": 0.0054820390352224024, "loser_pct": 0.9945179609647776, "bias": 0.019890359219295554, "updated_at": "2026-07-02T00:35:31.579501"} \ No newline at end of file +{"winner_pct": 0.00024203244508924288, "loser_pct": 0.9997579675549108, "bias": 0.039564098261682626, "updated_at": "2026-07-02T00:45:11.637672"} \ No newline at end of file diff --git a/data/chip_cache/02318.json b/data/chip_cache/02318.json index c7b97bb..12a6ea6 100644 --- a/data/chip_cache/02318.json +++ b/data/chip_cache/02318.json @@ -1 +1 @@ -{"winner_pct": 0.02266099339387972, "loser_pct": 0.9773390066061202, "bias": 0.019546780132122403, "updated_at": "2026-07-02T00:35:33.432173"} \ No newline at end of file +{"winner_pct": 0.6241393442090698, "loser_pct": 0.3758606557909302, "bias": 0.007517213115818604, "updated_at": "2026-07-02T00:45:13.738933"} \ No newline at end of file diff --git a/data/chip_cache/02359.json b/data/chip_cache/02359.json index 12a7108..90a6218 100644 --- a/data/chip_cache/02359.json +++ b/data/chip_cache/02359.json @@ -1 +1 @@ -{"winner_pct": 0.9788099282869067, "loser_pct": 0.02119007171309323, "bias": 0.00042380143426186466, "updated_at": "2026-07-02T00:35:35.527231"} \ No newline at end of file +{"winner_pct": 0.9983363743718657, "loser_pct": 0.0016636256281342872, "bias": 3.3272512562685745e-05, "updated_at": "2026-07-02T00:45:15.860775"} \ No newline at end of file diff --git a/data/chip_cache/02388.json b/data/chip_cache/02388.json index 70952e5..4adbacc 100644 --- a/data/chip_cache/02388.json +++ b/data/chip_cache/02388.json @@ -1 +1 @@ -{"winner_pct": 0.03250983201120672, "loser_pct": 0.9674901679887933, "bias": 0.019349803359775868, "updated_at": "2026-07-02T00:35:37.394766"} \ No newline at end of file +{"winner_pct": 0.8901293359594721, "loser_pct": 0.10987066404052795, "bias": 0.002197413280810559, "updated_at": "2026-07-02T00:45:17.975256"} \ No newline at end of file diff --git a/data/chip_cache/02628.json b/data/chip_cache/02628.json index 07ae320..ef37ad3 100644 --- a/data/chip_cache/02628.json +++ b/data/chip_cache/02628.json @@ -1 +1 @@ -{"winner_pct": 0.16852330162051746, "loser_pct": 0.8314766983794825, "bias": 0.01662953396758965, "updated_at": "2026-07-02T00:35:39.254760"} \ No newline at end of file +{"winner_pct": 0.7900078948017442, "loser_pct": 0.20999210519825579, "bias": 0.004199842103965116, "updated_at": "2026-07-02T00:45:20.091419"} \ No newline at end of file diff --git a/data/chip_cache/06160.json b/data/chip_cache/06160.json index de1da33..6085b05 100644 --- a/data/chip_cache/06160.json +++ b/data/chip_cache/06160.json @@ -1 +1 @@ -{"winner_pct": 0.36653309165872255, "loser_pct": 0.6334669083412774, "bias": 0.012669338166825549, "updated_at": "2026-07-02T00:35:41.322663"} \ No newline at end of file +{"winner_pct": 0.5722888851123522, "loser_pct": 0.42771111488764785, "bias": 0.008554222297752958, "updated_at": "2026-07-02T00:45:22.179638"} \ No newline at end of file diff --git a/data/chip_cache/06869.json b/data/chip_cache/06869.json index 7d5c43c..2056a2b 100644 --- a/data/chip_cache/06869.json +++ b/data/chip_cache/06869.json @@ -1 +1 @@ -{"winner_pct": 0.8235950164623566, "loser_pct": 0.17640498353764347, "bias": 0.0035280996707528697, "updated_at": "2026-07-02T00:35:43.401261"} \ No newline at end of file +{"winner_pct": 0.9729771285366041, "loser_pct": 0.027022871463395843, "bias": 0.0005404574292679168, "updated_at": "2026-07-02T00:45:24.286446"} \ No newline at end of file diff --git a/data/chip_cache/09868.json b/data/chip_cache/09868.json index 8434511..cb708b8 100644 --- a/data/chip_cache/09868.json +++ b/data/chip_cache/09868.json @@ -1 +1 @@ -{"winner_pct": 0.10325476172315214, "loser_pct": 0.8967452382768478, "bias": 0.017934904765536958, "updated_at": "2026-07-02T00:35:45.448103"} \ No newline at end of file +{"winner_pct": 0.3252340331221118, "loser_pct": 0.6747659668778883, "bias": 0.013495319337557765, "updated_at": "2026-07-02T00:45:26.369838"} \ No newline at end of file diff --git a/data/chip_cache/09988.json b/data/chip_cache/09988.json index fb91a09..5e5c8d1 100644 --- a/data/chip_cache/09988.json +++ b/data/chip_cache/09988.json @@ -1 +1 @@ -{"winner_pct": 0.053119794705996114, "loser_pct": 0.9468802052940039, "bias": 0.018937604105880076, "updated_at": "2026-07-02T00:35:47.336553"} \ No newline at end of file +{"winner_pct": 0.2719839509092063, "loser_pct": 0.7280160490907936, "bias": 0.014560320981815873, "updated_at": "2026-07-02T00:45:28.476701"} \ No newline at end of file diff --git a/data/chip_cache/300035.json b/data/chip_cache/300035.json index 597103a..f0be859 100644 --- a/data/chip_cache/300035.json +++ b/data/chip_cache/300035.json @@ -1 +1 @@ -{"winner_pct": 0.028368192935391008, "loser_pct": 0.971631807064609, "bias": 0.019432636141292182, "updated_at": "2026-07-02T00:35:49.222809"} \ No newline at end of file +{"winner_pct": 0.24517735256570908, "loser_pct": 0.7548226474342911, "bias": 0.015096452948685822, "updated_at": "2026-07-02T00:45:30.594484"} \ No newline at end of file diff --git a/data/chip_cache/300124.json b/data/chip_cache/300124.json index 24877cf..da1706a 100644 --- a/data/chip_cache/300124.json +++ b/data/chip_cache/300124.json @@ -1 +1 @@ -{"winner_pct": 0.36417545165724186, "loser_pct": 0.6358245483427581, "bias": 0.012716490966855162, "updated_at": "2026-07-02T00:35:51.342524"} \ No newline at end of file +{"winner_pct": 0.5085832238108319, "loser_pct": 0.4914167761891682, "bias": 0.009828335523783364, "updated_at": "2026-07-02T00:45:32.751358"} \ No newline at end of file diff --git a/data/chip_cache/300308.json b/data/chip_cache/300308.json index 2c86c49..925d824 100644 --- a/data/chip_cache/300308.json +++ b/data/chip_cache/300308.json @@ -1 +1 @@ -{"winner_pct": 0.792023910513367, "loser_pct": 0.20797608948663301, "bias": 0.004159521789732661, "updated_at": "2026-07-02T00:35:53.208843"} \ No newline at end of file +{"winner_pct": 0.9836595299961747, "loser_pct": 0.016340470003825366, "bias": 0.00032680940007650736, "updated_at": "2026-07-02T00:45:34.879675"} \ No newline at end of file diff --git a/data/chip_cache/300548.json b/data/chip_cache/300548.json index c20f674..6423d77 100644 --- a/data/chip_cache/300548.json +++ b/data/chip_cache/300548.json @@ -1 +1 @@ -{"winner_pct": 0.5896316941534578, "loser_pct": 0.41036830584654216, "bias": 0.008207366116930844, "updated_at": "2026-07-02T00:35:55.349248"} \ No newline at end of file +{"winner_pct": 0.9643635376930005, "loser_pct": 0.03563646230699947, "bias": 0.0007127292461399894, "updated_at": "2026-07-02T00:45:36.995336"} \ No newline at end of file diff --git a/data/chip_cache/300750.json b/data/chip_cache/300750.json index 1489225..4777d43 100644 --- a/data/chip_cache/300750.json +++ b/data/chip_cache/300750.json @@ -1 +1 @@ -{"winner_pct": 0.051381452378474426, "loser_pct": 0.9486185476215256, "bias": 0.018972370952430512, "updated_at": "2026-07-02T00:35:57.452499"} \ No newline at end of file +{"winner_pct": 0.8250221210073526, "loser_pct": 0.17497787899264738, "bias": 0.0034995575798529477, "updated_at": "2026-07-02T00:45:39.111567"} \ No newline at end of file diff --git a/data/chip_cache/301308.json b/data/chip_cache/301308.json index b961054..c2cf4b2 100644 --- a/data/chip_cache/301308.json +++ b/data/chip_cache/301308.json @@ -1 +1 @@ -{"winner_pct": 0.9278175418685898, "loser_pct": 0.07218245813141022, "bias": 0.0014436491626282045, "updated_at": "2026-07-02T00:35:59.312573"} \ No newline at end of file +{"winner_pct": 0.9874395067179887, "loser_pct": 0.012560493282011215, "bias": 0.00025120986564022434, "updated_at": "2026-07-02T00:45:41.239585"} \ No newline at end of file diff --git a/data/chip_cache/518880.json b/data/chip_cache/518880.json index 91bbd6a..8d0ced0 100644 --- a/data/chip_cache/518880.json +++ b/data/chip_cache/518880.json @@ -1 +1 @@ -{"winner_pct": 0.015377013137657148, "loser_pct": 0.9846229868623428, "bias": 0.019692459737246856, "updated_at": "2026-07-02T00:36:01.402360"} \ No newline at end of file +{"winner_pct": 0.5509915567863326, "loser_pct": 0.4490084432136674, "bias": 0.008980168864273348, "updated_at": "2026-07-02T00:45:43.410106"} \ No newline at end of file diff --git a/data/chip_cache/600519.json b/data/chip_cache/600519.json index 9a8774e..c1cc968 100644 --- a/data/chip_cache/600519.json +++ b/data/chip_cache/600519.json @@ -1 +1 @@ -{"winner_pct": 0.10535744228960574, "loser_pct": 0.8946425577103942, "bias": 0.035427845285331605, "updated_at": "2026-07-02T00:36:03.265204"} \ No newline at end of file +{"winner_pct": 0.022019682466754367, "loser_pct": 0.9779803175332457, "bias": 0.03872802057431653, "updated_at": "2026-07-02T00:45:45.564306"} \ No newline at end of file diff --git a/data/chip_cache/600563.json b/data/chip_cache/600563.json index 453171b..e7e1c8f 100644 --- a/data/chip_cache/600563.json +++ b/data/chip_cache/600563.json @@ -1 +1 @@ -{"winner_pct": 0.901115667682602, "loser_pct": 0.09888433231739803, "bias": 0.0019776866463479606, "updated_at": "2026-07-02T00:36:05.897221"} \ No newline at end of file +{"winner_pct": 0.9736309318514315, "loser_pct": 0.026369068148568535, "bias": 0.0005273813629713707, "updated_at": "2026-07-02T00:45:47.673568"} \ No newline at end of file diff --git a/data/chip_cache/601318.json b/data/chip_cache/601318.json index edb5240..5fd1c51 100644 --- a/data/chip_cache/601318.json +++ b/data/chip_cache/601318.json @@ -1 +1 @@ -{"winner_pct": 0.12629635051048638, "loser_pct": 0.8737036494895137, "bias": 0.017474072989790274, "updated_at": "2026-07-02T00:36:07.760371"} \ No newline at end of file +{"winner_pct": 0.4249266733297725, "loser_pct": 0.5750733266702275, "bias": 0.01150146653340455, "updated_at": "2026-07-02T00:45:49.780753"} \ No newline at end of file diff --git a/data/chip_cache/601899.json b/data/chip_cache/601899.json index eab1aa9..472f5a6 100644 --- a/data/chip_cache/601899.json +++ b/data/chip_cache/601899.json @@ -1 +1 @@ -{"winner_pct": 0.03603420474156716, "loser_pct": 0.9639657952584328, "bias": 0.019279315905168657, "updated_at": "2026-07-02T00:36:09.643701"} \ No newline at end of file +{"winner_pct": 0.5877933411419987, "loser_pct": 0.41220665885800134, "bias": 0.008244133177160027, "updated_at": "2026-07-02T00:45:51.892513"} \ No newline at end of file diff --git a/data/chip_cache/688411.json b/data/chip_cache/688411.json index 627f947..af761ad 100644 --- a/data/chip_cache/688411.json +++ b/data/chip_cache/688411.json @@ -1 +1 @@ -{"winner_pct": 0.5745885997936249, "loser_pct": 0.42541140020637513, "bias": 0.008508228004127504, "updated_at": "2026-07-02T00:36:11.528137"} \ No newline at end of file +{"winner_pct": 0.6831599702559918, "loser_pct": 0.31684002974400816, "bias": 0.006336800594880163, "updated_at": "2026-07-02T00:45:54.018131"} \ No newline at end of file diff --git a/data/chip_cache/688630.json b/data/chip_cache/688630.json index 777cd60..f038f37 100644 --- a/data/chip_cache/688630.json +++ b/data/chip_cache/688630.json @@ -1 +1 @@ -{"winner_pct": 0.9180078278115366, "loser_pct": 0.08199217218846348, "bias": 0.0016398434437692698, "updated_at": "2026-07-02T00:36:13.369248"} \ No newline at end of file +{"winner_pct": 0.986690766691903, "loser_pct": 0.013309233308096953, "bias": 0.00026618466616193907, "updated_at": "2026-07-02T00:45:56.137095"} \ No newline at end of file diff --git a/data/chip_cache/688639.json b/data/chip_cache/688639.json index 42ce1af..2ca8a3c 100644 --- a/data/chip_cache/688639.json +++ b/data/chip_cache/688639.json @@ -1 +1 @@ -{"winner_pct": 0.19133053163048952, "loser_pct": 0.8086694683695105, "bias": 0.01617338936739021, "updated_at": "2026-07-02T00:36:15.460650"} \ No newline at end of file +{"winner_pct": 0.025566719946732226, "loser_pct": 0.9744332800532678, "bias": 0.019488665601065356, "updated_at": "2026-07-02T00:45:58.254879"} \ No newline at end of file diff --git a/data/price_history.json b/data/price_history.json index 0eb5798..6eefbf9 100644 --- a/data/price_history.json +++ b/data/price_history.json @@ -49,6 +49,12 @@ "high": 101.33, "low": 92.52, "close": 95.94 + }, + { + "date": "2026-07-02", + "high": 101.33, + "low": 94.41, + "close": 95.94 } ], "000700": [ @@ -101,6 +107,12 @@ "high": 4.77, "low": 4.1, "close": 4.77 + }, + { + "date": "2026-07-02", + "high": 4.77, + "low": 4.77, + "close": 4.77 } ], "001309": [ @@ -127,6 +139,12 @@ "high": 976.0, "low": 880.0, "close": 893.22 + }, + { + "date": "2026-07-02", + "high": 976.0, + "low": 880.0, + "close": 893.22 } ], "002594": [ @@ -153,6 +171,12 @@ "high": 81.65, "low": 78.55, "close": 80.66 + }, + { + "date": "2026-07-02", + "high": 81.65, + "low": 78.55, + "close": 80.66 } ], "00700": [ @@ -205,6 +229,12 @@ "high": 2.08, "low": 2.01, "close": 2.06 + }, + { + "date": "2026-07-02", + "high": 2.08, + "low": 2.01, + "close": 2.06 } ], "00981": [ @@ -257,6 +287,12 @@ "high": 13.22, "low": 12.59, "close": 12.89 + }, + { + "date": "2026-07-02", + "high": 13.22, + "low": 12.59, + "close": 12.89 } ], "01088": [ @@ -413,6 +449,12 @@ "high": 52.6, "low": 50.75, "close": 51.05 + }, + { + "date": "2026-07-02", + "high": 52.6, + "low": 50.75, + "close": 51.05 } ], "02359": [ @@ -439,6 +481,12 @@ "high": 158.4, "low": 151.7, "close": 153.7 + }, + { + "date": "2026-07-02", + "high": 158.4, + "low": 151.7, + "close": 153.7 } ], "02388": [ @@ -465,6 +513,12 @@ "high": 43.6, "low": 41.82, "close": 42.38 + }, + { + "date": "2026-07-02", + "high": 43.6, + "low": 41.82, + "close": 42.38 } ], "02628": [ @@ -491,6 +545,12 @@ "high": 27.18, "low": 26.32, "close": 26.66 + }, + { + "date": "2026-07-02", + "high": 27.18, + "low": 26.32, + "close": 26.66 } ], "06160": [ @@ -777,6 +837,12 @@ "high": 1196.8, "low": 1166.33, "close": 1193.01 + }, + { + "date": "2026-07-02", + "high": 1196.8, + "low": 1166.33, + "close": 1193.01 } ], "600563": [ diff --git a/scripts/chip_factors.py b/scripts/chip_factors.py index 035522b..5ecdfd4 100644 --- a/scripts/chip_factors.py +++ b/scripts/chip_factors.py @@ -100,7 +100,7 @@ class ChipFactors: os.environ.pop(k) # 从腾讯API取60日K线 prefix = "sh" if code.startswith(('60','68','51')) else "sz" if code.startswith(('00','30','15')) else "hk" - url = f"http://ifzq.gtimg.cn/appstock/app/fqkline/get?param={prefix}{code},day,,,60,qfq" + url = f"http://ifzq.gtimg.cn/appstock/app/fqkline/get?param={prefix}{code},day,,,640,qfq" try: opener = urllib.request.build_opener(urllib.request.ProxyHandler({})) req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) diff --git a/strategy_lifecycle.py b/strategy_lifecycle.py index b1e2114..78d3eaf 100644 --- a/strategy_lifecycle.py +++ b/strategy_lifecycle.py @@ -51,6 +51,55 @@ def calc_atr(code, period=14): except Exception: return None + +def calc_chip_sr(code, price): + """从筹码分布计算支撑/阻力位。 + + 返回: {"chip_ss": 筹码强支撑, "chip_sr": 筹码强阻力} 或 None + 筹码强支撑 = 当前价下方成交量最大的价格区间 + 筹码强阻力 = 当前价上方成交量最大的价格区间 + + 用法: + sr = calc_chip_sr("600519", 1193) + if sr: + print(f"筹码支撑{sr['chip_ss']} 筹码阻力{sr['chip_sr']}") + """ + if not price or price <= 0: + return None + try: + # 复用chip_factors的筹码分布构建 + import sys as _sys + _sys.path.insert(0, "/home/hmo/MoFin/scripts") + from chip_factors import ChipFactors + cf = ChipFactors() + chip = cf._build_chip_distribution(code) + if not chip: + return None + total = sum(chip.values()) + if total <= 0: + return None + # 2%区间聚合 + step = max(round(price * 0.02, 2), 1.0) + bins = {} + for p, v in chip.items(): + k = round(p / step) * step + bins[k] = bins.get(k, 0) + v + sb = sorted(bins.items()) + below = [(p, v) for p, v in sb if p < price] + above = [(p, v) for p, v in sb if p >= price] + if not below or not above: + return None + + # 支撑 = 下方成交量最大的密集区 + chip_ss = max(below, key=lambda x: x[1])[0] + # 阻力 = 上方成交量最大的密集区 + chip_sr = max(above, key=lambda x: x[1])[0] + + return {"chip_ss": chip_ss, "chip_sr": chip_sr} + except Exception as e: + print(f" ⚠️ 筹码S/R计算失败: {e}", file=sys.stderr) + return None + # 提示词版本追踪 try: from prompt_manager.tracking import record_strategy_generation @@ -542,6 +591,25 @@ def reassess_strategy(code, name, price, cost, shares, current_action, except Exception as e: print(f" 多周期分析失败: {e}", file=sys.stderr) + # ----- 筹码分布支撑/阻力(中长线参考) ----- + chip_sr = None + try: + chip_sr = calc_chip_sr(code, price) + if chip_sr: + print(f" 筹码: 强撑={chip_sr['chip_ss']} 强压={chip_sr['chip_sr']}") + # 与枢轴点对比,判断共振/分歧 + if ss and ws and pivot: + chip_ss_pct = (price - chip_sr['chip_ss']) / price * 100 if chip_sr['chip_ss'] > 0 else 0 + chip_sr_pct = (chip_sr['chip_sr'] - price) / price * 100 if chip_sr['chip_sr'] > 0 else 0 + pivot_ss_pct = (price - ss) / price * 100 if ss > 0 else 0 + pivot_sr_pct = (sr_resist - price) / price * 100 if sr_resist > 0 else 0 + if abs(chip_ss_pct - pivot_ss_pct) < 3: + print(f" ⚡ 支撑共振: 筹码+枢轴均指向{chip_sr['chip_ss']:.0f}附近") + if abs(chip_sr_pct - pivot_sr_pct) < 3: + print(f" ⚡ 阻力共振: 筹码+枢轴均指向{chip_sr['chip_sr']:.0f}附近") + except Exception: + pass + profit_pct = (price - cost) / cost * 100 if cost else 0 is_new_entry = (cost == 0) or (shares == 0) is_deep_loss = profit_pct < -20