Files
exchange_monitor_sync/utils/__pycache__/redis_client.cpython-311.pyc

152 lines
23 KiB
Plaintext
Raw Normal View History

2025-12-04 15:40:19 +08:00
<EFBFBD>
2025-12-04 19:44:22 +08:00
<00>i1iDL<00><00><><00>ddlZddlZddlZddlZddlmZddlmZmZm Z ddl
m Z ddl m Z mZmZmZmZmZddlmZmZGd<06>d<07><00>ZdS)<08>N)<01>logger)<03> REDIS_CONFIG<49>COMPUTER_NAMES<45>COMPUTER_NAME_PATTERN)<06>List<73>Dict<63>Any<6E>Set<65>Tuple<6C>Optional)<02>datetime<6D> timedeltac <00>V<00><00>eZdZdZdZ<04>fd<03>Zd<04>Zed<05><00><00>Zd<06>Z de
e e
ffd<08>Z de e fd <09>Zd
e de
e e
ffd <0B>Zde
e e
ffd <0C>Zd e de fd<0E>Zde de de dee
fd<12>Zde
e e
fde
e e e
ffd<14>Zde
e e
fde e
fd<15>Zde de e
de e
fd<17>Zdedede de e
fd<1A>Zde
e e
fde e
fd<1B>Zde de e
de e
fd<1C>Zdedede de e
fd<1D>Zde
de e de
e effd <20>Zd!<21>Z<1E>xZS)"<22> RedisClientuRedis客户端管理器Nc<00><><00><01>|j<00>2t<00><00><00>|<00><00>|_d|j_|jS)NF)<04> _instance<63>super<65>__new__<5F> _initialized)<02>cls<6C> __class__s <20><>9/root/project/exchange_monitor_sync/utils/redis_client.pyrzRedisClient.__new__s4<00><><00> <0E>=<3D> <20>!<21>G<EFBFBD>G<EFBFBD>O<EFBFBD>O<EFBFBD>C<EFBFBD>0<>0<>C<EFBFBD>M<EFBFBD>).<2E>C<EFBFBD>M<EFBFBD> &<26><12>}<7D><1C>c<00><><00>|jsNd|_d|_d|_|<00><00><00>|_t jt<00><00>|_dSdS)NT) r<00>_pool<6F>_client<6E>_get_computer_names<65>computer_names<65>re<72>compiler<00>computer_name_pattern<72><01>selfs r<00>__init__zRedisClient.__init__s]<00><00><13> <20> K<01><1D>D<EFBFBD>J<EFBFBD><1F>D<EFBFBD>L<EFBFBD> $<24>D<EFBFBD> <1D>"&<26>":<3A>":<3A>"<<3C>"<<3C>D<EFBFBD> <1F>)+<2B><1A>4I<34>)J<>)J<>D<EFBFBD> &<26> &<26> &<26>  K<01> Krc<00>F<00>|j<00>|<00><00><00>|jS)u#获取Redis客户端懒加载)r<00>_init_connection_poolr"s r<00>clientzRedisClient.clients&<00><00> <10><<3C> <1F> <10> &<26> &<26> (<28> (<28> (<28><13>|<7C>rc<00><><00> tjtdtdtdtdtdd<06><07><00>|_tj|j<00><08><00>|_|j<00><00><00>tjd <09><00>d S#t$r}tj
2025-12-04 15:40:19 +08:00
d
2025-12-04 19:44:22 +08:00
|<01><00><02><00><00>d }~wwxYw) u初始化连接池<E68EA5>host<73>port<72>db<64>decode_responses<65>max_connectionsT)r)r*r+r,r-<00>socket_keepalive)<01>connection_pooluRedis连接池初始化成功uRedis连接失败: N) <0B>redis<69>ConnectionPoolrr<00>Redisr<00>pingr<00>info<66> Exception<6F>error)r#<00>es rr&z!RedisClient._init_connection_pool%s<><00><00> <12><1E>-<2D>!<21>&<26>)<29>!<21>&<26>)<29><1F><04>%<25>!-<2D>.@<40>!A<> ,<2C>-><3E> ?<3F>!%<25> <0E><0E><0E>D<EFBFBD>J<EFBFBD>!<21>;<3B>t<EFBFBD>z<EFBFBD>B<>B<>B<>D<EFBFBD>L<EFBFBD> <11>L<EFBFBD> <1D> <1D> <1F> <1F> <1F> <12>K<EFBFBD>7<> 8<> 8<> 8<> 8<> 8<><38><18> <12> <12> <12> <12>L<EFBFBD>2<>q<EFBFBD>2<>2<> 3<> 3<> 3<> <11><><EFBFBD><EFBFBD><EFBFBD> <12><><EFBFBD>s<00>B"B&<00>&
C <03>0C<03>C <03>returnc<00><><00> i}d}|jD]1}|<00>|<03><00>}|dz }|<01>|<04><00><00>2|s(tjd<03><00>|<00><00><00>}tjdt|j<00><00><00>dt|<01><00><00>d<06><05><00>|S#t$r#}tj d|<05><00><02><00>icYd}~Sd}~wwxYw) u/从Redis获取所有计算机名的账号配置r<00>u<配置的计算机名未找到数据,尝试自动发现...<2E>从 u 个计算机名获取到 <20>
个账号u获取账户信息失败: N)
r<00>_get_accounts_by_computer_name<6D>updater<00>warning<6E>_discover_all_accountsr4<00>lenr5r6)r#<00> accounts_dict<63>total_keys_processed<65> computer_name<6D>accountsr7s r<00>get_accounts_from_redisz#RedisClient.get_accounts_from_redis:s <00><00> <16><1E>M<EFBFBD>#$<24> <20>"&<26>!4<> /<2F> /<2F> <0A><1F>><3E>><3E>}<7D>M<>M<><08>$<24><01>)<29>$<24><1D>$<24>$<24>X<EFBFBD>.<2E>.<2E>.<2E>.<2E>!<21> ><3E><16><0E>]<5D>^<5E>^<5E>^<5E> $<24> ;<3B> ;<3B> =<3D> =<3D> <0A> <12>K<EFBFBD>q<>s<EFBFBD>4<EFBFBD>#6<>7<>7<>q<>q<>SV<53>Wd<57>Se<53>Se<53>q<>q<>q<> r<> r<> r<> <20> <20><><18> <16> <16> <16> <12>L<EFBFBD>9<>a<EFBFBD>9<>9<> :<3A> :<3A> :<3A><15>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD> <16><><EFBFBD>s<00>B"B%<00>%
C<03>/C <03>C<03> Cc<00><><00>dtvr7d<02>tjd<01><00>D<00><00>}tjd|<01><00><02><00>|Stj<00><00>gS)u获取计算机名列表<E58897>,c<00>6<00>g|]}|<01><00><00><00><02>S<00>)<01>strip)<02>.0<EFBFBD>names r<00>
<listcomp>z3RedisClient._get_computer_names.<locals>.<listcomp>Ws <00><00>H<>H<>H<>d<EFBFBD>T<EFBFBD>Z<EFBFBD>Z<EFBFBD>\<5C>\<5C>H<>H<>Hru#使用配置的计算机名列表: )r<00>splitrr4rK)r#<00>namess rrzRedisClient._get_computer_namesTs[<00><00> <0E>.<2E> <20> <20>H<>H<>n<EFBFBD>.B<>3<EFBFBD>.G<>.G<>H<>H<>H<>E<EFBFBD> <12>K<EFBFBD>E<>e<EFBFBD>E<>E<> F<> F<> F<><18>L<EFBFBD><1E>$<24>&<26>&<26>'<27>'rrDc<00><00>i} |<01>d<01>}|j<00>|<03><00>}|stjd|<03>d<03><03><00>iS|<04><00><00>D]<5D>\}} t j|<06><00>}|s<01>|<00>|<05><00>}|<07><00><00>D](\} }
|<00>|| |
<EFBFBD><00>} | r
|| d<| || <<00>)<29>p#t
j $r$} tj
d|<05>d| <0C><00><04><00>Yd} ~ <0C><>d} ~ wt$r$} tj
d|<05>d | <0C><00><04><00>Yd} ~ <0C><>d} ~ wwxYwtj d
|<03>d t|<02><00><00>d <0C><05><00>n1#t$r$} tj
d |<01>d| <0C><00><04><00>Yd} ~ nd} ~ wwxYw|S)u!获取指定计算机名的账号<E8B4A6> _strategy_apiu
未找到 u 的策略API配置rDu解析交易所 u 的JSON数据失败: Nu处理交易所 <20> 数据异常: r;u 解析到 r<u获取计算机名 u 的账号失败: )r'<00>hgetallr<00>debug<75>items<6D>json<6F>loads<64>format_exchange_id<69> parse_account<6E>JSONDecodeErrorr6r5r4rA) r#rDrB<00> redis_key<65>result<6C> exchange_name<6D> accounts_jsonrE<00> exchange_id<69>
account_id<EFBFBD> account_info<66>parsed_accountr7s rr=z*RedisClient._get_accounts_by_computer_name\s*<00><00><1A> <0A>& U<01>(<28>7<>7<>7<>I<EFBFBD><1A>[<5B>(<28>(<28><19>3<>3<>F<EFBFBD><19> <1A><16> <0C>H<>)<29>H<>H<>H<>I<>I<>I<><19> <09>17<31> <0C> <0C><0E><0E> <1D> <1D>,<2C> <0A>}<7D><1D>#<23>z<EFBFBD>-<2D>8<>8<>H<EFBFBD>#<23>!<21> <20>#'<27>"9<>"9<>-<2D>"H<>"H<>K<EFBFBD>4<<3C>N<EFBFBD>N<EFBFBD>4D<34>4D<34>G<01>G<01>0<>
<EFBFBD>L<EFBFBD>)-<2D>);<3B>);<3B>K<EFBFBD><1A>Ua<55>)b<>)b<><0E>)<29>G<01>>K<>N<EFBFBD>?<3F>;<3B>8F<38>M<EFBFBD>*<2A>5<><35> G<01><><1C>+<2B><1D><1D><1D><1A>L<EFBFBD>!\<5C>M<EFBFBD>!\<5C>!\<5C>YZ<59>!\<5C>!\<5C>]<5D>]<5D>]<5D><1C>H<EFBFBD>H<EFBFBD>H<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD> <20><1D><1D><1D><1A>L<EFBFBD>!U<>M<EFBFBD>!U<>!U<>RS<52>!U<>!U<>V<>V<>V<><1C>H<EFBFBD>H<EFBFBD>H<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD><1D><><EFBFBD><EFBFBD> <13>K<EFBFBD>S<>y<EFBFBD>S<>S<>S<EFBFBD><1D>5G<35>5G<35>S<>S<>S<> T<> T<> T<> T<><54><18> U<01> U<01> U<01> <12>L<EFBFBD>S<>}<7D>S<>S<>PQ<50>S<>S<> T<> T<> T<> T<> T<> T<> T<> T<><54><EFBFBD><EFBFBD><EFBFBD> U<01><><EFBFBD><EFBFBD><1D>se<00>:E<00>E<00>C<02>/E<00>0AC<02>E<00>D"<05>C1<05>,E<00>1 D"<05>>D<05>E<00>D"<05>"+E<00>
E<<03>E7<03>7E<c<00><><00>i}g} d}d} |j<00>||d<04><05><00>\}}|D]C}t|t<00><00>r|<06>d<06><00>n|}|<02>|<07><00><00>D|dkrn<01>nt jdt|<02><00><00>d<08><03><00>|D]t}|<07> d d
<EFBFBD><00>}|j
<00> |<08><00>r+|<00> |<08><00>} |<01> | <09><00><00>]t jd |<08><00><02><00><00>ut jd t|<01><00><00>d <0A><03><00>n.#t$r!}
t jd|
<EFBFBD><00><02><00>Yd}
~
nd}
~
wwxYw|S)u$自动发现所有匹配的账号keyz*_strategy_apirT<>d)<02>match<63>countzutf-8u 自动发现 u 个策略API keyrR<00>u&跳过不符合格式的计算机名: u自动发现共获取到 r<u自动发现账号失败: N)r'<00>scan<61>
isinstance<EFBFBD>bytes<65>decode<64>appendrr4rA<00>replacer!rfr=r>r?r5r6) r#rB<00>discovered_keys<79>pattern<72>cursor<6F>keys<79>key<65>key_strrDrEr7s rr@z"RedisClient._discover_all_accounts<74>s<><00><00><1A> <0A><1C><0F> ;<3B>&<26>G<EFBFBD><16>F<EFBFBD> <1A>#<23>{<7B>/<2F>/<2F><06>g<EFBFBD>S<EFBFBD>/<2F>Q<>Q<> <0C><06><04><1F>4<>4<>C<EFBFBD>5?<3F><03>U<EFBFBD>5K<35>5K<35>T<>c<EFBFBD>j<EFBFBD>j<EFBFBD><17>1<>1<>1<>QT<51>G<EFBFBD>#<23>*<2A>*<2A>7<EFBFBD>3<>3<>3<>3<><19>Q<EFBFBD>;<3B>;<3B><19> <1A> <13>K<EFBFBD>O<><03>O<EFBFBD>(<<3C>(<<3C>O<>O<>O<> P<> P<> P<>+<2B> ]<01> ]<01><07> '<27><0F><0F><0F><12> D<> D<> <0A><18>-<2D>3<>3<>M<EFBFBD>B<>B<>]<01>#<23>B<>B<>=<3D>Q<>Q<>H<EFBFBD>!<21>(<28>(<28><18>2<>2<>2<>2<><1A>N<EFBFBD>#[<5B>M<EFBFBD>#[<5B>#[<5B>\<5C>\<5C>\<5C>\<5C> <12>K<EFBFBD>R<>C<EFBFBD> <0A>4F<34>4F<34>R<>R<>R<> S<> S<> S<> S<><53><18> ;<3B> ;<3B> ;<3B> <12>L<EFBFBD>9<>a<EFBFBD>9<>9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD><EFBFBD> ;<3B><><EFBFBD><EFBFBD><1D>s<00>D4D;<00>;
E&<03>E!<03>!E&rsc<00>Z<00>|<01><00><00><00><00><00>}idd<02>dd<04>dd<04>dd<04>dd<07>dd <09>d d <09>d
d
<EFBFBD>d d
<EFBFBD>d d
<EFBFBD>d d <0A>dd <0A>dd<07>dd<07>dd<10>dd<10>dd<12>dddd<14><03>}|<02>||<01><00>}||kr-||<02><00><00>vrt jd|<01><00><02><00>|S)u格式化交易所ID<49>
metatrader<EFBFBD>mt5<74>binance_spot_test<73>binance<63> binance_spot<6F> gate_spot<6F>gate<74>okex<65>okx<6B>bybit<69>
bybit_spot<EFBFBD>
bybit_test<EFBFBD>huobi<62>
huobi_spot<EFBFBD>gateio<69>kucoin<69> kucoin_spot<6F>mexc<78>bitget)<03> mexc_spotr<74><00> bitget_spotu未映射的交易所名称: )<06>lowerrK<00>get<65>valuesrrU)r#rs<00>exchange_mapping<6E>normalized_keys rrYzRedisClient.format_exchange_id<69>s_<00><00><11>i<EFBFBD>i<EFBFBD>k<EFBFBD>k<EFBFBD><1F><1F>!<21>!<21><03>
<EFBFBD> <18>%<25>
<EFBFBD> <1F><19>
<EFBFBD> <1B>I<EFBFBD>
<EFBFBD> <16>y<EFBFBD> 
<EFBFBD>
<18><16> 
<EFBFBD> <13>E<EFBFBD> 
<EFBFBD> <12>5<EFBFBD>
<EFBFBD> <14>W<EFBFBD>
<EFBFBD> <19>'<27>
<EFBFBD> <19>'<27>
<EFBFBD> <14>W<EFBFBD>
<EFBFBD> <19>'<27>
<EFBFBD> <13>F<EFBFBD>
<EFBFBD> <15>f<EFBFBD>
<EFBFBD> <15>h<EFBFBD>
<EFBFBD> <1A>8<EFBFBD>!
<EFBFBD>" <13>F<EFBFBD>#
<EFBFBD>$ <20><1E>#<23>)
<EFBFBD>
<EFBFBD>
<EFBFBD><18>.*<2A>-<2D>-<2D>c<EFBFBD>3<EFBFBD>7<>7<><0E> <1A>S<EFBFBD> <20> <20>S<EFBFBD>0@<40>0G<30>0G<30>0I<30>0I<30>%I<>%I<> <12>L<EFBFBD>><3E><13>><3E>><3E> ?<3F> ?<3F> ?<3F><1D>rr`rarbc <00><><00> tj|<03><00>}||tj|<04>d<01><00>d<02><00>tj|<04>d<03><00>d<02><00>|<04>dd<05><00>d<06>}|S#tj$r1}t jd|<02>d|<06>d |d
d <0B><00>d <0C><07><00>Yd
}~d
Sd
}~wt$r%}t jd |<02>d|<06><00><04><00>Yd
}~d
Sd
}~wwxYw)u解析账号信息<E4BFA1>st_idr<00>add_time<6D>api_keyrh)r`<00>k_idr<64>r<>r<>u 解析账号 u JSON数据失败: u, 原始数据: Nrez...u 处理账号 rS) rWrX<00>helpers<72>safe_intr<74>r[rr6r5)r#r`rarb<00>source_account_info<66> account_datar7s rrZzRedisClient.parse_account<6E>s1<00><00> <18>"&<26>*<2A>\<5C>":<3A>":<3A> <1F> +<2B>"<22> <20>)<29>*=<3D>*A<>*A<>'<27>*J<>*J<>A<EFBFBD>N<>N<>#<23>,<2C>-@<40>-D<>-D<>Z<EFBFBD>-P<>-P<>RS<52>T<>T<>.<2E>2<>2<>9<EFBFBD>b<EFBFBD>A<>A<> <0E><0E>L<EFBFBD> <20> <1F><><13>#<23> <18> <18> <18> <12>L<EFBFBD>r<><1A>r<>r<><01>r<>r<>[g<>hl<68>il<69>hl<68>[m<>r<>r<>r<> s<> s<> s<><17>4<EFBFBD>4<EFBFBD>4<EFBFBD>4<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><18> <18> <18> <18> <12>L<EFBFBD>G<><1A>G<>G<>A<EFBFBD>G<>G<> H<> H<> H<><17>4<EFBFBD>4<EFBFBD>4<EFBFBD>4<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD> <18><><EFBFBD>s$<00>A=B<00>C-<03>&B;<03>; C-<03>C(<03>(C-rEc<00><><00>i}|<01><00><00>D]@\}}|<04>d<01><00>}|r$||vrg||<||<00>|<04><00><00>A|S)u按交易所分组账号r`)rVr<>rm)r#rE<00>groupsrarbr`s r<00>_group_accounts_by_exchangez'RedisClient._group_accounts_by_exchange<67>st<00><00><13><06>(0<><0E><0E>(8<>(8<> 9<> 9<> $<24>J<EFBFBD> <0C>&<26>*<2A>*<2A>=<3D>9<>9<>K<EFBFBD><1A> 9<><1E>f<EFBFBD>,<2C>,<2C>*,<2C>F<EFBFBD>;<3B>'<27><16>{<7B>#<23>*<2A>*<2A><<3C>8<>8<>8<><38><15> rc<00><00><>K<00>g} |<00>|<01><00>}g}|<03><00><00>D]0\}}|<00>||<06><00>}|<04>|<07><00><00>1t j|ddi<01><01>d{V<00><03>}|D],} t | t<00><00>r|<02>| <09><00><00>-n.#t$r!}
tj d|
<EFBFBD><00><02><00>Yd}
~
nd}
~
wwxYw|S)u!收集所有账号的持仓数据<E695B0>return_exceptionsTNu收集持仓数据失败: ) r<>rV<00>_collect_exchange_positionsrm<00>asyncio<69>gatherrj<00>list<73>extendr5rr6) r#rE<00> all_positions<6E>account_groups<70>tasksr`<00> account_list<73>task<73>resultsr]r7s r<00>_collect_all_positionsz"RedisClient._collect_all_positions<6E>s(<00><00><00><00><1A> <0A> ;<3B>!<21>=<3D>=<3D>h<EFBFBD>G<>G<>N<EFBFBD><17>E<EFBFBD>-;<3B>-A<>-A<>-C<>-C<> #<23> #<23>)<29> <0B>\<5C><1B>7<>7<> <0B>\<5C>R<>R<><04><15> <0C> <0C>T<EFBFBD>"<22>"<22>"<22>"<22>$<24>N<EFBFBD>E<EFBFBD>J<>T<EFBFBD>J<>J<>J<>J<>J<>J<>J<>J<>G<EFBFBD>!<21> 1<> 1<><06><1D>f<EFBFBD>d<EFBFBD>+<2B>+<2B>1<>!<21>(<28>(<28><16>0<>0<>0<><30> 1<><31><19> ;<3B> ;<3B> ;<3B> <12>L<EFBFBD>9<>a<EFBFBD>9<>9<> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A> :<3A><><EFBFBD><EFBFBD><EFBFBD> ;<3B><><EFBFBD><EFBFBD><1D>s<00>B"B)<00>)
C<03>3C<03>Cr<>c<00><00><>K<00>g} g}|D]Y}t|d<00><00>}|<05>dd<03><00>}|<00>|||<01><00>}|<04>|<08><00><00>Zt j|ddi<01><01>d{V<00><03>} | D],}
t |
t<00><00>r|<03>|
<EFBFBD><00><00>-n1#t$r$} tj d|<01>d| <0B><00><04><00>Yd} ~ nd} ~ wwxYw|S) u$收集某个交易所的持仓数据r<E68DAE>r<>rr<>TN<54>收集交易所 u 持仓数据失败: ) <0C>intr<74><00>_get_positions_from_redisrmr<>r<>rjr<>r<>r5rr6) r#r`r<><00>positions_listr<74>rbr<>r<>r<>r<>r]r7s rr<>z'RedisClient._collect_exchange_positionss8<00><00><00><00><1B><0E> S<01><16>E<EFBFBD> ,<2C> #<23> #<23> <0C><1A><<3C><06>/<2F>0<>0<><04>$<24>(<28>(<28><17>!<21>4<>4<><05><1B>5<>5<>d<EFBFBD>E<EFBFBD>;<3B>O<>O<><04><15> <0C> <0C>T<EFBFBD>"<22>"<22>"<22>"<22>$<24>N<EFBFBD>E<EFBFBD>J<>T<EFBFBD>J<>J<>J<>J<>J<>J<>J<>J<>G<EFBFBD>!<21> 2<> 2<><06><1D>f<EFBFBD>d<EFBFBD>+<2B>+<2B>2<>"<22>)<29>)<29>&<26>1<>1<>1<><31> 2<><32><19> S<01> S<01> S<01> <12>L<EFBFBD>Q<>K<EFBFBD>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<> R<> R<> R<> R<> R<><52><EFBFBD><EFBFBD><EFBFBD> S<01><><EFBFBD><EFBFBD><1E>s<00>B$B+<00>+
C<03>5C<03>Cr<>r<>c<00><00>K<00> |<03>d|<01><00>}|j<00>|d<02><00>}|sgStj|<05><00>}|D]}||d<||d<||d<<00>|S#t$r&}t jd|<01>d|<08><00><04><00>gcYd}~Sd}~wwxYw) u从Redis获取持仓数据z :positions:<3A> positionsr<73>r<>r`u$获取Redis持仓数据失败: k_id=<3D>, error=N)r'<00>hgetrWrXr5rr6) r#r<>r<>r`r\<00>
redis_datar<EFBFBD><00>positionr7s rr<>z%RedisClient._get_positions_from_redis-s<><00><00><00><00> <16>&<26>9<>9<>4<EFBFBD>9<>9<>I<EFBFBD><1D><1B>)<29>)<29>)<29>[<5B>A<>A<>J<EFBFBD><1D> <1A><19> <09><1C>
<EFBFBD>:<3A>.<2E>.<2E>I<EFBFBD>&<26> 6<> 6<><08>#'<27><08><16> <20>$)<29><08><17>!<21>*5<><08><1D>'<27>'<27><1C> <1C><><18> <16> <16> <16> <12>L<EFBFBD>Q<><04>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<><15>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD> <16><><EFBFBD>s"<00>%A<00>)A<00>
B<03>A?<03>9B<03>?Bc<00><00><>K<00>g} |<00>|<01><00>}g}|<03><00><00>D]0\}}|<00>||<06><00>}|<04>|<07><00><00>1t j|ddi<01><01>d{V<00><03>}|D],} t | t<00><00>r|<02>| <09><00><00>-tj
dt|<02><00><00>d<05><03><00>n.#t$r!}
tj d|
<EFBFBD><00><02><00>Yd}
~
nd}
~
wwxYw|S)u'收集所有账号的账户信息数据r<E68DAE>TNu
收集到 u 条账户信息记录u 收集账户信息数据失败: )r<>rV<00>_collect_exchange_account_datarmr<>r<>rjr<>r<>rr4rAr5r6) r#rE<00>all_account_datar<61>r<>r`r<>r<>r<>r]r7s r<00>_collect_all_account_dataz%RedisClient._collect_all_account_dataFsO<00><00><00><00><1D><18> A<01>!<21>=<3D>=<3D>h<EFBFBD>G<>G<>N<EFBFBD><17>E<EFBFBD>-;<3B>-A<>-A<>-C<>-C<> #<23> #<23>)<29> <0B>\<5C><1B>:<3A>:<3A>;<3B> <0C>U<>U<><04><15> <0C> <0C>T<EFBFBD>"<22>"<22>"<22>"<22>$<24>N<EFBFBD>E<EFBFBD>J<>T<EFBFBD>J<>J<>J<>J<>J<>J<>J<>J<>G<EFBFBD>!<21> 4<> 4<><06><1D>f<EFBFBD>d<EFBFBD>+<2B>+<2B>4<>$<24>+<2B>+<2B>F<EFBFBD>3<>3<>3<><33> <12>K<EFBFBD>R<>S<EFBFBD>)9<>%:<3A>%:<3A>R<>R<>R<> S<> S<> S<> S<><53><18> A<01> A<01> A<01> <12>L<EFBFBD>?<3F>A<EFBFBD>?<3F>?<3F> @<40> @<40> @<40> @<40> @<40> @<40> @<40> @<40><><EFBFBD><EFBFBD><EFBFBD> A<01><><EFBFBD><EFBFBD> <20>s<00>CC<00>
C9<03>C4<03>4C9c<00><00><>K<00>g} |D]_}t|d<00><00>}|<04>dd<03><00>}|<00>|||<01><00><00>d{V<00><03>}|<03>|<07><00><00>`t jd|<01>dt |<03><00><00>d<07><05><00>n1#t$r$}t jd|<01>d |<08><00><04><00>Yd}~nd}~wwxYw|S)
u*收集某个交易所的账户信息数据r<E68DAE>r<>rNu
交易所 u : 收集到 u 条账户信息r<E681AF>u 账户信息失败: ) r<>r<><00>_get_account_info_from_redisr<73>rrUrAr5r6) r#r`r<><00>account_data_listrbr<>r<>r<>r7s rr<>z*RedisClient._collect_exchange_account_datacs<00><00><00><00><1E><19> S<01> ,<2C> 7<> 7<> <0C><1A><<3C><06>/<2F>0<>0<><04>$<24>(<28>(<28><17>!<21>4<>4<><05>&*<2A>%F<>%F<>t<EFBFBD>U<EFBFBD>T_<54>%`<60>%`<60>`<60>`<60>`<60>`<60>`<60>`<60> <0C>!<21>(<28>(<28><1C>6<>6<>6<>6<> <12>L<EFBFBD>g<>k<EFBFBD>g<>g<>s<EFBFBD>CT<43>?U<>?U<>g<>g<>g<> h<> h<> h<> h<><68><18> S<01> S<01> S<01> <12>L<EFBFBD>Q<>K<EFBFBD>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<> R<> R<> R<> R<> R<><52><EFBFBD><EFBFBD><EFBFBD> S<01><><EFBFBD><EFBFBD>!<21> s<00>B
B<00>
B?<03>B:<03>:B?c
<00><00><>K<00> |<03>d|<01><00>}|j<00>|<04><00>}|sgSddlm}|d}t j<00><00>}i} |<05><00><00>D<00>]6\}
} tj| <0B><00>} | <0C> dd<06><00>} | <0C> dd<06><00>}| r|dvr<01>Nt j
| d <09><00>}||z
j |kr<01>r| | vr
d
d
d
d d <0C>| | <t| <0C> d d<02><00><00><00>}|dkr|| | d<d| | d<n9|dkr| | dxx|z cc<n|dkr| | dxx|z cc<<00><>#tj tf$r%}tjd|
<EFBFBD>d|<11><00><04><00>Yd}~<11><01>0d}~wwxYwg}t#| <09><00><00><00><00>}|<00>||<13><00>}|D]<5D>} | | }|ds|ddkr |ddkr<01>+|d}|d}|d}|<14> | d
<EFBFBD><00>}||z
|z
|z
}t j
| d <09><00>}t)|<0F><00><00><00><00>}|||||d
||d<17>}|<12>|<1C><00><00><>|S#t.$r&}tjd|<01>d|<11><00><04><00>gcYd}~Sd}~wwxYw)u8从Redis获取账户信息数据批量优化版本z :balance:r)<01> SYNC_CONFIG<49> recent_days<79>lz_timerh<00>lz_type)<03>
lz_balance<EFBFBD>deposit<69>
withdrawalz%Y-%m-%d<>F)<04>balancer<65>r<><00> has_balance<63> lz_amountr<74>r<>Tr<54>r<>r<>u解析Redis数据失败: r<>N)r<>r<>r<>r<>r<><00>other<65>profit<69>timeu$获取Redis账户信息失败: k_id=)r'rT<00>config.settingsr<73>r <00>nowrVrWrXr<><00>strptime<6D>days<79>floatr[<00>
ValueErrorrrU<00>sortedrr<00>_get_previous_balancesr<73><00> timestamprmr5r6)r#r<>r<>r`r\<00> redis_fundsr<73>r<><00>today<61>
date_stats<EFBFBD>fund_key<65> fund_json<6F> fund_data<74>date_strr<72><00>date_objr<6A>r7r<><00> sorted_dates<65>prev_balance_map<61>statsr<73>r<>r<><00> prev_balancer<65><00>time_timestampr<70>s rr<>z(RedisClient._get_account_info_from_redisws<><00><00><00><00>^ <16>&<26>7<>7<><14>7<>7<>I<EFBFBD><1E>+<2B>-<2D>-<2D>i<EFBFBD>8<>8<>K<EFBFBD><1E> <1A><19> <09> 4<> 3<> 3<> 3<> 3<> 3<>%<25>m<EFBFBD>4<>K<EFBFBD><1C>L<EFBFBD>N<EFBFBD>N<EFBFBD>E<EFBFBD><1B>J<EFBFBD>(3<>'8<>'8<>':<3A>':<3A>" <1D>" <1D>#<23><08>)<29>!<1D> $<24>
<EFBFBD>9<EFBFBD> 5<> 5<>I<EFBFBD>(<28>}<7D>}<7D>Y<EFBFBD><02>;<3B>;<3B>H<EFBFBD>'<27>m<EFBFBD>m<EFBFBD>I<EFBFBD>r<EFBFBD>:<3A>:<3A>G<EFBFBD>#<23>!<21>w<EFBFBD>6]<5D>']<5D>']<5D> <20> (<28>0<><18>:<3A>F<>F<>H<EFBFBD><1D><08>(<28>.<2E><1B><<3C><<3C> <20><1F>z<EFBFBD>1<>1<>'*<2A>'*<2A>*-<2D>+0<> 0<1A>0<1A>
<EFBFBD>8<EFBFBD>,<2C>!&<26>i<EFBFBD>m<EFBFBD>m<EFBFBD>K<EFBFBD><11>&C<>&C<> D<> D<>I<EFBFBD><1E>,<2C>.<2E>.<2E>:C<>
<EFBFBD>8<EFBFBD>,<2C>Y<EFBFBD>7<>>B<>
<EFBFBD>8<EFBFBD>,<2C>]<5D>;<3B>;<3B> <20>I<EFBFBD>-<2D>-<2D>"<22>8<EFBFBD>,<2C>Y<EFBFBD>7<>7<>7<>9<EFBFBD>D<>7<>7<>7<>7<> <20>L<EFBFBD>0<>0<>"<22>8<EFBFBD>,<2C>\<5C>:<3A>:<3A>:<3A>i<EFBFBD>G<>:<3A>:<3A>:<3A><><EFBFBD><1C>,<2C>j<EFBFBD>9<><1D><1D><1D><1A>L<EFBFBD>!R<>X<EFBFBD>!R<>!R<>q<EFBFBD>!R<>!R<>S<>S<>S<><1C>H<EFBFBD>H<EFBFBD>H<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD><1D><><EFBFBD><EFBFBD>
!#<23> <1D>!<21>*<2A>/<2F>/<2F>"3<>"3<>4<>4<>L<EFBFBD> $<24>:<3A>:<3A>;<3B> <0C>U<>U<> <1C>(<28> 7<> 7<><08>"<22>8<EFBFBD>,<2C><05><1D>]<5D>+<2B><1D><05>i<EFBFBD>0@<40>A<EFBFBD>0E<30>0E<30>%<25>P\<5C>J]<5D>ab<61>Jb<4A>Jb<4A><1C><1F> <09>*<2A><07><1F> <09>*<2A><07>"<22><<3C>0<>
<EFBFBD> 0<>3<>3<>H<EFBFBD>c<EFBFBD>B<>B<> <0C> <20>7<EFBFBD>*<2A>Z<EFBFBD>7<>,<2C>F<><06>$<24>,<2C>X<EFBFBD>z<EFBFBD>B<>B<><08>!$<24>X<EFBFBD>%7<>%7<>%9<>%9<>!:<3A>!:<3A><0E>#<23> <20>&<26>",<2C>&<26> <20>$<24>*<2A> <12> <12> <0C>"<22>(<28>(<28><1C>6<>6<>6<>6<>$<24> $<24><><18> <16> <16> <16> <12>L<EFBFBD>Q<><04>Q<>Q<>a<EFBFBD>Q<>Q<> R<> R<> R<><15>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD> <16><><EFBFBD>sg<00>$J<00>=J<00>'AE<02>-J<00>.#E<02>J<00>BE<02>J<00>F<05>0F<05>
J<00>F<05>C:J<00>
K<03>J;<03>5K<03>;Kr<>r<>c<00>L<00>i}d}|D]<5D>}|r<>|<01><00><00>D]{\}} tj|<07><00>}|<08>d<02><00>|krA|<08>d<03><00>dkr(t |<08>dd<06><00><00><00>||<n<08>u#Y<00>yxYwnd||<|}<04><>|S)u获取前一天的余额Nr<4E>r<>r<>r<>rr<>)rVrWrXr<>r<>) r#r<>r<>r<><00> prev_dater<65>r<>r<>r<>s rr<>z"RedisClient._get_previous_balances<65>s<><00><00><1D><18><18> <09>$<24> !<21> !<21>H<EFBFBD><18> 1<>+6<>+<<3C>+<<3C>+><3E>+><3E>!<21>!<21>'<27>H<EFBFBD>i<EFBFBD>!<21>$(<28>J<EFBFBD>y<EFBFBD>$9<>$9<> <09>%<25>M<EFBFBD>M<EFBFBD>)<29>4<>4<> <09>A<>A<>%<25>M<EFBFBD>M<EFBFBD>)<29>4<>4<> <0C>D<>D<>9><3E>y<EFBFBD>}<7D>}<7D>[<5B>Z[<5B>?\<5C>?\<5C>9]<5D>9]<5D>,<2C>X<EFBFBD>6<>!<21>E<EFBFBD><45><EFBFBD>!<21> <20><08><><EFBFBD><EFBFBD><EFBFBD>-0<> <20><18>*<2A> <20>I<EFBFBD>I<EFBFBD><1F>s <00>A,B<04>Bc<00>r<00>|jr/|j<00><00><00>tjd<01><00>dSdS)u关闭连接池uRedis连接池已关闭N)r<00>
disconnectrr4r"s r<00>closezRedisClient.close<73>sA<00><00> <0F>:<3A> 3<> <10>J<EFBFBD> !<21> !<21> #<23> #<23> #<23> <12>K<EFBFBD>1<> 2<> 2<> 2<> 2<> 2<> 3<> 3r) <20>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__rrr$<00>propertyr'r&r<00>strrFrrr=r@rYr rZr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<><00> __classcell__)rs@rrr s1<00><><00><00><00><00><00>!<21>!<21><14>I<EFBFBD><1D><1D><1D><1D><1D> K<01>K<01>K<01><0E><1C><1C><0E>X<EFBFBD><1C> <12><12><12>*<16><14>c<EFBFBD>4<EFBFBD>i<EFBFBD><1F><16><16><16><16>4(<28>T<EFBFBD>#<23>Y<EFBFBD>(<28>(<28>(<28>(<28>,<1D>C<EFBFBD>,<1D>D<EFBFBD><13>d<EFBFBD><19>O<EFBFBD>,<1D>,<1D>,<1D>,<1D>\'<1D><04>S<EFBFBD>$<24>Y<EFBFBD><0F>'<1D>'<1D>'<1D>'<1D>T"<1E>c<EFBFBD>"<1E>c<EFBFBD>"<1E>"<1E>"<1E>"<1E>H<18><13><18>#<23><18>S<EFBFBD><18>U]<5D>^b<>Uc<55><18><18><18><18>. <16>D<EFBFBD><13>d<EFBFBD><19>O<EFBFBD> <16><04>S<EFBFBD>RV<52>W[<5B>R\<5C>_<EFBFBD>H]<5D> <16> <16> <16> <16><1D>T<EFBFBD>#<23>t<EFBFBD>)<29>_<EFBFBD><1D><14>d<EFBFBD><1A><1D><1D><1D><1D>6<1E>S<EFBFBD><1E>PT<50>UY<55>PZ<50><1E>_c<5F>dh<64>_i<5F><1E><1E><1E><1E>0<16>C<EFBFBD><16><03><16>RU<52><16>Z^<5E>_c<5F>Zd<5A><16><16><16><16>2 <20><04>S<EFBFBD>$<24>Y<EFBFBD><0F> <20>D<EFBFBD>QU<51>J<EFBFBD> <20> <20> <20> <20>:!<21><03>!<21>SW<53>X\<5C>S]<5D>!<21>bf<62>gk<67>bl<62>!<21>!<21>!<21>!<21>(`<16>s<EFBFBD>`<16>3<EFBFBD>`<16>UX<55>`<16>]a<>bf<62>]g<>`<16>`<16>`<16>`<16>D <20>$<24> <20>d<EFBFBD>3<EFBFBD>i<EFBFBD> <20>TX<54>Y\<5C>^c<>Yc<59>Td<54> <20> <20> <20> <20>43<>3<>3<>3<>3<>3<>3rr)r<>r0rWr<00>logururr<>rrr<00> utils.helpersr<73><00>typingrrr r
r r r rrrJrr<00><module>r<>s<><00><01><0E><0E><0E><0E> <0C> <0C> <0C> <0C> <0B> <0B> <0B> <0B> <09> <09> <09> <09><19><19><19><19><19><19>O<>O<>O<>O<>O<>O<>O<>O<>O<>O<><1F><1F><1F><1F><1F><1F>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>8<>(<28>(<28>(<28>(<28>(<28>(<28>(<28>(<28>l3<>l3<>l3<>l3<>l3<>l3<>l3<>l3<>l3<>l3r