Files
big-qmt/py-client/strategy/trend/__pycache__/state.cpython-311.pyc

63 lines
11 KiB
Plaintext
Raw Normal View History

2026-08-28 18:52:27 +08:00
<EFBFBD>
2026-08-31 13:00:22 +08:00
<00>ٓj<00><01><><00>dZddlmZddlZddlmZmZddlmZddl m
2026-08-28 18:52:27 +08:00
Z
2026-08-30 14:46:34 +08:00
ddl m Z ddl mZmZd Zd
2026-08-31 13:00:22 +08:00
Zd Zd Zd ZdZed<0F><10><00>Gd<11>d<12><00><00><00>ZGd<13>d<14><00>ZdS)u<趋势策略持仓状态的内存管理与 JSON 持久化。<E58C96>)<01> annotationsN)<02>asdict<63> dataclass<73><01>Path)<01>Lock)<01>Iterable)<02> OrderItem<65> PositionItem<65><00>ING<4E>OK<4F>FAILED<45>CANCELED<45>UNKNOWNT)<01>slotsc<01><><00>eZdZUdZded<dZded<dZded<d Zd
2026-08-28 18:52:27 +08:00
ed <eZ ded <dZ
ded <dZ ded<dZ ded<d Z d
2026-08-30 14:46:34 +08:00
ed<eZded<dS)<13> StateItemu'单只证券的底仓和补仓状态。<E68081>str<74>coder <00> base_order_idr<00>int<6E>base_qtyg<00>float<61> base_cost<73> base_status<75>added_order_id<69> added_num<75> added_qty<74>
2026-08-28 22:56:35 +08:00
added_cost<EFBFBD> added_statusN)<0F>__name__<5F>
2026-08-31 13:00:22 +08:00
__module__<EFBFBD> __qualname__<5F>__doc__<5F>__annotations__rrr<00> STATUS_NONErrrrr r!<00><00><00>7D:\work\quant\big-qmt\py-client\strategy\trend\state.pyrrs<><00><00><00><00><00><00><00>1<>1<><0E>I<EFBFBD>I<EFBFBD>I<EFBFBD><1C>M<EFBFBD><1B><1B><1B><1B><15>H<EFBFBD><15><15><15><15><1A>I<EFBFBD><1A><1A><1A><1A>"<22>K<EFBFBD>"<22>"<22>"<22>"<22><1D>N<EFBFBD><1C><1C><1C><1C><16>I<EFBFBD><16><16><16><16><16>I<EFBFBD><16><16><16><16><1B>J<EFBFBD><1B><1B><1B><1B>#<23>L<EFBFBD>#<23>#<23>#<23>#<23>#<23>#r)rc<01><><00>eZdZdZd d<06>Zed!d <0C><04><00>Zed"d<0E><04><00>Zd#d<11>Z d$d<13>Z
d%d<15>Z d&d<18>Z d'd<1B>Z d(d<1C>Zd)d<1E>ZdS)*<2A>Stateu<65>线程安全的策略状态存储。
2026-08-28 18:52:27 +08:00
状态以内存字典提供快速访问,并通过临时文件替换的方式写入 JSON
防止程序在写入过程中退出而破坏原状态文件。
<20>path<74>
2026-08-31 13:00:22 +08:00
str | Path<74>return<72>Nonec<01><><00>t|<01><00>|_t<00><00>|_|<00><00><00>|_dS)N)rr-r<00>lock<63>_load<61>items)<02>selfr-s r*<00>__init__zState.__init__3s-<00><00><18><14>J<EFBFBD>J<EFBFBD><04> <09><18>F<EFBFBD>F<EFBFBD><04> <09><19>Z<EFBFBD>Z<EFBFBD>\<5C>\<5C><04>
2026-08-28 18:52:27 +08:00
<EFBFBD>
<EFBFBD>
2026-08-30 14:46:34 +08:00
r)<00>data_dir<69>strategyr<00>
2026-08-31 13:00:22 +08:00
account_id<EFBFBD>'State'c<01>H<00>t|<01><00>|<02>d|<03>d<02>z }||<04><00>S)uE根据数据目录、策略名称和账户生成独立状态文件。<E4BBB6>_z _state.jsonr)<05>clsr7r8r9<00>
2026-08-30 14:46:34 +08:00
state_paths r*<00> for_strategyzState.for_strategy8s3<00><00><1A>(<28>^<5E>^<5E><18>&K<>&K<>J<EFBFBD>&K<>&K<>&K<>K<>
2026-08-31 13:00:22 +08:00
<EFBFBD><12>s<EFBFBD>:<3A><EFBFBD><EFBFBD>r)<00> list[str]c<01>l<00>|j5t|j<00><00>cddd<01><00>S#1swxYwYdS)u6返回当前已经接管的全部证券代码快照。N)r2<00>listr4)r5s r*<00>codesz State.codesCs}<00><00><12>Y<EFBFBD> $<24> $<24><17><04>
<EFBFBD>#<23>#<23> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24><><EFBFBD><EFBFBD> $<24> $<24> $<24> $<24> $<24> $s <00>)<03>-<07>-rrc<01>^<00>|j5|j|cddd<01><00>S#1swxYwYdS)u<获取指定证券的状态;不存在时抛出 KeyError。N)r2r4<00>r5rs r*<00>getz State.getIsx<00><00> <11>Y<EFBFBD> $<24> $<24><17>:<3A>d<EFBFBD>#<23> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24> $<24><><EFBFBD><EFBFBD> $<24> $<24> $<24> $<24> $<24> $s <00> "<03>&<07>&<07>itemc<01>d<00>|j5||j|j<ddd<01><00>dS#1swxYwYdS)u'新增或覆盖一只证券的状态。N)r2r4r)r5rGs r*<00>setz State.setNs|<00><00> <11>Y<EFBFBD> )<29> )<29>$(<28>D<EFBFBD>J<EFBFBD>t<EFBFBD>y<EFBFBD> !<21> )<29> )<29> )<29> )<29> )<29> )<29> )<29> )<29> )<29> )<29> )<29> )<29><><EFBFBD><EFBFBD> )<29> )<29> )<29> )<29> )<29> )s <00>%<03>)<07>)<07>boolc<01>~<00>|j5|j<00>|d<01><00>ducddd<01><00>S#1swxYwYdS)u?删除已终结的证券状态并返回是否实际删除。N)r2r4<00>poprEs r*<00>deletez State.deleteSs<><00><00> <11>Y<EFBFBD> :<3A> :<3A><17>:<3A>><3E>><3E>$<24><04>-<2D>-<2D>T<EFBFBD>9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD> :<3A> :<3A> :<3A> :<3A> :<3A> :s <00>2<03>6<07>6<07> positions<6E>Iterable[PositionItem]c <01>V<00>t|j<00><00>}|D]}}|jr|jdks|jdks |j|vr<01>)|<00>t |j|j|jt <00><02><00><00><00>|<02>|j<00><00><00>~|<00><00><00>dS)u<>把尚未接管的真实持仓初始化为已完成底仓。
2026-08-28 18:52:27 +08:00
无证券代码、无持仓数量或成本无效的记录会被忽略。同步结束后
立即保存,确保首次接管的持仓在程序重启后仍可恢复。
2026-08-31 13:00:22 +08:00
r)rrrrN) rIrC<00>
2026-08-28 18:52:27 +08:00
stock_code<EFBFBD>volume<6D>
2026-08-31 13:00:22 +08:00
open_pricer<00> STATUS_OK<4F>add<64>save)r5rN<00> known_codes<65>positions r*<00>sync_positionszState.sync_positionsYs<><00><00> <1A>$<24>*<2A>o<EFBFBD>o<EFBFBD> <0B>!<21> 1<> 1<>H<EFBFBD><1C>'<27> <19><1B>?<3F>a<EFBFBD>'<27>'<27><1B>&<26>!<21>+<2B>+<2B><1B>&<26>+<2B>5<>5<><18> <10>H<EFBFBD>H<EFBFBD><19>!<21>,<2C>%<25>_<EFBFBD>&<26>1<> )<29> <12><12><12> <0E> <0E> <0E> <18>O<EFBFBD>O<EFBFBD>H<EFBFBD>/<2F> 0<> 0<> 0<> 0<> <0C> <09> <09> <0B> <0B> <0B> <0B> r)<00>orders<72>list[OrderItem]c<01><><00>t|<01><00>}|<00>|<03><00>d<01>|D<00><00>}i}|D]7}|jr.|<05>|jg<00><00><00>|<06><00><00>8t|j<00><00>D]<5D>}|<00>|<07><00>}dD]<5D>\} }
2026-08-30 15:29:21 +08:00
t|| <09><00>} t||
<EFBFBD><00>} | tthvs| s<01>8|<05>| <0B><00>} | r8td<03>| D<00><00><00><00>rtnt}t||
2026-08-31 13:00:22 +08:00
|<0E><00><00><>|<00> |<08><00><00><>t|j<00><00>D]}||vr|<00>|<07><00><00>|<00><00><00>dS)uT用真实持仓和委托恢复本地状态拆分订单全部完成才算完成。c<01>2<00>h|]}|jdk<00> |j<00><02>S)r)rRrQ)<02>.0rGs r*<00> <setcomp>z"State.reconcile.<locals>.<setcomp>}s(<00><00>
2026-08-30 14:46:34 +08:00
<EFBFBD>
<EFBFBD>
2026-08-31 13:00:22 +08:00
<EFBFBD> $<24><14><1B>q<EFBFBD><1F><1F>D<EFBFBD>O<EFBFBD><1F><1F>r)))rr)rr!c3<01>,K<00>|]}|jdkV<00><00>dS)<02>56N)<01>status)r^<00>orders r*<00> <genexpr>z"State.reconcile.<locals>.<genexpr><3E>s)<00><00><00><00>Q<>Q<><05>u<EFBFBD>|<7C>t<EFBFBD>3<>Q<>Q<>Q<>Q<>Q<>Qr)N)rBrY<00>local_order_id<69>
setdefault<EFBFBD>appendrCrF<00>getattr<74>
STATUS_ING<EFBFBD>STATUS_UNKNOWN<57>allrT<00>setattrrIrMrV)r5rNrZ<00> position_list<73>position_codes<65>orders_by_local_idrcrrG<00> order_id_attr<74> status_attrre<00>current_status<75>matching_ordersrbs r*<00> reconcilezState.reconcileus<><00><00> <1D>Y<EFBFBD><0F><0F> <0A> <0C><1B><1B>M<EFBFBD>*<2A>*<2A>*<2A>
2026-08-30 14:46:34 +08:00
<EFBFBD>
<EFBFBD>(5<>
<EFBFBD>
<EFBFBD>
2026-08-30 15:29:21 +08:00
<EFBFBD><0E>:<<3C><1A><1B> V<01> V<01>E<EFBFBD><14>#<23> V<01>"<22>-<2D>-<2D>e<EFBFBD>.B<>B<EFBFBD>G<>G<>N<>N<>u<EFBFBD>U<>U<>U<><55><18><14><1A>$<24>$<24> <1B> <1B>D<EFBFBD><17>8<EFBFBD>8<EFBFBD>D<EFBFBD>><3E>><3E>D<EFBFBD>/<0E> 7<> 7<>*<2A> <0A>{<7B>")<29><14>}<7D>!=<3D>!=<3D><0E>!(<28><14>{<7B>!;<3B>!;<3B><0E>"<22>:<3A>~<7E>*F<>F<>F<>)<29>G<01><1D>"4<>"8<>"8<><1E>"H<>"H<><0F>"<22>7<><1F>Q<>Q<><1F>Q<>Q<>Q<>Q<>Q<>(<28> <09> <09>'<27><1B>
<1C>D<EFBFBD>+<2B>v<EFBFBD>6<>6<>6<><36> <10>H<EFBFBD>H<EFBFBD>T<EFBFBD>N<EFBFBD>N<EFBFBD>N<EFBFBD>N<EFBFBD><19><14><1A>$<24>$<24> "<22> "<22>D<EFBFBD><13>><3E>)<29>)<29><14> <0B> <0B>D<EFBFBD>!<21>!<21>!<21><> <0C> <09> <09> <0B> <0B> <0B> <0B> r)c<01><><00>|j5|jj<00>dd<01><02><00>|j<00>|jjdz<00><00>}d<04>|j<00><00><00>D<00><00>}|<01>tj |dd<06><07><00>dzd <09>
2026-08-28 18:52:27 +08:00
<EFBFBD><00>|<01>
2026-08-31 13:00:22 +08:00
|j<00><00>d d d <0B><00>d S#1swxYwYd S) uD将内存状态格式化写入 JSON并原子替换正式文件。T)<02>parents<74>exist_okz.tmpc<01>4<00>i|]\}}|t|<02><00><00><02>Sr()r<00>r^rrGs r*<00>
<dictcomp>zState.save.<locals>.<dictcomp><3E>s4<00><00><0E><0E><0E><1E>D<EFBFBD>$<24><15>f<EFBFBD>T<EFBFBD>l<EFBFBD>l<EFBFBD><0E><0E>r)F<>)<02> ensure_ascii<69>indent<6E>
<EFBFBD>utf-8<><01>encodingN) r2r-<00>parent<6E>mkdir<69> with_suffix<69>suffixr4<00>
write_text<EFBFBD>json<6F>dumps<70>replace)r5<00>temporary_path<74>payloads r*rVz
State.save<76>s*<00><00> <11>Y<EFBFBD> .<2E> .<2E> <10>I<EFBFBD> <1C> "<22> "<22>4<EFBFBD>$<24> "<22> ?<3F> ?<3F> ?<3F>!<21>Y<EFBFBD>2<>2<>4<EFBFBD>9<EFBFBD>3C<33>f<EFBFBD>3L<33>M<>M<>N<EFBFBD><0E><0E>"&<26>*<2A>"2<>"2<>"4<>"4<><0E><0E><0E>G<EFBFBD> <1B> %<25> %<25><14>
2026-08-28 18:52:27 +08:00
<EFBFBD>7<EFBFBD><15>q<EFBFBD>A<>A<>A<>D<EFBFBD>H<> <20> &<26> <0E> <0E> <0E> <1B> "<22> "<22>4<EFBFBD>9<EFBFBD> -<2D> -<2D> -<2D> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E> .<2E><><EFBFBD><EFBFBD> .<2E> .<2E> .<2E> .<2E> .<2E> .s<00>B5C
<03>
C<07>C<07>dict[str, StateItem]c<01><><00> tj|j<00>d<01><02><00><00><00>}n>#t$ricYSt
tjf$r}td|<02><00><02><00>|<02>d}~wwxYwt|t<00><00>std<05><00><00> d<06>|<01>
2026-08-31 13:00:22 +08:00
<00><00>D<00><00>S#ttf$r}td|<02><00><02><00>|<02>d}~wwxYw)uB读取已有状态文件文件不存在时从空状态开始。rr<>u [状态] 读取或解析失败: Nu3[状态] 状态文件根节点必须是 JSON 对象c<01>.<00>i|]\}}|tdi|<02><01><01><02>S)r()rrys r*rzzState._load.<locals>.<dictcomp><3E>s<<00><00><0E><0E><0E><1E>D<EFBFBD>$<24><15>i<EFBFBD>'<27>'<27>$<24>'<27>'<27><0E><0E>r)u[状态] 状态字段无效: ) r<><00>loadsr-<00> read_text<78>FileNotFoundError<6F>OSError<6F>JSONDecodeError<6F>
2026-08-28 18:52:27 +08:00
ValueError<EFBFBD>
2026-08-31 13:00:22 +08:00
isinstance<EFBFBD>dictr4<00> TypeError)r5<00>raw<61>excs r*r3z State._load<61>s!<00><00> P<01><16>*<2A>T<EFBFBD>Y<EFBFBD>0<>0<>'<27>0<>B<>B<>C<>C<>C<EFBFBD>C<EFBFBD><43> <20> <16> <16> <16><15>I<EFBFBD>I<EFBFBD>I<EFBFBD><17><14>-<2D>.<2E> P<01> P<01> P<01><1C>E<><03>E<>E<>F<>F<>C<EFBFBD> O<><4F><EFBFBD><EFBFBD><EFBFBD> P<01><><EFBFBD><EFBFBD><1A>#<23>t<EFBFBD>$<24>$<24> T<01><1C>R<>S<>S<> S<> M<01><0E><0E>"%<25>)<29>)<29>+<2B>+<2B><0E><0E><0E> <0E><><1A>:<3A>&<26> M<01> M<01> M<01><1C>B<>S<EFBFBD>B<>B<>C<>C<><13> L<><4C><EFBFBD><EFBFBD><EFBFBD> M<01><><EFBFBD>s2<00>-0<00> A+<03>A+<03>A&<03>&A+<03>B1<00>1C<03>C<03>CN)r-r.r/r0)r7r.r8rr9rr/r:)r/r@)rrr/r)rGrr/r0)rrr/rJ)rNrOr/r0)rNrOrZr[r/r0)r/r0)r/r<>)r"r#r$r%r6<00> classmethodr?<00>propertyrCrFrIrMrYrtrVr3r(r)r*r,r,,s<00><00><00><00><00><00><08><08> "<22>"<22>"<22>"<22>
2026-08-28 18:52:27 +08:00
<11><1F><1F><1F><11>[<5B><1F><0E>$<24>$<24>$<24><0E>X<EFBFBD>$<24>
2026-08-31 13:00:22 +08:00
$<24>$<24>$<24>$<24>
2026-08-28 18:52:27 +08:00
)<29>)<29>)<29>)<29>
2026-08-31 13:00:22 +08:00
:<3A>:<3A>:<3A>:<3A> <14><14><14><14>8-<14>-<14>-<14>-<14>^ .<2E> .<2E> .<2E> .<2E>M<01>M<01>M<01>M<01>M<01>Mr)r,)r%<00>
__future__rr<><00> dataclassesrr<00>pathlibr<00> threadingr<00>typingr <00>sdkr
r r'rirT<00> STATUS_FAILED<45>STATUS_CANCELEDrjrr,r(r)r*<00><module>r<>s4<00><01>B<>B<>"<22>"<22>"<22>"<22>"<22>"<22> <0B> <0B> <0B> <0B>)<29>)<29>)<29>)<29>)<29>)<29>)<29>)<29><18><18><18><18><18><18><1A><1A><1A><1A><1A><1A><1B><1B><1B><1B><1B><1B>'<27>'<27>'<27>'<27>'<27>'<27>'<27>'<27><11> <0B> <12>
<EFBFBD> <10> <09><18> <0A><1C><0F><1A><0E> <0B><19><14><16><16><16>$<24>$<24>$<24>$<24>$<24>$<24>$<24><17><16>$<24>(YM<01>YM<01>YM<01>YM<01>YM<01>YM<01>YM<01>YM<01>YM<01>YMr)