Files
big-qmt/py-client/libs/__pycache__/orderbook.cpython-311.pyc

78 lines
13 KiB
Plaintext
Raw Normal View History

2026-09-07 14:04:26 +08:00
<EFBFBD>
2026-09-07 18:18:00 +08:00
F[<5B>j:<00><01>P<00>dZddlmZddlZddlZddlmZddlmZm Z ddl
m
Z
ddl m Z ddl mZmZd Zed
<EFBFBD>e e<0F><00>D<00><00><00><00>Zed <0B>e e<0E><00>D<00><00><00><00>d zZee<0F><00><00><00>Zd d<0E>e<12><00><00>dd<0E>d<10>eD<00><00><00><00><00>d<11>d<0E>d<12>eD<00><00><00><00>zZdd<0E>e<13><00><00>dd<0E>d<14>eD<00><00><00><00><00>d<15>ZGd<16>d<17><00>ZdS)zMSQLite positions and deals, aligned with SDK models; one writer per database.<2E>)<01> annotationsN)<01>closing)<02>asdict<63>fields)<01>datetime)<01>Path)<02>DealItem<65> PositionItema^
2026-09-07 14:04:26 +08:00
CREATE TABLE IF NOT EXISTS positions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
2026-09-07 18:18:00 +08:00
stock_code TEXT NOT NULL,
stock_name TEXT NOT NULL DEFAULT '',
direction INTEGER,
volume INTEGER NOT NULL DEFAULT 0 CHECK (volume >= 0),
open_price REAL NOT NULL DEFAULT 0,
open_cost REAL NOT NULL DEFAULT 0,
float_profit REAL NOT NULL DEFAULT 0,
market_value REAL NOT NULL DEFAULT 0,
stock_holder TEXT NOT NULL DEFAULT '',
frozen_volume INTEGER NOT NULL DEFAULT 0,
can_use_volume INTEGER NOT NULL DEFAULT 0,
on_road_volume INTEGER NOT NULL DEFAULT 0,
yesterday_volume INTEGER NOT NULL DEFAULT 0,
last_price REAL NOT NULL DEFAULT 0,
profit_rate REAL NOT NULL DEFAULT 0,
future_trade_type INTEGER,
expire_date TEXT NOT NULL DEFAULT ''
2026-09-07 14:04:26 +08:00
);
2026-09-07 18:18:00 +08:00
CREATE UNIQUE INDEX IF NOT EXISTS idx_positions_stock_code ON positions (stock_code);
2026-09-07 14:04:26 +08:00
CREATE TABLE IF NOT EXISTS deals (
2026-09-07 18:18:00 +08:00
id INTEGER PRIMARY KEY AUTOINCREMENT,
stock_code TEXT NOT NULL,
order_sys_id TEXT NOT NULL CHECK (order_sys_id <> ''),
order_local_id TEXT NOT NULL CHECK (order_local_id <> ''),
ref INTEGER NOT NULL DEFAULT 0,
order_ref TEXT NOT NULL DEFAULT '',
direction INTEGER NOT NULL DEFAULT 0,
offset_flag INTEGER NOT NULL CHECK (offset_flag IN (23, 24, 48, 49)),
price REAL NOT NULL CHECK (price >= 0),
volume INTEGER NOT NULL CHECK (volume > 0),
trade_amount REAL NOT NULL CHECK (trade_amount > 0),
trade_date TEXT NOT NULL,
trade_time TEXT NOT NULL,
remark TEXT NOT NULL DEFAULT '',
close_profit REAL NOT NULL DEFAULT 0
2026-09-07 14:04:26 +08:00
);
2026-09-07 18:18:00 +08:00
CREATE UNIQUE INDEX IF NOT EXISTS idx_deals_order_sys_id ON deals (order_sys_id);
CREATE INDEX IF NOT EXISTS idx_deals_order_ref ON deals (order_local_id);
CREATE INDEX IF NOT EXISTS idx_deals_stock_code_date ON deals (stock_code);
CREATE INDEX IF NOT EXISTS idx_deals_date_time ON deals (trade_date);
c#<01>$K<00>|] }|jV<00><00> dS<00>N<><01>name<6D><02>.0<EFBFBD>fields <20>1D:\work\quant\big-qmt\py-client\libs\orderbook.py<70> <genexpr>r=s$<00><00><00><00>E<>E<>u<EFBFBD><05>
<EFBFBD>E<>E<>E<>E<>E<>E<>c#<01>$K<00>|] }|jV<00><00> dSr r rs rrr>s$<00><00><00><00>=<3D>=<3D>5<EFBFBD>E<EFBFBD>J<EFBFBD>=<3D>=<3D>=<3D>=<3D>=<3D>=r)<01>order_local_idzINSERT INTO positions (z, z
) VALUES (c#<01> K<00>|] }d|zV<00><00>
dS<00><02>:N<><00>r<00>keys rrrBs&<00><00><00><00>><3E>><3E>s<EFBFBD><13>s<EFBFBD><19>><3E>><3E>><3E>><3E>><3E>>rz() ON CONFLICT(stock_code) DO UPDATE SET c#<01>0K<00>|]}|dk<00>|<01>d|<01><00>V<00><00>dS)<03>
stock_codez = excluded.Nrrs rrrDs:<00><00><00><00>\<5C>\<5C>c<EFBFBD><03>|<7C>H[<5B>H[<5B>3<EFBFBD>)<29>)<29>C<EFBFBD>)<29>)<29>H[<5B>H[<5B>H[<5B>H[<5B>\<5C>\rzINSERT INTO deals (c#<01> K<00>|] }d|zV<00><00>
dSrrrs rrrHs&<00><00><00><00>:<3A>:<3A>s<EFBFBD><13>s<EFBFBD><19>:<3A>:<3A>:<3A>:<3A>:<3A>:r<00>)c<01>\<00>eZdZdZdd<06>Zdd<08>Zdd <09>Zedd <0A><04><00>Zdd<10>Z dd<13>Z
ddd<17>Z dS) <20> OrderBookz>Position snapshots and append-only deals. No schema migration.<2E>path<74>
2026-09-07 14:04:26 +08:00
str | Path<74>return<72>Nonec<01><><00>t|<01><00>|_i|_i|_t <00><00>|_|jj<00>dd<01><02><00>t|<00> <00><00><00><00>5}|<02>
2026-09-07 18:18:00 +08:00
t<00><00>ddd<00><00>n #1swxYwY|<00> <00><00>dS)NT)<02>parents<74>exist_ok) rr#<00> positions<6E>deals<6C>set<65> deals_sys_ids<64>parent<6E>mkdirr<00>_connect<63> executescript<70>SCHEMA<4D>load)<03>selfr#<00>dbs r<00>__init__zOrderBook.__init__Os<><00><00><18><14>J<EFBFBD>J<EFBFBD><04> <09>*,<2C><04><0E>&(<28><04>
<EFBFBD>'*<2A>u<EFBFBD>u<EFBFBD><04><1A> <0C> <09><18><1E><1E>t<EFBFBD>d<EFBFBD><1E>;<3B>;<3B>;<3B> <14>T<EFBFBD>]<5D>]<5D>_<EFBFBD>_<EFBFBD> %<25> %<25> %<25><12> <0E> <1C> <1C>V<EFBFBD> $<24> $<24> $<24> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25> %<25><><EFBFBD><EFBFBD> %<25> %<25> %<25> %<25> <0C> <09> <09> <0B> <0B> <0B> <0B> s<00>8B<03>B#<07>&B#<07>sqlite3.Connectionc<01>^<00>tj|jd<01><02><00>}tj|_|S)N<>)<01>timeout)<05>sqlite3<65>connectr#<00>Row<6F> row_factory)r4r5s rr0zOrderBook._connectYs&<00><00> <14>_<EFBFBD>T<EFBFBD>Y<EFBFBD><02> 3<> 3<> 3<><02> <20><1B><02><0E><11> rc<01><><00>t|<00><00><00><00><00>5}|5|<01>d<01><00>d<02>|<01>d<03><00>D<00><00>}d<04>|<01>d<05><00>D<00><00>}ddd<00><00>n #1swxYwYddd<00><00>n #1swxYwY||_||_t |<03><00>|_dS)N<>BEGINc<01>:<00>i|]}|dt|<01><00><00><02>S<00>r<00><01>dict<63>r<00>rows r<00>
<dictcomp>z"OrderBook.load.<locals>.<dictcomp>as%<00><00>g<>g<>g<>#<23><13>\<5C>*<2A>D<EFBFBD><13>I<EFBFBD>I<EFBFBD>g<>g<>grzSELECT * FROM positionsc<01>:<00>i|]}|dt|<01><00><00><02>S)<01> order_sys_idrCrEs rrGz"OrderBook.load.<locals>.<dictcomp>bs%<00><00>m<>m<>m<><03>S<EFBFBD><1E>(<28>$<24>s<EFBFBD>)<29>)<29>m<>m<>mrzSELECT * FROM deals ORDER BY id)rr0<00>executer*r+r,r-)r4r5r*r+s rr3zOrderBook.load^s[<00><00> <14>T<EFBFBD>]<5D>]<5D>_<EFBFBD>_<EFBFBD> %<25> %<25> n<01><12>R<EFBFBD> n<01> n<01> <0E>J<EFBFBD>J<EFBFBD>w<EFBFBD> <1F> <1F> <1F>g<>g<><12><1A><1A>Le<4C>Af<41>Af<41>g<>g<>g<>I<EFBFBD>m<>m<>r<EFBFBD>z<EFBFBD>z<EFBFBD>Jk<4A>?l<>?l<>m<>m<>m<>E<EFBFBD> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01><><EFBFBD><EFBFBD> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01> n<01><><EFBFBD><EFBFBD> n<01> n<01> n<01> n<01>#<23><04><0E><1A><04>
<EFBFBD> <20><15>Z<EFBFBD>Z<EFBFBD><04><1A><1A>s5<00>B<03>AB<05>9 B<03>B <09> B<03> B <09> B<03>B <07>#B <07>dealr rDc<01><><00>|jr |jdkrtd<02><00><00>t|<00><00>}|<00><00><00>|d<|dstd<04><00><00>t d<05>|<01><00><00>D<00><00><00><00>rtd<06><00><00>|jdkr|jn|j|jz}tj
|<02><00>r|dkrtd<07><00><00>||d<|j p6tj <00><00><00><00><00><00><00><00>}t!|<03><00>d kr6|<03><00><00>r"|dd
<EFBFBD><00>d |d
d <0C><00>d |d d<00><00><00>}||d <|S)Nrz0System order ID and positive volume are requiredrzLocal order ID is requiredc3<01>jK<00>|].}t|t<00><00>otj|<01><00> V<00><00>/dSr <00><04>
isinstance<EFBFBD>float<61>math<74>isfinite<74>r<00>values rrz(OrderBook.deal_record.<locals>.<genexpr>qs><00><00><00><00>_<>_<><15>z<EFBFBD>%<25><15>'<27>'<27>D<><04> <0A>e<EFBFBD>0D<30>0D<30>,D<>_<>_<>_<>_<>_<>_r<00>Numeric values must be finitez(Trade amount must be positive and finite<74> trade_amount<6E><00><00>-<2D><00>
trade_date)rI<00>volume<6D>
ValueErrorr<00>get_local_order_id<69>any<6E>valuesrV<00>pricerQrRr[r<00>now<6F>date<74> isoformat<61>len<65>isdigit)rKrF<00>amountrcs r<00> deal_recordzOrderBook.deal_recordgs<><00><00><13> <20> Q<01>D<EFBFBD>K<EFBFBD>1<EFBFBD>$4<>$4<><1C>O<>P<>P<> P<><14>T<EFBFBD>l<EFBFBD>l<EFBFBD><03> $<24> 7<> 7<> 9<> 9<><03> <1C><1D><12>#<23>$<24> ;<3B><1C>9<>:<3A>:<3A> :<3A> <0E>_<>_<>RU<52>R\<5C>R\<5C>R^<5E>R^<5E>_<>_<>_<> _<> _<> ><3E><1C><<3C>=<3D>=<3D> =<3D>&*<2A>&7<>!<21>&;<3B>&;<3B><14>"<22>"<22><14><1A>d<EFBFBD>k<EFBFBD>AY<41><06><13>}<7D>V<EFBFBD>$<24>$<24> I<01><06>!<21> <0B> <0B><1C>G<>H<>H<> H<>$<24><03>N<EFBFBD><1B><13><EFBFBD>C<>(<28>,<2C>.<2E>.<2E>"5<>"5<>"7<>"7<>"A<>"A<>"C<>"C<><04> <0E>t<EFBFBD>9<EFBFBD>9<EFBFBD><01>><3E>><3E>d<EFBFBD>l<EFBFBD>l<EFBFBD>n<EFBFBD>n<EFBFBD>><3E><1A>2<EFBFBD>A<EFBFBD>2<EFBFBD>h<EFBFBD>7<>7<><14>a<EFBFBD><01>c<EFBFBD><19>7<>7<>T<EFBFBD>!<21>"<22>"<22>X<EFBFBD>7<>7<>D<EFBFBD> <20><03>L<EFBFBD><19><12>
rr+<00>list[DealItem]c<01><><00>i}|D]6}|j|jvr&|j|vr|<00>|<03><00>||j<<00>7|sdSt|<00><00><00><00><00>5}|5|<04>t |<02><00><00><00><00>ddd<00><00>n #1swxYwYddd<00><00>n #1swxYwY|<00><00><00>dSr ) rIr-rhrr0<00> executemany<6E> DEAL_INSERTr`r3)r4r+<00> new_dealsrKr5s r<00>
sync_dealszOrderBook.sync_deals}sS<00><00><16> <09><19> F<01> F<01>D<EFBFBD><13> <20><04>(:<3A>:<3A>:<3A>t<EFBFBD>?P<>Xa<58>?a<>?a<>/3<>/?<3F>/?<3F><04>/E<>/E<> <09>$<24>+<2B>,<2C><><18> <13> <12>F<EFBFBD> <14>T<EFBFBD>]<5D>]<5D>_<EFBFBD>_<EFBFBD> %<25> %<25> <<3C><12>R<EFBFBD> <<3C> <<3C> <0E>N<EFBFBD>N<EFBFBD>;<3B> <09>(8<>(8<>(:<3A>(:<3A> ;<3B> ;<3B> ;<3B> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C><><EFBFBD><EFBFBD> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C> <<3C><><EFBFBD><EFBFBD> <<3C> <<3C> <<3C> <<3C> <0C> <09> <09> <0B> <0B> <0B> <0B> s6<00>!B5<03>$.B<05> B5<03>B" <09>"B5<03>%B" <09>&B5<03>5B9<07><B9r*<00>list[PositionItem]c<01>D<00>|<00>d<01>|D<00><00><00><00>dS)zJReplace the complete position snapshot, retaining IDs for existing stocks.c<01>8<00>i|]}|jt|<01><00><00><02>Sr)rr<00>r<00>items rrGz,OrderBook.sync_positions.<locals>.<dictcomp><3E>s"<00><00>G<>G<>G<>T<EFBFBD>4<EFBFBD>?<3F>F<EFBFBD>4<EFBFBD>L<EFBFBD>L<EFBFBD>G<>G<>GrN)<01>save)r4r*s r<00>sync_positionszOrderBook.sync_positions<6E>s)<00><00> <0C> <09> <09>G<>G<>Y<EFBFBD>G<>G<>G<>H<>H<>H<>H<>HrN<>items<6D>list[dict] | Nonec<01><00><01>g}|<02>Pt|<02><00>t|j<00><00>krtd<02><00><00>|t|j<00><00>d<01>}d<03><00><01><00><00>D<00><00>}g|<04>|<03>D]<}t d<04>|<05><00><00>D<00><00><00><00>rtd<05><00><00><01>=t |<00><00><00><00><00>5}|5<00>fd<06>|<06>d<07><00>D<00><00>}|<06>d|<07><00>|<06>t|<04><00>|<06>t|<03><00>ddd<01><00>n #1swxYwYddd<01><00>n #1swxYwY|<00> <00><00>dS) uO保存持仓快照,可同时追加成交;省略 deals 时仅更新持仓。Nz Execution history is append-onlyc<01>$<00>g|] }it<00>|<01><01><02>Sr)<01>POSITION_DEFAULTSrrs r<00>
<listcomp>z"OrderBook.save.<locals>.<listcomp><3E>s$<00><00>N<>N<>N<>t<EFBFBD>2<>)<29>2<>T<EFBFBD>2<>N<>N<>Nrc3<01>jK<00>|].}t|t<00><00>otj|<01><00> V<00><00>/dSr rNrSs rrz!OrderBook.save.<locals>.<genexpr><3E>s><00><00><00><00>c<>c<>U<EFBFBD>:<3A>e<EFBFBD>U<EFBFBD>+<2B>+<2B>H<>D<EFBFBD>M<EFBFBD>%<25>4H<34>4H<34>0H<30>c<>c<>c<>c<>c<>crrUc<01>6<00><01>g|]}|d<00>v<01> |df<01><02>SrBr)rrFrvs <20>rr{z"OrderBook.save.<locals>.<listcomp><3E>s;<00><><00><0E><0E><0E><17><16>|<7C>$<24>E<EFBFBD>1<>1<><15>\<5C>"<22>$<24>1<>1<>1rz SELECT stock_code FROM positionsz*DELETE FROM positions WHERE stock_code = ?) rer+r]r`r_rr0rJrk<00>POSITION_UPSERTrlr3)r4rvr+rmr*rFr5<00>removeds ` rrtzOrderBook.save<76>s<00><><00><16> <09> <10> <1C><12>5<EFBFBD>z<EFBFBD>z<EFBFBD>C<EFBFBD><04>
<EFBFBD>O<EFBFBD>O<EFBFBD>+<2B>+<2B> <20>!C<>D<>D<>D<><1D>c<EFBFBD>$<24>*<2A>o<EFBFBD>o<EFBFBD>.<2E>.<2E>/<2F>I<EFBFBD>N<>N<>u<EFBFBD>|<7C>|<7C>~<7E>~<7E>N<>N<>N<> <09>+<2B>Y<EFBFBD>+<2B><19>+<2B> B<01> B<01>C<EFBFBD><12>c<>c<>VY<56>V`<60>V`<60>Vb<56>Vb<56>c<>c<>c<>c<>c<> B<01> <20>!@<40>A<>A<>A<> B<01> <14>T<EFBFBD>]<5D>]<5D>_<EFBFBD>_<EFBFBD> %<25> %<25> 3<><12>R<EFBFBD> 3<> 3<><0E><0E><0E><0E><1D>:<3A>:<3A>&H<>I<>I<><0E><0E><0E>G<EFBFBD>
<0F>N<EFBFBD>N<EFBFBD>G<><17> Q<> Q<> Q<> <0E>N<EFBFBD>N<EFBFBD>?<3F>I<EFBFBD> 6<> 6<> 6<> <0E>N<EFBFBD>N<EFBFBD>;<3B> <09> 2<> 2<> 2<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<><33><EFBFBD><EFBFBD> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<> 3<><33><EFBFBD><EFBFBD> 3<> 3<> 3<> 3<> <0A> <09> <09> <0B> <0B> <0B> <0B> s7<00>E,<03>A.E<05> E,<03>E <09>E,<03>E <09>E,<03>,E0<07>3E0)r#r$r%r&)r%r7)r%r&)rKr r%rD)r+rir%r&)r*ror%r&r )rvrDr+rwr%r&) <0C>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__r6r0r3<00> staticmethodrhrnrurtrrrr"r"Ls<><00><00><00><00><00><00>H<>H<><14><14><14><14><12><12><12><12>
(<28>(<28>(<28>(<28><12><13><13><13><12>\<5C><13>* <14> <14> <14> <14>I<01>I<01>I<01>I<01><14><14><14><14><14><14>rr")r<><00>
__future__rrQr;<00>
contextlibr<00> dataclassesrrr<00>pathlibr<00>sdkr r
r2<00>tuple<6C>POSITION_FIELDS<44> DEAL_FIELDSrz<00>joinr~rlr"rrr<00><module>r<>s <00><01>S<>S<>"<22>"<22>"<22>"<22>"<22>"<22> <0B> <0B> <0B> <0B><0E><0E><0E><0E><1E><1E><1E><1E><1E><1E>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26><1D><1D><1D><1D><1D><1D><18><18><18><18><18><18>&<26>&<26>&<26>&<26>&<26>&<26>&<26>&<26>,
<04><06>^<18>%<25>E<>E<><06><06>|<7C>0D<30>0D<30>E<>E<>E<>E<>E<><0F><13>e<EFBFBD>=<3D>=<3D>F<EFBFBD>F<EFBFBD>8<EFBFBD>,<<3C>,<<3C>=<3D>=<3D>=<3D>=<3D>=<3D>@S<>S<> <0B><1A>F<EFBFBD><<3C><<3C>><3E>><3E>*<2A>*<2A><11>-<2D>d<EFBFBD>i<EFBFBD>i<EFBFBD><0F>8<>8<>-<2D>-<2D><13>y<EFBFBD>y<EFBFBD>><3E>><3E>o<EFBFBD>><3E>><3E>><3E>><3E>><3E>-<2D>-<2D>-<2D> <0B>i<EFBFBD>i<EFBFBD>\<5C>\<5C>_<EFBFBD>\<5C>\<5C>\<5C>\<5C>\<5C>]<01><10>><3E>$<24>)<29>)<29>K<EFBFBD>0<>0<>><3E>><3E><13>y<EFBFBD>y<EFBFBD>:<3A>:<3A>k<EFBFBD>:<3A>:<3A>:<3A>:<3A>:<3A>><3E>><3E>><3E> <0C> T<14>T<14>T<14>T<14>T<14>T<14>T<14>T<14>T<14>Tr