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

81 lines
16 KiB
Plaintext
Raw Normal View History

2026-08-28 18:52:27 +08:00
<EFBFBD>
2026-08-30 14:46:34 +08:00
~<7E><>ji#<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
Zd Zd Zd ZdZed<0F><10><00>Gd<11>d<12><00><00><00>ZGd<13>d<14><00>Zd+d<1F>Zd,d"<22>Zd-d%<25>Zd.d'<27>Zd/d*<2A>ZdS)0u<趋势策略持仓状态的内存管理与 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-30 14:46:34 +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>Zed&d<0F><04><00>Z d'd<12>Z
d(d<14>Z d)d<16>Z d)d<17>Z d*d<1A>Zd+d<1F>Zd,d <20>Zd-d"<22>Zd#S).<2E>Stateu<65>线程安全的策略状态存储。
2026-08-28 18:52:27 +08:00
状态以内存字典提供快速访问,并通过临时文件替换的方式写入 JSON
防止程序在写入过程中退出而破坏原状态文件。
<20>path<74>
2026-08-30 14:46:34 +08:00
str | Path<74>return<72>Nonec<01><><00>t|<01><00>|_t<00><00>|_|<00><00><00>|_dS<00>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>
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>clsr8r9r:<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)r3<00>listr5<00>r6s 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>-c<01><><00>|j5d<01>|j<00><00><00>D<00><00>cddd<02><00>S#1swxYwYdS)uB返回存在处理中或未知订单状态的证券代码快照。c<01>6<00>g|]\}}t|<02><00><00>|<01><02>Sr()<01>_has_unresolved_order<65><03>.0r<00>items r*<00>
<listcomp>z*State.unresolved_codes.<locals>.<listcomp>Ms:<00><00><0E><0E><0E><1E>D<EFBFBD>$<24>(<28><14>.<2E>.<2E><0E><14><0E><0E>r)N<>r3r5rDs r*<00>unresolved_codeszState.unresolved_codesIs<><00><00><12>Y<EFBFBD> <0E> <0E><0E><0E>"&<26>*<2A>"2<>"2<>"4<>"4<><0E><0E><0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><><EFBFBD><EFBFBD> <0E> <0E> <0E> <0E> <0E> s <00>#8<03><<07><rrc<01>^<00>|j5|j|cddd<01><00>S#1swxYwYdS)u<获取指定证券的状态;不存在时抛出 KeyError。NrM)r6rs r*<00>getz State.getSsx<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>&rKc<01>d<00>|j5||j|j<ddd<01><00>dS#1swxYwYdS)u'新增或覆盖一只证券的状态。N)r3r5r)r6rKs r*<00>setz State.setXs|<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>|<01><00>}|<02>t|<02><00>r ddd<01><00>dS|j<00>|d<01><00>ducddd<01><00>S#1swxYwYdS)u?删除已终结的证券状态并返回是否实际删除。NF)r3r5rPrH<00>pop<6F>r6rrKs r*<00>deletez State.delete]s<><00><00> <11>Y<EFBFBD> :<3A> :<3A><17>:<3A>><3E>><3E>$<24>'<27>'<27>D<EFBFBD><13><1F>$9<>$<24>$?<3F>$?<3F><1F><1C> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><18>:<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>-A+<03>A+<03>+A/<07>2A/c<01><><00>|j5|j<00>|<01><00>}|duot|<02><00>cddd<01><00>S#1swxYwYdS)uB判断证券是否存在必须阻止自动下单的未决订单。N)r3r5rPrHrVs r*<00>has_unresolved_orderzState.has_unresolved_orderes<><00><00> <11>Y<EFBFBD> D<01> D<01><17>:<3A>><3E>><3E>$<24>'<27>'<27>D<EFBFBD><17>t<EFBFBD>#<23>C<>(=<3D>d<EFBFBD>(C<>(C<> D<01> D<01> D<01> D<01> D<01> D<01> D<01> D<01> D<01> D<01> D<01> D<01><><EFBFBD><EFBFBD> D<01> D<01> D<01> D<01> D<01> Ds<00>-A<03>A<07> A<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-30 14:46:34 +08:00
r)rrrrN) rRrE<00>
2026-08-28 18:52:27 +08:00
stock_code<EFBFBD>volume<6D>
2026-08-30 14:46:34 +08:00
open_pricer<00> STATUS_OK<4F>add<64>save)r6rZ<00> known_codes<65>positions r*<00>sync_positionszState.sync_positionsks<><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]<5D>deals<6C>list[dict[str, str]]c<01> <00>t|<01><00>}|<00>|<04><00>d<01>|D<00><00>}t|j<00><00>D]z}|<00>|<06><00>}t |j|j|j||<03><00>|_t |j|j |j
||<03><00>|_ |<00> |<07><00><00>{t|j<00><00>D]}||vr|<00> |<06><00><00>|<00> <00><00>dS)uQ用真实持仓、委托和成交恢复本地状态不增加持久化字段。c<01>2<00>h|]}|jdk<00> |j<00><02>S)r)r^r])rJrKs r*<00> <setcomp>z"State.reconcile.<locals>.<setcomp><3E>s(<00><00>
<EFBFBD>
<EFBFBD>
<EFBFBD> $<24><14><1B>q<EFBFBD><1F><1F>D<EFBFBD>O<EFBFBD><1F><1F>r)N)rCrerErP<00>_reconcile_legrrrrr!rrRrWrb)r6rZrfrh<00> position_list<73>position_codesrrKs r*<00> reconcilezState.reconcile<6C>s<00><00><1D>Y<EFBFBD><0F><0F> <0A> <0C><1B><1B>M<EFBFBD>*<2A>*<2A>*<2A>
<EFBFBD>
<EFBFBD>(5<>
<EFBFBD>
<EFBFBD>
<EFBFBD><0E><19><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<>d<EFBFBD>m<EFBFBD>V<EFBFBD>U<EFBFBD> <0E> <0E>D<EFBFBD> <1C>!/<2F><14>#<23>T<EFBFBD>%6<><04><0E><06>PU<50>!<0E>!<0E>D<EFBFBD> <1D> <11>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-30 14:46:34 +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()rrIs 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) r3r-<00>parent<6E>mkdir<69> with_suffix<69>suffixr5<00>
write_text<EFBFBD>json<6F>dumps<70>replace)r6<00>temporary_path<74>payloads r*rbz
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-30 14:46:34 +08:00
<00><00>D<00><00>S#ttf$r}td|<02><00><02><00>|<02>d}~wwxYw)uB读取已有状态文件文件不存在时从空状态开始。rzr{u [状态] 读取或解析失败: Nu3[状态] 状态文件根节点必须是 JSON 对象c<01>.<00>i|]\}}|tdi|<02><01><01><02>S)r()rrIs r*ruzState._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-30 14:46:34 +08:00
isinstance<EFBFBD>dictr5<00> TypeError)r6<00>raw<61>excs r*r4z 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)r8r.r9rr:rr/r;)r/rA)rrr/r)rKrr/r0)rrr/rS)rZr[r/r0)rZr[rfrgrhrir/r0)r/r0)r/r<>)r"r#r$r%r7<00> classmethodr@<00>propertyrErNrPrRrWrYrerprbr4r(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-30 14:46:34 +08:00
<0E><0E><0E><0E><0E>X<EFBFBD><0E>$<24>$<24>$<24>$<24>
2026-08-28 18:52:27 +08:00
)<29>)<29>)<29>)<29>
2026-08-30 14:46:34 +08:00
:<3A>:<3A>:<3A>:<3A>D<01>D<01>D<01>D<01> <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,<00>local_order_idr<00>current_status<75> expected_qtyrrfrgrhrir/c<01>|<00><00> <0C>|tthvs<02>s|S<00>fd<01>|D<00><00>}|r|dnd}|<06>P<EFBFBD>fd<03>|D<00><00>}td<04>|D<00><00><00><00>}|dkr ||krtS|dkr |rtStS|j<00><00><00><00> <0C><00> fd<06>|D<00><00>}td<07>|D<00><00><00><00>}t |j|<08><00>} |jp|}
|j } |
dkr | |
krtS| dvrtS| d vr| dkrtntS| d
vr| dkrtntStS) Nc<01>*<00><01>g|]}|j<00>k<00> |<01><02>Sr()r<>)rJ<00>orderr<72>s <20>r*rLz"_reconcile_leg.<locals>.<listcomp><3E>s-<00><><00><06><06><06><17>U<EFBFBD>%9<>^<5E>%K<>%K<><05>%K<>%K<>%Kr)<00><><EFBFBD><EFBFBD><EFBFBD>c<01>4<00><01>g|]}t|<01><02><00><00>|<01><02>Sr()<01>_matches_local_order)rJ<00>rowr<77>s <20>r*rLz"_reconcile_leg.<locals>.<listcomp><3E>s9<00><><00>
<EFBFBD>
<EFBFBD>
<EFBFBD><17>$8<><13>n<EFBFBD>$M<>$M<>
<EFBFBD> <0F>
<EFBFBD>
<EFBFBD>
r)c3<01>4K<00>|]}t|<01><00>V<00><00>dSr2<00><01> _deal_volume<6D>rJr<>s r*<00> <genexpr>z!_reconcile_leg.<locals>.<genexpr><3E>s*<00><00><00><00>@<40>@<40>#<23>L<EFBFBD><13>%<25>%<25>@<40>@<40>@<40>@<40>@<40>@r)rc<01><><00><02>g|]R}<01>r:t|<01>d<00><00>pd<01><00><00><00><00><00>ks<12><03>@t|<01><02><00><00>P|<01><02>SS)<02>m_strOrderSysIDr )rrP<00>stripr<70>)rJr<>r<><00>system_order_ids <20><>r*rLz"_reconcile_leg.<locals>.<listcomp><3E>s}<00><><00><06><06><06> <0F> <1B> <06>
<14>C<EFBFBD>G<EFBFBD>G<EFBFBD>-<2D>.<2E>.<2E>4<>"<22>5<>5<>;<3B>;<3B>=<3D>=<3D><1F>P<>P<><1F>Q<01>$8<><13>n<EFBFBD>$M<>$M<>Q<01> <0C>Q<01>P<>Pr)c3<01>4K<00>|]}t|<01><00>V<00><00>dSr2r<>r<>s r*r<>z!_reconcile_leg.<locals>.<genexpr><3E>s*<00><00><00><00><<3C><<3C>c<EFBFBD> <0C>S<EFBFBD>!<21>!<21><<3C><<3C><<3C><<3C><<3C><r)><00>48<34>49<34>50<35>51<35>52<35>55><00>54<35>56><00>57<35>58) <0C>
STATUS_ING<EFBFBD>STATUS_UNKNOWN<57>sumr`<00>idr<64><00>max<61> traded_volumer^<00>status<75>STATUS_CANCELED<45> STATUS_FAILED) r<>r<>r<>rfrh<00>matching_ordersr<73><00>matching_deals<6C>dealt<6C>traded<65>orderedr<64>r<>s ` @r*rmrm<00>s<><00><><EFBFBD><00><16>j<EFBFBD>.<2E>9<>9<>9<><1E>9<><1D><1D><06><06><06><06>!<21><06><06><06>O<EFBFBD>$3<> <<3C>O<EFBFBD>B<EFBFBD> <1F> <1F><04>E<EFBFBD> <0C>}<7D>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD> <20>
<EFBFBD>
<EFBFBD>
<EFBFBD><0E><14>@<40>@<40><1E>@<40>@<40>@<40>@<40>@<40><05> <17>!<21> <1B> <1B><05><1C> 5<> 5<><1C> <1C> <17>1<EFBFBD> <1C> <1C><1E> <1C><1C> <1C><1D><1D><1B>h<EFBFBD>n<EFBFBD>n<EFBFBD>&<26>&<26>O<EFBFBD><06><06><06><06><06><18><06><06><06>N<EFBFBD> <10><<3C><<3C>^<5E><<3C><<3C><<3C> <<3C> <<3C>E<EFBFBD> <10><15>$<24>e<EFBFBD> ,<2C> ,<2C>F<EFBFBD><13>l<EFBFBD>*<2A>l<EFBFBD>G<EFBFBD> <12>\<5C>F<EFBFBD><0E><11>{<7B>{<7B>v<EFBFBD><17>(<28>(<28><18><18> <0A>5<>5<>5<><19><19> <0A><1C><1D><1D>!'<27>!<21><1A><1A>~<7E>~<7E><1F>@<40> <0A><1C><1D><1D>!'<27>!<21><1A><1A>~<7E>~<7E><1D>><3E> <19>r)rKrSc<01>V<00>|jtthvp|jtthvSr2)rr<>r<>r!)rKs r*rHrH<00>s3<00><00> <0F> <1B>
<EFBFBD>N<EFBFBD>;<3B> ;<3B> <06>t<EFBFBD>?P<><12><16>U<06>@<06>r)r<><00>dict[str, str]c<01><><00>t|<00>d<01><00>pd<02><00>}|<02>dd<04><00>d|kS)N<> m_strRemarkr <00>|<7C>r)rrP<00>split)r<>r<><00>remarks r*r<>r<>s><00><00> <10><13><17><17><1D>'<27>'<27>-<2D>2<EFBFBD> .<2E> .<2E>F<EFBFBD> <11><<3C><<3C><03>Q<EFBFBD> <1F> <1F><01> "<22>n<EFBFBD> 4<>4r)<00>dealc<01>h<00>dD].}t|<00>|<01><00><00><00>}|dkr|cS<00>/dS)N)<03> m_nVolume<6D>m_nTradeVolume<6D>m_nVolumeTradedr)<02>_as_intrP)r<><00>keyr^s r*r<>r<>sD<00><00>A<><1A><1A><03><18><14><18><18>#<23><1D><1D>'<27>'<27><06> <11>A<EFBFBD>:<3A>:<3A><19>M<EFBFBD>M<EFBFBD>M<EFBFBD> <16> <0C>1r)<00>value<75>objectc<01>V<00> t|pd<01><00>S#ttf$rYdSwxYw)Nr)rr<>r<>)r<>s r*r<>r<> 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<>rr<>rr<>rrfrgrhrir/r)rKrr/rS)r<>r<>r<>rr/rS)r<>r<>r/r)r<>r<>r/r)r%<00>
__future__rr<><00> dataclassesrr<00>pathlibr<00> threadingr<00>typingr <00>sdkr
r r'r<>r`r<>r<>r<>rr,rmrHr<>r<>r<>r(r)r*<00><module>r<>s<><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>x.<1A>.<1A>.<1A>.<1A>b<06><06><06><06>5<>5<>5<>5<>
 <0A> <0A> <0A> <0A><11><11><11><11><11>r)