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

91 lines
12 KiB
Plaintext
Raw Normal View History

2026-08-28 18:52:27 +08:00
<EFBFBD>
2026-08-28 22:56:35 +08:00
F<><46>j/<00><01><><00>dZddlmZddlZddlmZmZddlmZddl m
2026-08-28 18:52:27 +08:00
Z
ddl m Z ddl mZd Zd
2026-08-28 22:56:35 +08:00
Zd Zd Zd ZdZed<0F><10><00>Gd<11>d<12><00><00><00>ZGd<13>d<14><00>Zd!d<1C>Zd"d <20>ZdS)#u<趋势策略持仓状态的内存管理与 JSON 持久化。<E58C96>)<01> annotationsN)<02>asdict<63> dataclass<73><01>Path)<01>Lock)<01>Iterable)<01>Position<6F><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-28 22:56:35 +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>
added_cost<EFBFBD> added_statusN)<0F>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__<5F>__annotations__rrr<00> STATUS_NONErrrrrr <00><00><00>!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<14>Z d&d<17>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-28 22:56:35 +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-28 22:56:35 +08:00
r(<00>data_dir<69>strategyr<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>clsr6r7r8<00>
state_paths r)<00> for_strategyzState.for_strategy8s3<00><00><1A>(<28>^<5E>^<5E><18>&K<>&K<>J<EFBFBD>&K<>&K<>&K<>K<>
<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)r1<00>listr3)r4s 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)r1r3<00>r4rs 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)r1r3r)r4rFs 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>)c<01>|<00>|j5|j<00>|d<01><00>ddd<01><00>dS#1swxYwYdS)u3删除证券状态证券不存在时不报错。N)r1r3<00>poprDs r)<00>deletez State.deleteSs<><00><00> <11>Y<EFBFBD> '<27> '<27> <10>J<EFBFBD>N<EFBFBD>N<EFBFBD>4<EFBFBD><14> &<26> &<26> &<26> '<27> '<27> '<27> '<27> '<27> '<27> '<27> '<27> '<27> '<27> '<27> '<27><><EFBFBD><EFBFBD> '<27> '<27> '<27> '<27> '<27> 's <00>1<03>5<07>5<07> positions<6E>Iterable[Position]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-28 22:56:35 +08:00
r)rrrrN) rHrB<00>
2026-08-28 18:52:27 +08:00
stock_code<EFBFBD>volume<6D>
2026-08-28 22:56:35 +08:00
open_pricer<00> STATUS_OK<4F>add<64>save)r4rL<00> known_codes<65>positions r)<00>sync_positionszState.sync_positionsXs<><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[dict[str, str]]<5D>dealsc<01><><00>t|<01><00>}|<00>|<04><00>d<01>|D<00><00>}t|j<00><00>D]}||vr|<00>|<06><00><00>t|j<00><00>D]n}|<00>|<06><00>}t |j|j||<03><00>|_t |j|j ||<03><00>|_ |<00>
|<07><00><00>o|<00> <00><00>dS)uQ用真实持仓、委托和成交恢复本地状态不增加持久化字段。c<01>2<00>h|]}|jdk<00> |j<00><02>S)r)rPrO)<02>.0rFs r)<00> <setcomp>z"State.reconcile.<locals>.<setcomp>}s(<00><00>
<EFBFBD>
<EFBFBD>
<EFBFBD> $<24><14><1B>q<EFBFBD><1F><1F>D<EFBFBD>O<EFBFBD><1F><1F>r(N) rArWrBrKrE<00>_reconcile_legrrrr rHrT)r4rLrXrZ<00> position_list<73> active_codesrrFs r)<00> reconcilezState.reconcilets
<00><00><1D>Y<EFBFBD><0F><0F> <0A> <0C><1B><1B>M<EFBFBD>*<2A>*<2A>*<2A>
<EFBFBD>
<EFBFBD>(5<>
<EFBFBD>
<EFBFBD>
<EFBFBD> <0C><19><14><1A>$<24>$<24> "<22> "<22>D<EFBFBD><13><<3C>'<27>'<27><14> <0B> <0B>D<EFBFBD>!<21>!<21>!<21><><18><14><1A>$<24>$<24> <1B> <1B>D<EFBFBD><17>8<EFBFBD>8<EFBFBD>D<EFBFBD>><3E>><3E>D<EFBFBD>-<2D><14>"<22>D<EFBFBD>$4<>f<EFBFBD>e<EFBFBD> <0E> <0E>D<EFBFBD> <1C>!/<2F><14>#<23>T<EFBFBD>%6<><06><05>!<0E>!<0E>D<EFBFBD> <1D> <11>H<EFBFBD>H<EFBFBD>T<EFBFBD>N<EFBFBD>N<EFBFBD>N<EFBFBD>N<EFBFBD> <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-28 22:56:35 +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]rrFs 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) r1r,<00>parent<6E>mkdir<69> with_suffix<69>suffixr3<00>
write_text<EFBFBD>json<6F>dumps<70>replace)r4<00>temporary_path<74>payloads r)rTz
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-28 22:56:35 +08:00
<00><00>D<00><00>S#ttf$r}td|<02><00><02><00>|<02>d}~wwxYw)uB读取已有状态文件文件不存在时从空状态开始。rmrnu [状态] 读取或解析失败: Nu3[状态] 状态文件根节点必须是 JSON 对象c<01>.<00>i|]\}}|tdi|<02><01><01><02>S)r')rrgs r)rhzState._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[状态] 状态字段无效: ) ru<00>loadsr,<00> read_text<78>FileNotFoundError<6F>OSError<6F>JSONDecodeError<6F>
2026-08-28 18:52:27 +08:00
ValueError<EFBFBD>
2026-08-28 22:56:35 +08:00
isinstance<EFBFBD>dictr3<00> TypeError)r4<00>raw<61>excs r)r2z 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.r/)r6r-r7rr8rr.r9)r.r?)rrr.r)rFrr.r/)rrr.r/)rLrMr.r/)rLrMrXrYrZrYr.r/)r.r/)r.rz)r!r"r#r$r5<00> classmethodr><00>propertyrBrErHrKrWrbrTr2r'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>
$<24>$<24>$<24>$<24>
)<29>)<29>)<29>)<29>
'<27>'<27>'<27>'<27>
2026-08-28 22:56:35 +08:00
<14><14><14><14>8<14><14><14><14>6 .<2E> .<2E> .<2E> .<2E>M<01>M<01>M<01>M<01>M<01>Mr(r+<00>local_order_idr<00>current_statusrXrYrZr.c<01><><00><00>|tks<02>s|St<00>fd<01>|D<00><00><00><00>rtSt<00>fd<02>|D<00><00>d<00><00>}|<04>tSt |<04>d<03><00><00><00>}t|<04>dd<05><00><00><00>}|dkr |dvrtS|dvrtS|d vrtStS)
Nc3<01>H<00>K<00>|]}<01>|<01>dd<01><00>vV<00><00>dS<00><03> m_strRemarkr N<>rE<00>r]<00>rowr<77>s <20>r)<00> <genexpr>z!_reconcile_leg.<locals>.<genexpr><3E>s6<00><><00><00><00>
I<EFBFBD>
I<EFBFBD>C<EFBFBD>><3E>S<EFBFBD>W<EFBFBD>W<EFBFBD>]<5D>B<EFBFBD>7<>7<> 7<>
I<EFBFBD>
I<EFBFBD>
I<EFBFBD>
I<EFBFBD>
I<EFBFBD>
Ir(c3<01>L<00>K<00>|]}<01>|<01>dd<01><00>v<00>|V<00><00>dSr<>r<>r<>s <20>r)r<>z!_reconcile_leg.<locals>.<genexpr><3E>sH<00><><00><00><00>
<EFBFBD>
<EFBFBD><17><1D><13><17><17><1D><02>!;<3B>!;<3B>;<3B>;<3B> <10>;<3B>;<3B>;<3B>;<3B>
<EFBFBD>
r(<00>m_nVolumeTraded<65>m_nOrderStatusr r><00>48<34>49<34>50<35>51<35>52<35>55><00>54<35>56><00>57<35>58)
<EFBFBD>
STATUS_ING<EFBFBD>anyrR<00>next<78>STATUS_UNKNOWN<57>_as_intrEr<00>STATUS_CANCELED<45> STATUS_FAILED)r<>r<>rXrZ<00>order<65>traded<65>statuss` r)r_r_<00>s<00><><00> <16><1A>#<23>#<23>><3E>#<23><1D><1D>
<EFBFBD>
I<EFBFBD>
I<EFBFBD>
I<EFBFBD>
I<EFBFBD>5<EFBFBD>
I<EFBFBD>
I<EFBFBD>
I<EFBFBD>I<>I<><19><18><18> <10>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>!<21>
<EFBFBD>
<EFBFBD>
<EFBFBD> <0A>  <06> <06>E<EFBFBD> <0A>}<7D><1D><1D> <14>U<EFBFBD>Y<EFBFBD>Y<EFBFBD>0<>1<>1<> 2<> 2<>F<EFBFBD> <10><15><19><19>+<2B>R<EFBFBD>0<>0<> 1<> 1<>F<EFBFBD> <0A><01>z<EFBFBD>z<EFBFBD>f<EFBFBD>$H<>H<>H<><18><18> <0A><1C><1D><1D><1E><1E> <0A><1C><1D><1D><1C><1C> <15>r(<00>value<75>objectrc<01>V<00> t|pd<01><00>S#ttf$rYdSwxYw)Nr)rr<>r<>)r<>s r)r<>r<><00>s><00><00><11><12>5<EFBFBD>:<3A>A<EFBFBD><EFBFBD><EFBFBD><1E><> <15>z<EFBFBD> "<22><11><11><11><10>q<EFBFBD>q<EFBFBD><11><><EFBFBD>s <00><00>(<03>()
r<EFBFBD>rr<>rrXrYrZrYr.r)r<>r<>r.r)r$<00>
__future__rru<00> dataclassesrr<00>pathlibr<00> threadingr<00>typingr <00>sdkr
r&r<>rRr<>r<>r<>rr+r_r<>r'r(r)<00><module>r<>sS<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><18><18><18><18><18><18><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>(DM<01>DM<01>DM<01>DM<01>DM<01>DM<01>DM<01>DM<01>N<16><16><16><16><<11><11><11><11><11>r(