Files
IB-Dashboard/backend/__pycache__/flex_query.cpython-313.pyc

47 lines
8.2 KiB
Plaintext
Raw Normal View History

2026-04-01 22:51:21 -05:00
<EFBFBD>
2026-04-01 23:28:51 -05:00
Q<><51>i<00><01><><00>SrSSKJr SSKrSSKrSSKrSSKrSSKJ s J
2026-04-01 22:51:21 -05:00
r SSK J r SSKJr Sr\S3r\S3r\ "S S
2026-04-01 23:28:51 -05:00
55r"S S \5r"S S\5rSSjrSSjrSSjrSSjrSSjrSSjrg)apUtilities for Interactive Brokers Flex Web Service integration.
2026-04-01 22:51:21 -05:00
This module provides the first layer of infrastructure for pulling
historical trade data from a saved Flex Query. It intentionally keeps the
surface area small so the app can validate configuration, trigger a sync,
and persist the raw XML responses locally before the data is wired into the
lot engine.
2026-04-01 23:28:51 -05:00
<EFBFBD>)<01> annotationsN)<01> dataclass)<01>PathzFhttps://ndcdyn.interactivebrokers.com/AccountManagement/FlexWebServicez /SendRequestz /GetStatementc<01>l<00>\rSrSr%S\S'S\S'S\S'SrS\S 'S
rS \S 'S rS\S'SrS \S'Sr g)<13>
FlexConfig<EFBFBD><00>str<74>token<65>query_idr<00>data_dirg@<40>float<61>poll_interval_seconds<64><00>int<6E> max_pollsg$@<40>send_request_retry_seconds<64><00>max_send_request_attempts<74>N)
<EFBFBD>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__<5F>__annotations__rrrr<00>__static_attributes__r<00><00>,C:\Temp\x\IB-Dashboard\backend\flex_query.pyrrs<<00><00> <0E>J<EFBFBD><11>M<EFBFBD><12>N<EFBFBD>#&<26><19>5<EFBFBD>&<26><17>I<EFBFBD>s<EFBFBD><17>(,<2C><1E><05>,<2C>%&<26><1D>s<EFBFBD>&rrc<01><00>\rSrSrSrg)<04>FlexQueryError<6F>$rN<>rrrrrrrrrr$<00><00><00>rrc<01><00>\rSrSrSrg)<04>FlexQueryRetryableError<6F>(rNr!rrrr$r$(r"rr$c<01><><00>[RRSS5R5n[RRSS5R5nU(aU(dg[ [RRS[ [
2026-04-01 22:51:21 -05:00
5R 5RRS- S- 55n[XUS9$)N<> IB_FLEX_TOKEN<45><00>IB_FLEX_QUERY_ID<49>IB_FLEX_DATA_DIR<49>data<74>flex<65>r
2026-04-01 23:28:51 -05:00
r r ) <09>os<6F>environ<6F>get<65>stripr<00>__file__<5F>resolve<76>parentrr-s r<00>load_flex_configr5,s<><00><00> <0E>J<EFBFBD>J<EFBFBD>N<EFBFBD>N<EFBFBD>?<3F>B<EFBFBD> /<2F> 5<> 5<> 7<>E<EFBFBD><11>z<EFBFBD>z<EFBFBD>~<7E>~<7E>0<>"<22>5<>;<3B>;<3B>=<3D>H<EFBFBD> <10><08><13><13>B<EFBFBD>J<EFBFBD>J<EFBFBD>N<EFBFBD>N<EFBFBD>#5<>t<EFBFBD>H<EFBFBD>~<7E>7M<37>7M<37>7O<37>7V<37>7V<37>7]<5D>7]<5D>`f<>7f<37>io<69>7o<37>p<>q<>H<EFBFBD> <15>E<EFBFBD>x<EFBFBD> H<>Hrc<01><><00>[5nUcKSSVs/sH:n[RRUS5R 5(aM8UPM< snS.$SnSnUR
2026-04-01 22:51:21 -05:00
R 5(aU[UR
RS55nU(a*USn[U5nUR5RnSUR[UR
2026-04-01 23:28:51 -05:00
5UUS.$s snf) NF)r'r)r()<02>
2026-04-01 22:51:21 -05:00
configured<EFBFBD>missingz
2026-04-01 23:28:51 -05:00
flex_*.xml<6D><6C><EFBFBD><EFBFBD><EFBFBD>T)r7r r <00> latest_file<6C>latest_timestamp) r5r.r/r0r1r <00>exists<74>sorted<65>globr <00>stat<61>st_mtimer )<06>config<69>namer:<00> latest_mtime<6D> xml_files<65>latests r<00>get_flex_statusrF5s<><00><00> <1D> <1F>F<EFBFBD> <0A>~<7E><1F>B<01><0E>A<>D<EFBFBD><19>z<EFBFBD>z<EFBFBD>~<7E>~<7E>d<EFBFBD>B<EFBFBD>/<2F>5<>5<>7<><15>A<><0E>
2026-04-01 22:51:21 -05:00
<EFBFBD>
<EFBFBD><17>K<EFBFBD><17>L<EFBFBD> <0A><EFBFBD><EFBFBD><1D><1D><1F><1F><1A>6<EFBFBD>?<3F>?<3F>/<2F>/<2F> <0C>=<3D>><3E> <09> <14><1E>r<EFBFBD>]<5D>F<EFBFBD><1D>f<EFBFBD>+<2B>K<EFBFBD>!<21>;<3B>;<3B>=<3D>1<>1<>L<EFBFBD><1A><1A>O<EFBFBD>O<EFBFBD><17><06><0F><0F>(<28>"<22>(<28>  <06><06><>s <00>7C6<06>C6c<01><00>US[RRU53n[RR USS0S9n[RR USS9nUR 5sSSS5 $!,(df  g=f)N<>?z
2026-04-01 23:28:51 -05:00
User-AgentzIB-Dashboard/1.0)<01>headersr)<01>timeout)<07>urllib<69>parse<73> urlencode<64>request<73>Request<73>urlopen<65>read)<05>url<72>params<6D>full_urlrN<00>responses r<00> _http_getrVQsw<00><00><15><15>a<EFBFBD><06> <0C> <0C>.<2E>.<2E>v<EFBFBD>6<>7<>8<>H<EFBFBD><14>n<EFBFBD>n<EFBFBD>$<24>$<24><10><1D>1<>2<>%<25><06>G<EFBFBD>
2026-04-01 22:51:21 -05:00
<10><1E><1E> <1F> <1F><07><12> <1F> 4<><08><17>}<7D>}<7D><EFBFBD>
5<EFBFBD> 4<> 4<>s <00>#A=<03>=
2026-04-01 23:28:51 -05:00
B c<01><><00>[R"U5nURS5=(d SR5nUR 5S:walURS5=(d SR5nURS5=(d SR5nUS:Xa [ U5e[ U5eURS5=(d SR5nU(d [ S 5eX%4$)
N<EFBFBD>Statusr(<00>success<73> ErrorCode<64> ErrorMessagezFlex send-request failed<65>1004<30> ReferenceCode<64>+Flex send-request returned no ReferenceCode)<07>ET<45>
fromstring<EFBFBD>findtextr1<00>lowerr$r)<06> xml_bytes<65>root<6F>status<75>
error_code<EFBFBD> error_message<67>reference_codes r<00>_parse_send_requestri[s<><00><00> <0A>=<3D>=<3D><19> #<23>D<EFBFBD><12>m<EFBFBD>m<EFBFBD>H<EFBFBD>%<25>+<2B><12> 2<> 2<> 4<>F<EFBFBD> <0A>|<7C>|<7C>~<7E><19>"<22><1A>m<EFBFBD>m<EFBFBD>K<EFBFBD>0<>6<>B<EFBFBD>=<3D>=<3D>?<3F>
<EFBFBD><1D><1D><1D>~<7E>6<>T<>:T<>[<5B>[<5B>]<5D> <0A> <15><16> <1F>)<29>-<2D>8<> 8<><1C>]<5D>+<2B>+<2B><1A>m<EFBFBD>m<EFBFBD>O<EFBFBD>4<>:<3A><02>A<>A<>C<>N<EFBFBD> <19><1C>J<>K<>K<> <11> !<21>!rc<01><><00>[R"U5nURS:Xa;URS5=(d SR 5nU(a [ U5egSUR SSS94$) N<>FlexStatementResponser[r()Fr(T<>utf-8<>replace)<01>errors)r_r`<00>tagrar1r<00>decode)rcrdrgs r<00>_parse_statement_statusrqjse<00><00> <0A>=<3D>=<3D><19> #<23>D<EFBFBD> <0B>x<EFBFBD>x<EFBFBD>*<2A>*<2A><1D><1D><1D>~<7E>6<><<3C>"<22>C<>C<>E<> <0A> <18> <20><1D>/<2F> /<2F><18> <0F><19>!<21>!<21>'<27>)<29>!<21><<3C> <<3C><rc
<01><><00>[5nUc [S5eURRSSS9 SnSn[ SUR
S-5H7n[ [[URURSS.55upA O U(d[U=(d S5eSn[ UR 5HYn[["URUSS.5n[%U5up<>U(aU n O$[R"UR&5 M[ Uc [S5e[R("S 5n
URS
U
S 3- n U R+US S 9 [U 5U[-UR/S 55S.$![aRn[U5nX0R
:<3A>a [U5Ue[R"UR5 SnAGM<>SnAff=f)NzFlex Query is not configuredT)<02>parents<74>exist_ok<6F><00>3)<03>t<>q<>vr^z/Timed out waiting for Flex statement generationz %Y%m%d_%H%M%S<>flex_z.xmlrl)<01>encoding)<03>saved_torh<00>bytes)r5rr <00>mkdir<69>rangerrirV<00>FLEX_SEND_REQUEST_URLr
r r$r <00>time<6D>sleeprr<00>FLEX_GET_STATEMENT_URLrqr<00>strftime<6D>
write_text<EFBFBD>len<65>encode) rArh<00>last_retryable_error<6F>attempt<70>_<>exc<78> statement_xmlrc<00>done<6E>payload<61> timestamp<6D> destinations r<00>fetch_flex_statementr<74>ts<><00><00> <1D> <1F>F<EFBFBD> <0A>~<7E><1C>;<3B><<3C><<3C>
<EFBFBD>O<EFBFBD>O<EFBFBD><19><19>$<24><14><19>6<><19>N<EFBFBD><1F><18><18><11>F<EFBFBD><<3C><<3C>q<EFBFBD>@<40>A<><07>
:<3A> 3<>I<EFBFBD>%<25><1C>l<EFBFBD>l<EFBFBD><16><1F><1F>s<EFBFBD>C<>5<0E>!<0F> <1D>A<EFBFBD> <12> B<01> <1A><1C>1<>b<>5b<35>c<>c<><18>M<EFBFBD> <12>6<EFBFBD>#<23>#<23> $<24><01><1D> "<22><18>,<2C>,<2C>^<5E>#<23> ><3E>
2026-04-01 22:51:21 -05:00
<EFBFBD> <09>0<> <09>:<3A> <0A><04> <0F>#<23>M<EFBFBD> <11> <0C>
<EFBFBD>
2026-04-01 23:28:51 -05:00
<EFBFBD>6<EFBFBD>/<2F>/<2F>0<>%<25><15><1C><1C>N<>O<>O<><14> <0A> <0A>o<EFBFBD>.<2E>I<EFBFBD><18>/<2F>/<2F>e<EFBFBD>I<EFBFBD>;<3B>d<EFBFBD>$;<3B>;<3B>K<EFBFBD><0F><1A><1A>=<3D>7<EFBFBD><1A>;<3B><18> <0B>$<24>(<28><14>]<5D>)<29>)<29>'<27>2<>3<> <06><06><>9'<27> :<3A>#&<26>s<EFBFBD>8<EFBFBD> <20><16>:<3A>:<3A>:<3A>$<24>%9<>:<3A><03>C<> <10>J<EFBFBD>J<EFBFBD>v<EFBFBD>8<>8<> 9<> 9<><39>  :<3A>s<00>3F<02>
G$<05>AG<05>G$)<02>returnzFlexConfig | None)r<><00>dict)rRr rSzdict[str, str]r<>r})rcr}r<>ztuple[str, str])rcr}r<>ztuple[bool, str])<1D>__doc__<5F>
__future__rr.r<><00> urllib.parserK<00>urllib.request<73>xml.etree.ElementTree<65>etree<65> ElementTreer_<00> dataclassesr<00>pathlibr<00> FLEX_BASE_URLr<4C>r<>r<00> RuntimeErrorrr$r5rFrVrirqr<>rrr<00><module>r<>s<><00><01><04>#<23> <09> <0B><13><15>"<22>"<22>!<21><18>Y<01> <0A>(<28>/<2F><1C>6<><15>)<29>?<3F>-<2D>8<><16> <0B>'<27>'<27> <0B>'<27> <09>\<5C> <09> <09>n<EFBFBD> <09>I<01><06>8<1F> "<22>=<3D>0r