Files
exchange_monitor_sync/sync/__pycache__/position_sync.cpython-311.pyc

146 lines
20 KiB
Plaintext
Raw Normal View History

2025-12-04 15:40:19 +08:00
<EFBFBD>
2025-12-04 19:44:22 +08:00
<00>N1i<31>O<00><00><><00>ddlmZddlmZddlmZmZmZmZm Z ddl
m Z m Z m Z mZddlmZddlmZddlZGd<08>d e<01><00>ZdS)
<EFBFBD>)<01>BaseSync<6E>)<01>logger)<05>List<73>Dict<63>Any<6E>Set<65>Tuple)<04>text<78>and_<64>select<63>delete)<01>StrategyPositionNc<00><><00><00>eZdZdZ<03>fd<02>Zdeeeffd<04>Zdeede e
2025-12-04 15:40:19 +08:00
effd<07>Z deede e
2025-12-04 19:44:22 +08:00
effd<08>Z d edefd
<EFBFBD>Z <0A>xZS) <0B>PositionSyncBatchu持仓数据批量同步器c<00>V<00><01>t<00><00><00><00><00>d|_dS)Ni<4E>)<03>super<65>__init__<5F>
batch_size)<02>self<6C> __class__s <20><>9/root/project/exchange_monitor_sync/sync/position_sync.pyrzPositionSyncBatch.__init__ s$<00><><00> <0A><07><07><18><18><1A><1A><1A><1D><04><0F><0F><0F><00>accountsc<00><00>
K<00>dS)u'批量同步所有账号的持仓数据N)r<00>info<66>len<65>time<6D> redis_client<6E>_collect_all_positions<6E>(_sync_positions_batch_to_db_optimized_v3<76>error<6F> Exception<6F> traceback<63>type<70>__name__<5F>str<74>
2025-12-04 15:40:19 +08:00
format_exc)
2025-12-04 19:44:22 +08:00
rr<00>
start_time<EFBFBD> all_positions<6E>success<73>stats<74>elapsed<65>er$<00> error_detailss
r<00>
sync_batchzPositionSyncBatch.sync_batchs <00><00><00><00><0E>rr*<00>returnc <00><00>0K<00>|s ddddgd<03>fS|j<00><00><00>}dddgd<03>}i}|D].}|d}||vrg||<||<00>|<05><00><00>/tjdt |<04><00><00>d<06><03><00> t |<04><00><00><00><00>}tdt |<07><00>d<07><00>D<00>]:}|||dz<00>} tjd|dzd z<00>d
2025-12-04 15:40:19 +08:00
| <09><00><04><00>g}
| D]}|
<EFBFBD> ||<00><00><00>|
s<01>Ug} i} |
D<00>]-} | d}|<00>
| <0A><00>}t|<0E> d <0B><00>|<0E> d <0C><00>g<02><00>s<01>Yd |vr| <0A> d d<02><00>|d <d|vr||d<d|vr|<0E> d<0E><00>|d<| <0B>|<0E><00>|| vrt<00><00>| |<|d <00>d|d <00>d|d <00><00>}| |<00>|<0F><00><00><>#t $r%}tjd| <0A>d|<10><00><04><00>Yd}~<10><01>'d}~wwxYw| r<> t%d<14><00>}|<02>|| <0B><00>}|j}t | <0B><00>}|dxx|z cc<|dxx|z cc<tjd|dzd z<00>d|<14>d|<13>d<1A><07><00>np#t $rc}tjd|<10><00>d<01><1C><00>|<02><00><00>|d<00>dt/|<10><00><00><00><02><00>Yd}~<10><02>ud}~wwxYw| D<00>]} || vs| |sat%d<1E><00>}|<02>|d|i<01><00>}|j}|dxx|z cc<|dkrtjd |<06>d!|<16>d<1A><05><00><00>n5| |}g}d|i}t1|<17><00>D]<5D>\}}|<1B>d<10><00>}t |<1C><00>d"krr|d}|d }|d#}|<18>d$|<1A>d%|<1A>d&|<1A>d'<27><07><00>|<1D><00><00>rt7|<1D><00>n||d(|<1A><00><||d)|<1A><00><||d*|<1A><00><<00><>|rvd+<2B>|<18><00>} t%d,| <20>d-<2D><03><00>}|<02>||<19><00>}|j}|dxx|z cc<|dkrtjd |<06>d.|<16>d/<2F><05><00><00><01><>#t $rS}tjd0|<06>d1|<10><00><04><00>|d<00>d0|<06>d1t/|<10><00><00><00><04><00>Yd}~<10><02>d}~wwxYw |<02><00><00>tjd|dzd z<00>d2<64><03><00><00><04><>#t $rs}|<02><00><00>tjd|dzd z<00>d3|<10><00><04><00>|d<00>d|dzd z<00>d3t/|<10><00><00><00><04><00>Yd}~<10><05>4d}~wwxYwtjd4|d<00>d5|d<00>d6|d<00>d7t |d<00><00><00><00><08><00>t |d<00><00>dk}!|!|f|<02><00><00>S#t $rz}|<02><00><00>tjd8|<10><00>d<01><1C><00>|d<00>d9t/|<10><00><00><00><02><00>d:|fcYd}~|<02><00><00>Sd}~wwxYw#|<02><00><00>wxYw);u
批量同步持仓数据(不使用临时表)
Args:
all_positions: 所有持仓数据列表每个持仓包含k_id账号ID等字段
Returns:
Tuple[bool, Dict]: (是否成功, 结果统计)
2025-12-04 19:44:22 +08:00
Tr<00><04>total<61>affected<65>deleted<65>errors<72>k_idu开始批量处理 u 个账号的持仓数据<E695B0>
2025-12-04 15:40:19 +08:00
u
处理第 ru 组账号: <20>symbol<6F>side<64>st_id<69>qty<74>sum<75>&<26>处理持仓数据失败: <20>, error=Na<4E>
INSERT INTO deh_strategy_position_new
(st_id, k_id, asset, symbol, side, price, `sum`,
asset_num, asset_profit, leverage, uptime,
profit_price, stop_price, liquidation_price)
VALUES
(:st_id, :k_id, :asset, :symbol, :side, :price, :sum,
:asset_num, :asset_profit, :leverage, :uptime,
:profit_price, :stop_price, :liquidation_price)
ON DUPLICATE KEY UPDATE
price = VALUES(price),
`sum` = VALUES(`sum`),
asset_num = VALUES(asset_num),
asset_profit = VALUES(asset_profit),
leverage = VALUES(leverage),
uptime = VALUES(uptime),
profit_price = VALUES(profit_price),
stop_price = VALUES(stop_price),
liquidation_price = VALUES(liquidation_price)
2025-12-04 19:44:22 +08:00
r4r5u第 u 组: 处理 <20> 条, 受影响 <20> 条u批量插入/更新失败: <20><01>exc_infor7z<>
2025-12-04 15:40:19 +08:00
DELETE FROM deh_strategy_position_new
WHERE k_id = :k_id
2025-12-04 19:44:22 +08:00
r6u账号 u: 删除所有旧持仓,共 <20><00>z(st_id = :st_id_z AND symbol = :symbol_z AND side = :side_<65>)<29>st_id_<64>symbol_<6C>side_z OR z<>
2025-12-04 15:40:19 +08:00
DELETE FROM deh_strategy_position_new
WHERE k_id = :k_id
AND NOT (z")
u : 删除 <20> 条过期持仓u 删除账号 u 旧持仓失败: u 组处理完成并提交u 组提交失败: u批量同步完成: 总数=<3D> , 受影响=<3D> , 删除=u , 错误数=u#批量同步过程中发生错误: u同步过程错误: F)<1F>
2025-12-04 19:44:22 +08:00
db_manager<EFBFBD> get_session<6F>appendrrr<00>list<73>keys<79>range<67>extend<6E>_convert_position_data<74>all<6C>get<65>pop<6F>set<65>addr#r"r <00>execute<74>rowcount<6E>debug<75>rollbackr'<00> enumerate<74>split<69>isdigit<69>int<6E>join<69>commit<69>close)"rr*<00>session<6F>results<74>positions_by_account<6E>positionr8<00> account_ids<64> group_idx<64>group_account_ids<64>group_positions<6E>processed_positions<6E>account_position_keys<79> raw_position<6F> processed<65> position_keyr.<00>
upsert_sql<EFBFBD>result<6C>total_affectedr<00>
2025-12-04 15:40:19 +08:00
delete_sql<EFBFBD> deleted_count<6E> current_keys<79>
conditions<EFBFBD>params<6D>idx<64>key<65>parts<74> st_id_val<61>
2025-12-04 19:44:22 +08:00
symbol_val<EFBFBD>side_val<61>conditions_strr+s" r<00>%_sync_positions_batch_to_db_optimizedz7PositionSyncBatch._sync_positions_batch_to_db_optimized6s<> <00><00><00><00><1D> Q<01><17>1<EFBFBD>!<21><01>R<EFBFBD>P<>P<>P<> P<><17>/<2F>-<2D>-<2D>/<2F>/<2F><07><17><19><18><18> 
2025-12-04 15:40:19 +08:00
<EFBFBD>
<EFBFBD><07> "<22><1C>%<25> 8<> 8<>H<EFBFBD><1B>F<EFBFBD>#<23>D<EFBFBD><13>/<2F>/<2F>/<2F>-/<2F>$<24>T<EFBFBD>*<2A> <20><14> &<26> -<2D> -<2D>h<EFBFBD> 7<> 7<> 7<> 7<><0E> <0B>^<5E>#<23>.B<>*C<>*C<>^<5E>^<5E>^<5E>_<>_<>_<>{ <1C><1E>3<>8<>8<>:<3A>:<3A>;<3B>;<3B>K<EFBFBD>"<22>1<EFBFBD>c<EFBFBD>+<2B>&6<>&6<><02>;<3B>;<3B>d c<01>d c<01> <09>$/<2F> <09>)<29>b<EFBFBD>.<2E>0H<30>$I<>!<21><16> <0B>[<5B><19>B<EFBFBD><1D><11>):<3A>[<5B>[<5B>HY<48>[<5B>[<5B>\<5C>\<5C>\<5C>#%<25><0F>-<2D>G<01>G<01>D<EFBFBD>#<23>*<2A>*<2A>+?<3F><04>+E<>F<>F<>F<>F<>&<26><1D><1C>')<29>#<23>(*<2A>%<25>$3<>"!<21>"!<21>L<EFBFBD>!!<21>+<2B>F<EFBFBD>3<><04>$(<28>$?<3F>$?<3F> <0C>$M<>$M<> <09> #<23>I<EFBFBD>M<EFBFBD>M<EFBFBD>(<28>$;<3B>$;<3B>Y<EFBFBD>]<5D>]<5D>6<EFBFBD>=R<>=R<>#S<>T<>T<>%<25>$<24>#<23>)<29>3<>3<>1=<3D>1A<31>1A<31>'<27>1<EFBFBD>1M<31>1M<31>I<EFBFBD>g<EFBFBD>.<2E>"<22><19>2<>2<>04<30>I<EFBFBD>f<EFBFBD>-<2D>!<21>I<EFBFBD>-<2D>-<2D>/8<>}<7D>}<7D>U<EFBFBD>/C<>/C<>I<EFBFBD>e<EFBFBD>,<2C>,<2C>2<>2<>9<EFBFBD>=<3D>=<3D>=<3D> <20>'<<3C><<3C><<3C>:=<3D>%<25>%<25>1<>$<24>7<>*3<>G<EFBFBD>*<<3C>'h<>'h<>y<EFBFBD><18>?R<>'h<>'h<>U^<5E>_e<5F>Uf<55>'h<>'h<> <0C>-<2D>d<EFBFBD>3<>7<>7<> <0C>E<>E<>E<>E<><45>$<24>!<21>!<21>!<21><1E> <0C>%[<5B>,<2C>%[<5B>%[<5B>XY<58>%[<5B>%[<5B>\<5C>\<5C>\<5C> <20><08><08><08><08><><EFBFBD><EFBFBD><EFBFBD>!<21><><EFBFBD><EFBFBD>
'<27>+!<21>*!<21>%)<29>+<1C>&<1D>&<1D>
<EFBFBD>*")<29><1F><1F><1A>=P<>!Q<>!Q<><06>*0<><1F><0E>%(<28>)<<3C>%=<3D>%=<3D>
<EFBFBD> <20><07>(<28>(<28>(<28>J<EFBFBD>6<>(<28>(<28>(<28><1F>
<EFBFBD>+<2B>+<2B>+<2B>~<7E>=<3D>+<2B>+<2B>+<2B><1E> <0C>&B<01>I<EFBFBD>r<EFBFBD>M<EFBFBD>A<EFBFBD>,=<3D>&B<01>&B<01>*4<>&B<01>&B<01>-;<3B>&B<01>&B<01>&B<01>C<01>C<01>C<01>C<01><>%<25>!<21>!<21>!<21><1E> <0C>%F<>1<EFBFBD>%F<>%F<>QU<51>V<>V<>V<>V<><1F>(<28>(<28>*<2A>*<2A>*<2A><1F><08>)<29>0<>0<>1W<31>s<EFBFBD>ST<53>v<EFBFBD>v<EFBFBD>1W<31>1W<31>X<>X<>X<> <20><08><08><08><08><><EFBFBD><EFBFBD><EFBFBD> !<21><><EFBFBD><EFBFBD>.<2E>8c<01>8c<01>D<EFBFBD>7c<01><1F>'<<3C><<3C><<3C>DY<44>Z^<5E>D_<44><<3C>)-<2D>/ <20>*!<21>*!<21>J<EFBFBD>
&-<2D>_<EFBFBD>_<EFBFBD>Z<EFBFBD>&<26>$<24><1E>%P<>%P<>F<EFBFBD>,2<>O<EFBFBD>M<EFBFBD>#<23>I<EFBFBD>.<2E>.<2E>.<2E>-<2D>?<3F>.<2E>.<2E>.<2E>,<2C>q<EFBFBD>0<>0<> &<26> <0C>-n<>t<EFBFBD>-n<>-n<>[h<>-n<>-n<>-n<> o<> o<> o<><6F>,A<01><14>+F<>L<EFBFBD>*,<2C>J<EFBFBD>&,<2C>d<EFBFBD>^<5E>F<EFBFBD>,5<>l<EFBFBD>,C<>,C<>
E<01>
E<01><08><03>S<EFBFBD>(+<2B> <09> <09>#<23><0E><0E><05>#&<26>u<EFBFBD>:<3A>:<3A><11>?<3F>?<3F>05<30>a<EFBFBD><08>I<EFBFBD>16<31>q<EFBFBD><18>J<EFBFBD>/4<>Q<EFBFBD>x<EFBFBD>H<EFBFBD>$.<2E>$5<>$5<>7B<02><13>7B<02>7B<02>dg<64>7B<02>7B<02>{~<7E>7B<02>7B<02>7B<02>%C<02>%C<02>%C<02>OX<4F>O`<60>O`<60>Ob<4F>Ob<4F>=q<>S<EFBFBD><19>^<5E>^<5E>^<5E>hq<68>F<EFBFBD>><3E>C<EFBFBD>><3E>><3E>$:<3A>>H<>F<EFBFBD>?<3F>S<EFBFBD>?<3F>?<3F>$;<3B><D<>F<EFBFBD>=<3D>3<EFBFBD>=<3D>=<3D>$9<><39>)<29>k<01>17<31><1B><1B>Z<EFBFBD>1H<31>1H<31><0E>.2<EFBFBD>3$<24>/=<3D>3$<24>3$<24>3$<24>.%<25>.%<25>
<EFBFBD> *1<><1F><1F><1A>V<EFBFBD>)L<>)L<><06>06<30><0F> <0A> '<27> <09> 2<> 2<> 2<>m<EFBFBD> C<> 2<> 2<> 2<>#0<>1<EFBFBD>#4<>#4<>$*<2A>L<EFBFBD>1i<31>4<EFBFBD>1i<31>1i<31>-<2D>1i<31>1i<31>1i<31>$j<>$j<>$j<><6A><EFBFBD>$<24>c<01>c<01>c<01><1E> <0C>%P<>T<EFBFBD>%P<>%P<>Q<EFBFBD>%P<>%P<>Q<>Q<>Q<><1F><08>)<29>0<>0<>1a<31><14>1a<31>1a<31>Y\<5C>]^<5E>Y_<59>Y_<59>1a<31>1a<31>b<>b<>b<>b<>b<>b<>b<>b<><62><EFBFBD><EFBFBD><EFBFBD>c<01><><EFBFBD><EFBFBD> c<01><1B>N<EFBFBD>N<EFBFBD>$<24>$<24>$<24><1A>L<EFBFBD>!T<> <09>2<EFBFBD> <0A><01>(9<>!T<>!T<>!T<>U<>U<>U<>U<><55> <20>c<01>c<01>c<01><1B>$<24>$<24>&<26>&<26>&<26><1A>L<EFBFBD>!P<> <09>2<EFBFBD> <0A><01>(9<>!P<>!P<>Q<EFBFBD>!P<>!P<>Q<>Q<>Q<><1B>H<EFBFBD>%<25>,<2C>,<2C>-a<>I<EFBFBD>r<EFBFBD>M<EFBFBD>A<EFBFBD>4E<34>-a<>-a<>Y\<5C>]^<5E>Y_<59>Y_<59>-a<>-a<>b<>b<>b<>b<>b<>b<>b<>b<><62><EFBFBD><EFBFBD><EFBFBD>c<01><><EFBFBD><EFBFBD>
<13>K<EFBFBD>:<3A>%<25>g<EFBFBD>.<2E>:<3A>:<3A>!(<28><1A>!4<>:<3A>:<3A>&<26>i<EFBFBD>0<>:<3A>:<3A>"%<25>W<EFBFBD>X<EFBFBD>%6<>!7<>!7<> :<3A>:<3A> ;<3B> ;<3B> ;<3B><1A>'<27>(<28>+<2B>,<2C>,<2C><01>1<>G<EFBFBD><1A>G<EFBFBD>#<23> <14>M<EFBFBD>M<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD><4F><19> "<22> "<22> "<22> <13> <1C> <1C> <1E> <1E> <1E> <12>L<EFBFBD>B<>q<EFBFBD>B<>B<>T<EFBFBD> R<> R<> R<> R<> <13>H<EFBFBD> <1D> $<24> $<24>%D<>C<EFBFBD><01>F<EFBFBD>F<EFBFBD>%D<>%D<> E<> E<> E<><18>'<27>><3E> !<21> !<21> !<21> !<21> !<21> <14>M<EFBFBD>M<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD> <14>M<EFBFBD>M<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD><4F><EFBFBD>s<EFBFBD><00>BY8<00>%AH<04>9Y8<00>:B#H<04>Y8<00>
I <07>(I<07>Y8<00>I <07> Y8<00>A?K<02>Y8<00>
M<05>AL;<05>5Y8<00>;M<05>Y8<00> F"S-<04>+Y8<00>-
U
<07>7AU<07>?Y8<00>U
<07>
Y8<00>2V<02>Y8<00>
W?<05> A(W:<05>4Y8<00>:W?<05>?A$Y8<00>8
[<<03>A[7<03>[<<03>[?<00>7[<<03><[?<00>?\c <00><00>0K<00>|s ddddgd<03>fS|j<00><00><00>}dddgd<03>} |<02><00><00>g}t<00><00>}|D<00>]?} |<00>|<06><00>}t |<07>d<04><00>|<07>d<05><00>g<02><00>s<01>Qd|vr|<07>d<06><00>|d<|<07>d|d<00><00>}|<07>d |<06>d d<02><00><00><00>} |<07>d<04><00>}
|<07>d<05><00>} |<04>|<07><00>|| |
| f} |<05> | <0C><00><00><01>#t$r%} tj d
|<06>d | <0A><00><04><00>Yd } ~ <0A><01>9d } ~ wwxYw|s,|<02> <00><00>d|f|<02><00><00>St|<04><00>|d <tjd|d <00>dt|<05><00><00>d<10><05><00>t#d<11><00>}|<02>||<04><00>}|j}||d<tjd|d <00>d|d<00>d<15><05><00>|r<>g}|D]W}|\}} }
} |
<EFBFBD>dd<17><00>}| <0B>dd<17><00>}|<11>d|<08>d| <09>d|<13>d|<14>d<1C> <09><00><00>X|rad<1D>|<11><00>}t#d|<15>d<1F><03><00>}|<02>|<16><00>}|j}||d <tjd!|<17>d"<22><03><00>|<02> <00><00>tjd#|d <00>d$|d<00>d%|d <00><00><06><00>d|f|<02><00><00>S#t$rz} |<02><00><00>tj d&| <0A><00>d<01>'<27><00>|d(<00>d)t/| <0A><00><00><00><02><00>d*|fcYd } ~ |<02><00><00>Sd } ~ wwxYw#|<02><00><00>wxYw)+up
最优化的批量同步兼容所有MySQL版本
使用策略:
1. 一次性UPSERT所有持仓数据
2. 使用UNION ALL构造虚拟表进行JOIN删除
Args:
all_positions: 所有持仓数据列表
Returns:
Tuple[bool, Dict]: (是否成功, 结果统计)
2025-12-04 19:44:22 +08:00
Trr3r:r;r=r>r8r<r@rANr4u 准备同步 u 条持仓数据,去重后 u 条唯一记录a<E5BD95>
2025-12-04 15:40:19 +08:00
INSERT INTO deh_strategy_position_new
(st_id, k_id, asset, symbol, side, price, `sum`,
asset_num, asset_profit, leverage, uptime,
profit_price, stop_price, liquidation_price)
VALUES
(:st_id, :k_id, :asset, :symbol, :side, :price, :sum,
:asset_num, :asset_profit, :leverage, :uptime,
:profit_price, :stop_price, :liquidation_price)
ON DUPLICATE KEY UPDATE
price = VALUES(price),
`sum` = VALUES(`sum`),
asset_num = VALUES(asset_num),
asset_profit = VALUES(asset_profit),
leverage = VALUES(leverage),
uptime = VALUES(uptime),
profit_price = VALUES(profit_price),
stop_price = VALUES(stop_price),
liquidation_price = VALUES(liquidation_price)
2025-12-04 19:44:22 +08:00
r5uUPSERT完成: 总数 rBrC<00>'z''zSELECT z
2025-12-04 15:40:19 +08:00
as k_id, z as st_id, 'z' as symbol, 'z ' as sidez UNION ALL z<>
DELETE p FROM deh_strategy_position_new p
LEFT JOIN (
ac
) AS current_pos ON
p.k_id = current_pos.k_id
AND p.st_id = current_pos.st_id
AND p.symbol = current_pos.symbol
AND p.side = current_pos.side
WHERE current_pos.k_id IS NULL
2025-12-04 19:44:22 +08:00
r6u删除 rLu批量同步V3完成: 总数=rMrNu批量同步V3失败: rDr7u同步失败: F)rOrP<00>beginrZrVrWrXrYrQr[r#rr"rerfrrr r\r]<00>replacerdr_r')rr*rgrhro<00>current_position_recordsrqrrr8r<r:r;<00>
record_keyr.rtrurv<00> union_parts<74>record<72>symbol_escaped<65> side_escaped<65> union_sql<71>delete_sql_joinrxs rr!z:PositionSyncBatch._sync_positions_batch_to_db_optimized_v3sK<00><00><00><00><1D> Q<01><17>1<EFBFBD>!<21><01>R<EFBFBD>P<>P<>P<> P<><16>/<2F>-<2D>-<2D>/<2F>/<2F><07><17><19><18><18> 
2025-12-04 15:40:19 +08:00
<EFBFBD>
<EFBFBD><07>v <1C> <13>M<EFBFBD>M<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>#%<25> <1F>'*<2A>u<EFBFBD>u<EFBFBD> $<24> -<2D> <1D> <1D> <0C><1D> $<24> ;<3B> ;<3B>L<EFBFBD> I<> I<>I<EFBFBD><1E> <09> <0A> <0A>h<EFBFBD> 7<> 7<><19><1D><1D>v<EFBFBD>9N<39>9N<39>O<>P<>P<>!<21> <20><1C> <09>)<29>)<29>+4<>=<3D>=<3D><15>+?<3F>+?<3F> <09>%<25>(<28>$<24>=<3D>=<3D><16><1C>f<EFBFBD>1E<31>F<>F<>D<EFBFBD>%<25>M<EFBFBD>M<EFBFBD>'<27><<3C>3C<33>3C<33>G<EFBFBD>Q<EFBFBD>3O<33>3O<33>P<>P<>E<EFBFBD>&<26>]<5D>]<5D>8<EFBFBD>4<>4<>F<EFBFBD>$<24>=<3D>=<3D><16>0<>0<>D<EFBFBD>(<28>.<2E>.<2E>y<EFBFBD>9<>9<>9<>#'<27><05>v<EFBFBD>t<EFBFBD>!<<3C>J<EFBFBD>,<2C>0<>0<><1A><<3C><<3C><<3C><<3C><> <20><1D><1D><1D><1A>L<EFBFBD>!W<>l<EFBFBD>!W<>!W<>TU<54>!W<>!W<>X<>X<>X<><1C>H<EFBFBD>H<EFBFBD>H<EFBFBD>H<EFBFBD><48><EFBFBD><EFBFBD><EFBFBD><1D><><EFBFBD><EFBFBD>'<27> %<25><17><0E><0E> <20> <20> <20><1B>W<EFBFBD>}<7D>f <14>M<EFBFBD>M<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>c #<23>#6<>7<>7<>G<EFBFBD>G<EFBFBD> <1C> <12>K<EFBFBD>G<02><07><07>(8<>G<02>G<02>WZ<57>[s<>Wt<57>Wt<57>G<02>G<02>G<02> H<02> H<02> H<02><1E><10><11><11>J<EFBFBD>*<1D>_<EFBFBD>_<EFBFBD>Z<EFBFBD>1D<31>E<>E<>F<EFBFBD>#<23>_<EFBFBD>N<EFBFBD>!/<2F>G<EFBFBD>J<EFBFBD> <1F> <12>K<EFBFBD>k<><07><07>0@<40>k<>k<>RY<52>Zd<5A>Re<52>k<>k<>k<> l<> l<> l<>(<28> K<01> <20> <0B>6<>K<02>K<02>F<EFBFBD>06<30>-<2D>D<EFBFBD>%<25><16><14>%+<2B>^<5E>^<5E>C<EFBFBD><14>%><3E>%><3E>N<EFBFBD>#'<27><<3C><<3C><03>T<EFBFBD>#:<3A>#:<3A>L<EFBFBD><1F>&<26>&<26>(J<02><14>(J<02>(J<02><15>(J<02>(J<02>Tb<54>(J<02>(J<02>r~<7E>(J<02>(J<02>(J<02>K<02>K<02>K<02>K<02><1E>K<01> -<2D> 2<> 2<>;<3B> ?<3F> ?<3F>I<EFBFBD>'+<2B>
,<18>'<27>
,<18>
,<18>
,<18>
'<19>
'<19>O<EFBFBD>%<25>_<EFBFBD>_<EFBFBD>_<EFBFBD>=<3D>=<3D>F<EFBFBD>$*<2A>O<EFBFBD>M<EFBFBD>)6<>G<EFBFBD>I<EFBFBD>&<26><1A>K<EFBFBD> I<>-<2D> I<> I<> I<>J<>J<>J<> <13>N<EFBFBD>N<EFBFBD> <1C> <1C> <1C> <12>K<EFBFBD>3<><07><07>8H<38>3<>3<>!(<28><1A>!4<>3<>3<>%<25>i<EFBFBD>0<>3<>3<> 4<> 4<> 4<><18><17>=<3D> <14>M<EFBFBD>M<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD><4F><19> "<22> "<22> "<22> <13> <1C> <1C> <1E> <1E> <1E> <12>L<EFBFBD>5<>!<21>5<>5<><04> E<> E<> E<> E<> <13>H<EFBFBD> <1D> $<24> $<24>%><3E>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>%><3E>%><3E> ?<3F> ?<3F> ?<3F><18>'<27>><3E> !<21> !<21> !<21> !<21> !<21> <14>M<EFBFBD>M<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD> <14>M<EFBFBD>M<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD><4F><EFBFBD>so<00>)M8<00>A E$<02>%M8<00>&B<E$<02>"M8<00>$
F<05>.F<05>M8<00>F<05>M8<00>FM8<00>8
2025-12-04 19:44:22 +08:00
O<<03>AO7<03>O<<03>O?<00>7O<<03><O?<00>?P<03>datac<00>6<00> tj|<01>d<01><00>d<02><00>tj|<01>d<03><00>d<02><00>|<01>dd<05><00>|<01>dd<07><00>|<01>dd<07><00>tj|<01>d <09><00><00><00>tj|<01>d
<EFBFBD><00><00><00>tj|<01>d <0B><00><00><00>tj|<01>d <0C><00><00><00>tj|<01>d <0A><00><00><00>tj|<01>d<0E><00><00><00>tj|<01>d<0F><00><00><00>tj|<01>d<10><00><00><00>tj|<01>d<11><00><00><00>d<12>S#t$r&}t jd|<01>d|<02><00><04><00>icYd}~Sd}~wwxYw)u转换持仓数据格式r<rr8<00>asset<65>USDTr:<00>r;<00>pricer=<00> asset_num<75> asset_profit<69>leverage<67>uptime<6D> profit_price<63>
stop_price<EFBFBD>liquidation_price)r<r8r<>r:r;r<>r=r<>r<>r<>r<>r<>r<>r<>u转换持仓数据异常: rAN)<07>helpers<72>safe_intrX<00>
safe_floatr#rr")rr<>r.s rrVz(PositionSyncBatch._convert_position_data<74>s<><00><00> <16>!<21>)<29>$<24>(<28>(<28>7<EFBFBD>*;<3B>*;<3B>Q<EFBFBD>?<3F>?<3F><1F>(<28><14><18><18>&<26>)9<>)9<>1<EFBFBD>=<3D>=<3D><1D><18><18>'<27>6<EFBFBD>2<>2<><1E>(<28>(<28>8<EFBFBD>R<EFBFBD>0<>0<><1C><08><08><16><12>,<2C>,<2C> <20>+<2B>D<EFBFBD>H<EFBFBD>H<EFBFBD>W<EFBFBD>,=<3D>,=<3D>><3E>><3E><1E>)<29>$<24>(<28>(<28>5<EFBFBD>/<2F>/<2F>:<3A>:<3A>$<24>/<2F><04><08><08><1B>0E<30>0E<30>F<>F<> '<27> 2<>4<EFBFBD>8<EFBFBD>8<EFBFBD>N<EFBFBD>3K<33>3K<33> L<> L<>#<23>,<2C>T<EFBFBD>X<EFBFBD>X<EFBFBD>j<EFBFBD>-A<>-A<>B<>B<>!<21>*<2A>4<EFBFBD>8<EFBFBD>8<EFBFBD>H<EFBFBD>+=<3D>+=<3D>><3E>><3E> '<27> 2<>4<EFBFBD>8<EFBFBD>8<EFBFBD>N<EFBFBD>3K<33>3K<33> L<> L<>%<25>0<><14><18><18>,<2C>1G<31>1G<31>H<>H<>%,<2C>%7<><04><08><08>AT<41>8U<38>8U<38>%V<>%V<><0E><0E> <0E><>"<19> <16> <16> <16> <12>L<EFBFBD>G<>d<EFBFBD>G<>G<>A<EFBFBD>G<>G<> H<> H<> H<><15>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD> <16><><EFBFBD>s<00>G%G(<00>(
H<03>2H<03> H<03>H)r&<00>
__module__<EFBFBD> __qualname__<5F>__doc__rrr'r0rr
<00>boolr<6C>r!rV<00> __classcell__)rs@rrr s<><00><><00><00><00><00><00>%<25>%<25><1E><1E><1E><1E><1E>$c<01><14>c<EFBFBD>4<EFBFBD>i<EFBFBD><1F>$c<01>$c<01>$c<01>$c<01>L]<1C><14>d<EFBFBD><1A>]<1C>X]<5D>^b<>dh<64>^h<>Xi<58>]<1C>]<1C>]<1C>]<1C>~P<1C>D<EFBFBD>QU<51>J<EFBFBD>P<1C>[`<60>ae<61>gk<67>ak<61>[l<>P<1C>P<1C>P<1C>P<1C>d<16>4<EFBFBD><16>D<EFBFBD><16><16><16><16><16><16><16>rr)<15> base_syncr<00>logurur<00>typingrrrr r
<00>
sqlalchemyr r r r<00>models.orm_modelsr<00> utils.helpersr<73>rr<00>rr<00><module>r<>s<><00><01><1F><1F><1F><1F><1F><1F><19><19><19><19><19><19>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>1<>.<2E>.<2E>.<2E>.<2E>.<2E>.<2E><1F><1F><1F><1F><1F><1F> <0B> <0B> <0B> <0B>u<16>u<16>u<16>u<16>u<16><08>u<16>u<16>u<16>u<16>ur