From eb0bbcdddc7a71cf3b70c682a8b628ae4a99b0b4 Mon Sep 17 00:00:00 2001 From: yanweidong Date: Fri, 4 Sep 2026 19:48:47 +0800 Subject: [PATCH] fix bug --- .../__pycache__/collector.cpython-311.pyc | Bin 0 -> 2802 bytes .../libs/__pycache__/dataset.cpython-311.pyc | Bin 0 -> 336 bytes py-client/libs/collector.py | 42 ++++++++++++++++++ py-client/libs/dataset.py | 3 -- py-client/libs/market.py | 1 - .../trend/__pycache__/boot.cpython-311.pyc | Bin 10144 -> 10262 bytes .../trend/__pycache__/open.cpython-311.pyc | Bin 6903 -> 7376 bytes .../trend/__pycache__/order.cpython-311.pyc | Bin 8150 -> 8093 bytes .../__pycache__/positions.cpython-311.pyc | Bin 9427 -> 9633 bytes .../trend/__pycache__/state.cpython-311.pyc | Bin 11677 -> 12182 bytes .../trend/__pycache__/watch.cpython-311.pyc | Bin 5037 -> 5037 bytes py-client/strategy/trend/boot.py | 6 +-- py-client/strategy/trend/open.py | 1 - py-client/strategy/trend/positions.py | 18 +++++--- py-client/strategy/trend/watch.py | 2 +- 15 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 py-client/libs/__pycache__/collector.cpython-311.pyc create mode 100644 py-client/libs/__pycache__/dataset.cpython-311.pyc create mode 100644 py-client/libs/collector.py delete mode 100644 py-client/libs/dataset.py diff --git a/py-client/libs/__pycache__/collector.cpython-311.pyc b/py-client/libs/__pycache__/collector.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c038d18f70a977d4b2291b4b047ca33c4a513d5 GIT binary patch literal 2802 zcmai0O>7iL7JmIV-SgAafDIzn;xrfnjbT`WNrYq2g3To+ppD^>iILSz*O+#Cx+hgN zz@V{kA`VW3v_!io>Q~jT->diYy*D50dIA8T{O^A)UQqykV4K#^o)M2R0DJ@vID!WSAuANbtSGR(=t%`R zD;K1!#P^b?6k^#Jr)5tqXjzTZiWkquome*Es7P}(q~&ENepSvUodilbNu)U`cJ3&7 z&C##QS=~`)!Ak#+UBD8fm`xlvN28QW<{g{bInO4<5+m8MDT*|VEoXbeYwE%P>u#TQZCqD2}LoC zXbJl{q2&MoPys*!fXAN5d_cS2Rp71waKC+m$0*}`HYz~n77cJ$1h_A@_T*2L$$d6x zyhXutGJ7@5LZ1d6yXNTCfQKF7DpX)K){)&AcLCsjdpq5?e@;uf%?fl~7rmiF=cPXV zDMw`b|4{Z|M@FB7!EPT_U@_U^`~#nCZt(%op$?rF`{h?)wac>3==IJlRN&oReSRPA za8t93-quBL@6dU1!qlYak@?rxPn(6nL7vHzm6)zi zgBES)a;Qj=W1cIUw)xuZsgox1bAf|!rYDjw}oCW z_t-D?zWcj)ZDbZcVL+7##Zhv8kp%uczosQcV&>10^foF-vP)5cFo>9@`E+c0V(wyq z-=2G?WczgPoV&31odTUJmiOj77x{F~bI*~vHbyhW^3%j5s{*;8P&{(^#V#e8NiWFR z9yyZfFsugvvIhW`Av9*1^FQ&=rO!{_kgiXCsQp8`J-X^them5dqiu%AEFe7&Q(6vV zqCSEJ=CJik!tc52L-E>%S-?6gT>>_E1;Y$BnBj%6B4C=BMd4{;(sRl08`NfC9}t#n z%%Jh+Ty<_FZ%$X&ZLO`_+CIb^naTmos!x<~iR%+;`#BWJv|L2|LYM_1l6g&4cvK>p zDT)+YDtaiA2%?x(D9lO|W?6%oC!)AZf_#7rHpL7&k>vU`Qu1D4(?~uS1fC`EPY5fD zO(UBMnHy5fg1Epe_)#6We!Qv<)zqN|2+Hm|6Zg=A)76oQ+QTV`%Yuy<9+m#QlR1LFcn4xCY)ztFR?ZoQA&kj709-R4lI^2D2SbvlA5iQ>h8xYP}NlI!Xz9KUS; zc!j59yssZsgo@}0x1?TtE=k?!U2JzD+SMB>k|Ta9-IW0DxAh6&$g?m4wDms#0JZ~` z1$dLcxd@k}H{qgSDVL{?Awu_}d_KU`Y-83e6}`ZAUNwDm0b#RSf^(tB~n?J4@&f;rSOc36xQG`MRGA9G}5O| zoj7rP>h!5M=FhxwBGQl91RcM`3ZonNmfR;jQj2z(U5_xJnC3G~M(OtT=ZhtB9%lex z3(MR^j=hGQRP?nCTOJMXst=j4 z=_uL$`-2EaF^72u(#F*~ar&5rhKJU#+|pVyDa3jn`7>`M-$I|1+p4FfFNX)+xd6s3Ccf@Qm*`3WU)pKE=)VhjurOXmPuUkK4kA;NdRg%IIq(zk!1xBLV5ElMr` literal 0 HcmV?d00001 diff --git a/py-client/libs/collector.py b/py-client/libs/collector.py new file mode 100644 index 0000000..56f3fae --- /dev/null +++ b/py-client/libs/collector.py @@ -0,0 +1,42 @@ +from dataclasses import asdict, is_dataclass +from datetime import date, datetime +from enum import Enum +from typing import Any + +import httpx + + +COLLECTOR_URL = "http://139.224.247.176:13499/collector" + + +def _json_value(value: Any) -> Any: + """Convert the QMT model values into values accepted by a JSON encoder.""" + if is_dataclass(value) and not isinstance(value, type): + return _json_value(asdict(value)) + if isinstance(value, dict): + return {str(key): _json_value(item) for key, item in value.items()} + if isinstance(value, (list, tuple, set)): + return [_json_value(item) for item in value] + if isinstance(value, Enum): + return _json_value(value.value) + if isinstance(value, (datetime, date)): + return value.isoformat() + if value is None or isinstance(value, (str, int, float, bool)): + return value + return str(value) + + +def collector_push(account_id: str, assets: Any, positions: Any) -> None: + """Best-effort collector upload; never propagate errors to the caller.""" + try: + payload = _json_value( + { + "account_id": account_id, + "assets": assets, + "positions": positions, + } + ) + httpx.post(COLLECTOR_URL, json=payload, timeout=3.0) + except BaseException: + # Collection must never interrupt or affect the trading workflow. + pass diff --git a/py-client/libs/dataset.py b/py-client/libs/dataset.py deleted file mode 100644 index dcd82f6..0000000 --- a/py-client/libs/dataset.py +++ /dev/null @@ -1,3 +0,0 @@ - -def dataset_push(assets:any,positions:any): - pass \ No newline at end of file diff --git a/py-client/libs/market.py b/py-client/libs/market.py index 34565c0..44b3db7 100644 --- a/py-client/libs/market.py +++ b/py-client/libs/market.py @@ -26,7 +26,6 @@ def refresh_market(api_host: str = API_HOST) -> str: result = status(get_json(url, HTTP_TIMEOUT)) except Exception as exc: result = "UNKNOWN" - logging.error("获取大盘指数失败: %s %s", url, exc) with _market_lock: _market_status = result return result diff --git a/py-client/strategy/trend/__pycache__/boot.cpython-311.pyc b/py-client/strategy/trend/__pycache__/boot.cpython-311.pyc index 8eac14b99a4520489664431bb04d2b459a766511..cbf10da5b0acb03a3ebf4c91f348a4fb40a6e95d 100644 GIT binary patch delta 1884 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 delta 690 zcmY+AUr1AN6vuz(-ut_*b@%^Y`;(h@Y26@oG>gIRj7r^H^sq(HB0{_~utd4q+j?s3 zp&mjG^alp{k{KFNBM1?R1k(jEVZQVh7-dg`pvb5AnM$39&+qU(=X?+6SBw4XGCwt$ zjD!%f@%7;Skh5zctwr+{Y0ja^+QFibb85ycQNojNs^UjV z$OD37yayjc6c#IW80C&F6!>8q^JJlk*9G?KFAL(o`i?q{W5Q7^an@~nQiorlvEd4Cb?XUnOnp_vPFSJ$j+-Ky5CD$Yxv?Lv9q zRNIVmF1RMe>QbyG#qfn`DW>*Dx#g%a>88sGxv!PJZ*5Py>52;&yVX>JTTK|#GOZfq z{!Uu$Y){MdLkpy3oHhFn3~nE?69z&EPYC>2A-HKi2?DlQ6o*jYr$s_$#oe}B6t7sq zs5mWn&k_H-xz+!rBJDY@GL;+5B)CtzZ;3f23VS3h3! z%8AO*n#Du@ zY||$?J~1$n$AbSzfLT2wdYrYev$hQJkx}jDjeJ7S<6Hkbrv#A(`5(=AKX5`|BYyz! C^rv?K diff --git a/py-client/strategy/trend/__pycache__/order.cpython-311.pyc b/py-client/strategy/trend/__pycache__/order.cpython-311.pyc index 221c3572a55d811cd187e614b51331062cee8884..29109149d2397568e557525a6c600092e7d5901d 100644 GIT binary patch delta 393 zcmca+Ki8gjIWI340|NsCzv9fSSsQuhv(>Z2=cJ|=Ni#4oBr}3!pn!#efq|KUf$_5e z0|Uc!h7`sUB-t!DJB4W(BLl-~IDa<7T&7?KP3BTl1_p-bQ|3SGn4pl5P*Rkdm!ew% z1qlfX&lc=?x~Kp7td?gIbJjeav*E?MMNfODKJDNBxS^?v4Xk`}7JH{lc-S14YT(77U^bAewEggEpje__AQ{EJa{@&yhlM*GdLIdoW*Q!YGe+mlllbyE80{xBiEA@DZPpVHW#qSKU|_h#UXYrXl9`uY zw93`8_XtVjGEH4uPRa9z* delta 451 zcmbPhf6bnEIWI340|Ntt;fonrYc}%EXY*#xNlh=3W?*1QW&}w<0UHAY12Y2y<7YPp z28QVjDU3A?DNHHMtxS?I6%4Z(Qdmlm^kgwkwiS|yp3N|qC73~zt<;f$f#La-`Oi8g zJfFYz#kxgLd#66_-~N72&yyXy6asxi6rL_=f3|tWlO1cH&uV$Hf8o>q?JuXSd%39P z`P7-uSMGW_eaqv9rYh#D5?#NSAZvaxPIhLGG}L8aU}#|Yz{Vh8HX(S1&HLQ}#o z@S9%XH=SF4Mc!b8;6-`kEAqw=p$i z8J#AV$>_2Ub#Qt6F+Y)p)Hn?;$jnHUo$H?q_*7Hnb-VdAObN@2-n z1*t1im>j}xFBw$A58^>U76*)#A~-pRU7fusg*BK#Q)u%n_L+>_2@DJj(E<6z3c3oD z9XJ!XlTrANlizXfW>t99HW4H%HTeXWDqpDwOv$6R$zb8lC%E=7GL}zn<%#AnVdeYC zV8Y5b`2~-ma`}bI+7Ap24on_QUqDna(?tG5|gsz|70{0YrQR5ns6&cm;@5`yrXpgq80D$U{XclLeJzH^1cD$;z0z td9lcHPR2=_z2(H28INsFR{X%oSiLz!S)5VAg^`i(0|N%>H@RLV1OSaveeeJP delta 353 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 Q{kdDy{r*2D+yH>T0j}vdIRF3v diff --git a/py-client/strategy/trend/__pycache__/watch.cpython-311.pyc b/py-client/strategy/trend/__pycache__/watch.cpython-311.pyc index c2f420f251bf030e545ca5e24990aae691eab567..c48040ae9aba72a6ce1675771c047462486dd45c 100644 GIT binary patch delta 42 wcmZ3hzE+)gIWI340|Ns?o!rc None: else: log.warning("[启动] 获取资金概览失败") - log.info("[启动] 持仓数量=%d", len(positions)) for position in positions: if position.volume <= 0: continue @@ -131,7 +130,8 @@ def RunOnce(run: Runtime, signals:list[SignalItem]) -> None: ( "数据提交", run.executor.submit( - dataset_push, + collector_push, + run.account_cfg.account_id, assets, positions, ), diff --git a/py-client/strategy/trend/open.py b/py-client/strategy/trend/open.py index 8106ff5..8057a60 100644 --- a/py-client/strategy/trend/open.py +++ b/py-client/strategy/trend/open.py @@ -14,7 +14,6 @@ import logging as log def open_signal(run:Runtime, ticks, open_signals) -> None: """逐个验证开仓信号并提交买入委托。""" - log.info("[Open] 信号总数:%d", len(open_signals)) for item in open_signals: # 1. 验证信号配置允许开仓的时间区间。 signal_config = run.global_cfg.signals.get(item.signal_key) diff --git a/py-client/strategy/trend/positions.py b/py-client/strategy/trend/positions.py index d187e6a..34ef831 100644 --- a/py-client/strategy/trend/positions.py +++ b/py-client/strategy/trend/positions.py @@ -47,7 +47,7 @@ def manage_positions( code = position.stock_code tick = ticks.get(code) if code in runtime.account_cfg.excluded_codes: - log.info("[Position] 代码=%s,名称=%s,止盈=跳过,补仓=跳过,原因=已配置为排除股票", code, position.stock_name) + log.info("[Position - ] 代码=%s,名称=%s,止盈=跳过,补仓=跳过,原因=已配置为排除股票", code, position.stock_name) continue if ( not code @@ -56,7 +56,7 @@ def manage_positions( or tick is None or tick.last_price <= 0 ): - log.warning("[Position] 代码=%s,名称=%s,止盈=跳过,补仓=跳过,原因=持仓或行情数据无效", code or "未知", position.stock_name) + log.warning("[Position - ] 代码=%s,名称=%s,止盈=跳过,补仓=跳过,原因=持仓或行情数据无效", code or "未知", position.stock_name) continue pnl_rate = round( @@ -86,10 +86,16 @@ def manage_positions( elif runtime.account_cfg.enable_loss_add_position: loss_add_action = "大盘信号不允许" - log.info( - "[Position] 代码=%s,名称=%s,盈亏=%.2f%%,止盈=%s,补仓=%s", - code, position.stock_name, pnl_rate, profit_action, loss_add_action, - ) + if pnl_rate>=0: + log.info( + "[Position ↑ ] 代码=%s,名称=%s,盈亏=%.2f%%,止盈=%s,补仓=%s", + code, position.stock_name, pnl_rate, profit_action, loss_add_action, + ) + else: + log.info( + "[Position ↓ ] 代码=%s,名称=%s,盈亏=%.2f%%,止盈=%s,补仓=%s", + code, position.stock_name, pnl_rate, profit_action, loss_add_action, + ) def handle_profit( diff --git a/py-client/strategy/trend/watch.py b/py-client/strategy/trend/watch.py index b151821..b5f3626 100644 --- a/py-client/strategy/trend/watch.py +++ b/py-client/strategy/trend/watch.py @@ -68,7 +68,7 @@ class DipWatch: rebound = (price - watch.last_close) / watch.last_close * 100 if rebound < self.rebound_threshold: - log.debug( + log.info( "[%s Watch] %s 等待反弹,收盘价=%.2f,现价=%.2f,反弹=%.2f%%,阈值=%.2f%%", tag, code,