Π ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π±Π°Π·Π° KDB+, ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Q, ΠΊΠ°ΠΊΠΈΠ΅ Ρ Π½ΠΈΡ
Π΅ΡΡΡ ΡΠΈΠ»ΡΠ½ΡΠ΅ ΠΈ ΡΠ»Π°Π±ΡΠ΅ ΡΡΠΎΡΠΎΠ½Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π² ΠΌΠΎΠ΅ΠΉ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
KDB+ β ΡΡΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΎΡΠ½Π°Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ , ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π½Π° ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΌΡ Π΄Π°Π½Π½ΡΡ , ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ). ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ½Π°, Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π² ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΡ β Π±Π°Π½ΠΊΠ°Ρ , ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΈΠΎΠ½Π½ΡΡ ΡΠΎΠ½Π΄Π°Ρ , ΡΡΡΠ°Ρ ΠΎΠ²ΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡ . Π―Π·ΡΠΊ Q β ΡΡΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠ·ΡΠΊ KDB+, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΡ Q β ΡΡΠΎ ΠΊΡΠ°ΡΠΊΠΎΡΡΡ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ, ΠΏΠΎΠ½ΡΡΠ½ΠΎΡΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΈΠ½ΠΎΡΠΈΡΡΡ Π² ΠΆΠ΅ΡΡΠ²Ρ. ΠΠ±ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°Π΅ΡΡΡ ΡΡΠΎ ΡΠ΅ΠΌ, ΡΡΠΎ Π²Π΅ΠΊΡΠΎΡΠ½ΡΠΉ ΡΠ·ΡΠΊ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ»ΠΎΠΆΠ΅Π½ Π΄Π»Ρ Π²ΠΎΡΠΏΡΠΈΡΡΠΈΡ, Π° ΠΊΡΠ°ΡΠΊΠΎΡΡΡ ΠΈ Π½Π°ΡΡΡΠ΅Π½Π½ΠΎΡΡΡ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΠΊΡΠ°Π½Π΅ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΡΠΎ Π² ΠΈΡΠΎΠ³Π΅ ΠΎΠ±Π»Π΅Π³ΡΠ°Π΅Ρ Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅.
Π ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° Q ΠΈ Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ
ΠΎΡΠ΅ΡΡΡ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π΅Π΅ Π² Π΄Π΅Π»Π΅. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Q. Π‘ΠΊΠ°ΡΠ°ΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΡ 32-Π±ΠΈΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° ΡΠ°ΠΉΡΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ kx β
ΠΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°ΡΠΈ
ΠΡΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΡΡΠ»Π°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠ΅ 25 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄ ΡΠ°Π±Π»ΠΈΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ KDB+ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π² ΡΠΈΠ½Π°Π½ΡΠ°Ρ , Π±ΡΠ΄Π΅ΠΌ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΄Π΅Π»ΠΎΠΊ (trades), Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ: time (Π²ΡΠ΅ΠΌΡ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ ), sym (ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π½Π° Π±ΠΈΡΠΆΠ΅ β IBM, AAPL,β¦), price (ΡΠ΅Π½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΊΡΠΏΠ»Π΅Π½Ρ Π°ΠΊΡΠΈΠΈ), size (ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΄Π΅Π»ΠΊΠΈ). ΠΠ½ΡΠ΅ΡΠ²Π°Π» 25 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄ Π²ΡΠ±ΡΠ°Π½ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎ, ΠΎΠ½ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΉ ΠΈ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠΉ. ΠΠ³ΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ Π² ΡΠ΅ΡΠ²ΠΈΡ ΡΠΆΠ΅ Π±ΡΡΠ΅ΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅. ΠΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π»Π΅Π³ΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²ΠΈΡΠ°, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ, Π·Π°Π²ΠΈΡΡΡΡΡ ΠΎΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ, Π½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π΅.
Π‘Π΅ΡΠ²ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡΠΈΡΠ°ΡΡ ΠΏΠΎΠΌΠΈΠ½ΡΡΠ½ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΈΠ· ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ sym Π½Π°Π±ΠΎΡ Π°Π³ΡΠ΅Π³ΠΈΡΡΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ β max price, avg price, sum size ΠΈ Ρ.ΠΏ. ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΌΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΡΡΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎ, Ρ.Π΅. Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π·Π½Π°ΡΡ Π΄Π²Π° ΡΠΈΡΠ»Π° β ΡΡΠ°ΡΠΎΠ΅ ΠΈ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΠΈ max, average, sum ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΡΡΠΈΠΌ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΠΌ, Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠ΅Π΄ΠΈΠ°Π½Π° Π½Π΅Ρ.
Π’Π°ΠΊΠΆΠ΅ ΠΌΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π²Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠΎ Π΄Π°ΡΡ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΌΠΈΠ½ΡΡΠΎΠΉ. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΌΠ΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΌΠΈΠ½ΡΡΠ°ΠΌΠΈ Π½Π° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π°ΠΏΠ΄Π΅ΠΉΡΡ Π·Π°ΠΏΠΎΠ·Π΄Π°Π»ΠΈ. ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ.
ΠΠ³ΡΠ΅Π³ΠΈΡΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠΈΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π°Π³ΡΠ΅Π³ΠΈΡΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. Π― Π²Π·ΡΠ» ΠΈΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅, ΡΡΠΎΠ±Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ΅ΡΠ²ΠΈΡ:
- high β max price β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- low β min price β ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- firstPrice β first price β ΠΏΠ΅ΡΠ²Π°Ρ ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- lastPrice β last price β ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- firstSize β first size β ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΄Π΅Π»ΠΊΠΈ Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- lastSize β last size β ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΄Π΅Π»ΠΊΠΈ Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- numTrades β count i β ΡΠΈΡΠ»ΠΎ ΡΠ΄Π΅Π»ΠΎΠΊ Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- volume β sum size β ΡΡΠΌΠΌΠ° ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΡΠ΄Π΅Π»ΠΎΠΊ Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- pvolume β sum price β ΡΡΠΌΠΌΠ° ΡΠ΅Π½ Π·Π° ΠΌΠΈΠ½ΡΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ avgPrice.
- turnover β sum price*size β ΡΡΠΌΠΌΠ°ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΌ ΡΠ΄Π΅Π»ΠΎΠΊ Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- avgPrice β pvolume%numTrades β ΡΡΠ΅Π΄Π½ΡΡ ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- avgSize β volume%numTrades β ΡΡΠ΅Π΄Π½ΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΄Π΅Π»ΠΊΠΈ Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- vwap β turnover%volume β Π²Π·Π²Π΅ΡΠ΅Π½Π½Π°Ρ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠ΄Π΅Π»ΠΊΠΈ ΡΡΠ΅Π΄Π½ΡΡ ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΡ.
- cumVolume β sum volume β Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΄Π΅Π»ΠΎΠΊ Π·Π° Π²ΡΠ΅ Π²ΡΠ΅ΠΌΡ.
Π‘ΡΠ°Π·Ρ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ ΠΎΠ΄ΠΈΠ½ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ β ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π· ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΌΠΈΠ½ΡΡΡ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΡΠΈΠΏΠ° firstPrice ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π½ΡΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ null, ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ. ΠΡΡΠ³ΠΈΠ΅ ΡΠΈΠΏΠ° volume Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π²ΡΠ΅Π³Π΄Π° Π² 0. ΠΡΠ΅ Π΅ΡΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅Π±ΡΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, cumVolume Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΌΠΈΠ½ΡΡΡ, Π° Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π² 0. ΠΠ°Π΄Π°Π΄ΠΈΠΌ Π²ΡΠ΅ ΡΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ ΡΠ»ΠΎΠ²Π°ΡΡ (Π°Π½Π°Π»ΠΎΠ³ Π·Π°ΠΏΠΈΡΠΈ):
// list ! list β ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ»ΠΎΠ²Π°ΡΡ, 0n β float null, 0N β long null, `sym β ΡΠΈΠΏ ΡΠΈΠΌΠ²ΠΎΠ», `sym1`sym2 β ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
initWith:`sym`time`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover`avgPrice`avgSize`vwap`cumVolume!(`;00:00;0n;0n;0n;0n;0N;0N;0;0;0.0;0.0;0n;0n;0n;0);
aggCols:reverse key[initWith] except `sym`time; // ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ
Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌΡΡ
ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, reverse ΠΎΠ±ΡΡΡΠ½Π΅Π½ Π½ΠΈΠΆΠ΅
Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» sym ΠΈ time Π² ΡΠ»ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π°, ΡΠ΅ΠΏΠ΅ΡΡ initWith β ΡΡΠΎ Π³ΠΎΡΠΎΠ²Π°Ρ ΡΡΡΠΎΡΠΊΠ° ΠΈΠ· ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ, Π³Π΄Π΅ ΠΎΡΡΠ°Π»ΠΎΡΡ Π·Π°Π΄Π°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ sym ΠΈ time. ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΡ.
aggCols Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π°Π³ΡΠ΅Π³ΠΈΡΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. Π‘ΠΏΠΈΡΠΎΠΊ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ·-Π·Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² Q (ΡΠΏΡΠ°Π²Π° Π½Π°Π»Π΅Π²ΠΎ). Π¦Π΅Π»Ρ β ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π² Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΎΡ high ΠΊ cumVolume, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ .
ΠΠΎΠ»ΠΎΠ½ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π² Π½ΠΎΠ²ΡΡ ΠΌΠΈΠ½ΡΡΡ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ, ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° sym Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π°:
rollColumns:`sym`cumVolume;
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π½Π° Π³ΡΡΠΏΠΏΡ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΠΈΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ. ΠΠΎΠΆΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΡΡΠΈ ΡΠΈΠΏΠ°:
- ΠΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΡ (volume, turnover,..) β ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΠ±Π°Π²ΠΈΡΡ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌΡ.
- Π‘ ΠΎΡΠΎΠ±ΠΎΠΉ ΡΠΎΡΠΊΠΎΠΉ (high, low, ..) β ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠΈΠ½ΡΡΠ΅ Π±Π΅ΡΠ΅ΡΡΡ ΠΈΠ· Π²Ρ ΠΎΠ΄ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ , ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠΈΡΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ.
- ΠΡΡΠ°Π»ΡΠ½ΡΠ΅. ΠΡΠ΅Π³Π΄Π° ΡΡΠΈΡΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΡΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ²:
accumulatorCols:`numTrades`volume`pvolume`turnover;
specialCols:`high`low`firstPrice`firstSize;
ΠΠΎΡΡΠ΄ΠΎΠΊ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ
ΠΠ±Π½ΠΎΠ²Π»ΡΡΡ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π² Π΄Π²Π° ΡΡΠ°ΠΏΠ°. ΠΠ»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΌΡ ΡΠ½Π°ΡΠ°Π»Π° ΡΠΆΠΌΠ΅ΠΌ Π²Ρ ΠΎΠ΄ΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠ°ΠΌ ΠΎΡΡΠ°Π»Π°ΡΡ ΠΎΠ΄Π½Π° ΡΡΡΠΎΠΊΠ° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΈ ΠΌΠΈΠ½ΡΡΡ. Π’ΠΎ, ΡΡΠΎ Π²ΡΠ΅ Π½Π°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΈ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠ΅, Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π½Π°ΠΌ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΡ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π³Π° Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ. Π£ΠΆΠ°ΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅Π»Π΅ΠΊΡΠ°:
select high:max price, low:min price β¦ by sym,time.minute from table
Π£ ΡΡΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° Π΅ΡΡΡ ΠΌΠΈΠ½ΡΡ β Π½Π°Π±ΠΎΡ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ Π·Π°Π΄Π°Π½ Π·Π°ΡΠ°Π½Π΅Π΅. Π ΡΡΠ°ΡΡΡΡ, Π² Q ΡΠ΅Π»Π΅ΠΊΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΈ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΡΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ:
?[table;whereClause;byClause;selectClause]
Π― Π½Π΅ Π±ΡΠ΄Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠΎΡΠΌΠ°Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΡΠΌΠΈ Π±ΡΠ΄ΡΡ ΡΠΎΠ»ΡΠΊΠΎ by ΠΈ select Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ»ΠΎΠ²Π°ΡΡΠΌΠΈ Π²ΠΈΠ΄Π° columns!expressions. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠΆΠΈΠΌΠ°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ ΡΠ°ΠΊ:
selExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover!parse each ("max price";"min price";"first price";"last price";"first size";"last size";"count i";"sum size";"sum price";"sum price*size"); // each ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ map Π² Q Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°
preprocess:?[;();`sym`time!`sym`time.minute;selExpression];
ΠΠ»Ρ ΠΏΠΎΠ½ΡΡΠ½ΠΎΡΡΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΡΠ½ΠΊΡΠΈΡ parse, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ Ρ Q Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ Π² ΡΡΠ½ΠΊΡΠΈΡ eval ΠΈ ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΌ ΡΠ΅Π»Π΅ΠΊΡΠ΅. Π’Π°ΠΊΠΆΠ΅ ΠΎΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ preprocess Π·Π°Π΄Π°Π½Π° ΠΊΠ°ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ (Ρ.Π΅. ΡΡΠ½ΠΊΡΠΈΡ Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ) ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅Π»Π΅ΠΊΡ, ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ (ΡΠ°Π±Π»ΠΈΡΠ°) ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ preprocess ΠΊ ΡΠ°Π±Π»ΠΈΡΠ΅, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΆΠ°ΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ.
ΠΡΠΎΡΠΎΠΉ ΡΡΠ°ΠΏ β ΡΡΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ. ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠ½Π°ΡΠ°Π»Π° Π°Π»Π³ΠΎΡΠΈΡΠΌ Π² ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄Π΅:
for each sym in inputTable
idx: row index in agg table for sym+currentTime;
aggTable[idx;`high]: aggTable[idx;`high] | inputTable[sym;`high];
aggTable[idx;`volume]: aggTable[idx;`volume] + inputTable[sym;`volume];
β¦
Π Q Π²ΠΌΠ΅ΡΡΠΎ ΡΠΈΠΊΠ»ΠΎΠ² ΠΏΡΠΈΠ½ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ map/reduce. ΠΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Q β Π²Π΅ΠΊΡΠΎΡΠ½ΡΠΉ ΡΠ·ΡΠΊ ΠΈ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌ ΡΡΠ°Π·Ρ, ΡΠΎ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π±Π΅Π· ΡΠΈΠΊΠ»Π°, ΠΏΡΠΎΠ΄Π΅Π»ΡΠ²Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ ΡΡΠ°Π·Ρ:
idx:calcIdx inputTable;
row:aggTable idx;
aggTable[idx;`high]: row[`high] | inputTable`high;
aggTable[idx;`volume]: row[`volume] + inputTable`volume;
β¦
ΠΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΉΡΠΈ ΠΈ Π΄Π°Π»ΡΡΠ΅, Π² Q Π΅ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΡΠ½ΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ β ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ. ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π°Π±ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ², ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
idx:calcIdx inputTable;
rows:aggTable idx;
// .[target;(idx0;idx1;..);function;argument] ~ target[idx 0;idx 1;β¦]: function[target[idx 0;idx 1;β¦];argument], Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ½ΠΊΡΠΈΡ β ΡΡΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅
.[aggTable;(idx;aggCols);:;flip (row[`high] | inputTable`high;row[`volume] + inputTable`volume;β¦)];
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π΄Π»Ρ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΡ Π² ΡΠ°Π±Π»ΠΈΡΡ Π½ΡΠΆΠ΅Π½ ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠΎΠΊ, Π° Π½Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ°Π½ΡΠΏΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ°ΡΡΠΈΡΡ (ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ Π² ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠΎΠΊ) Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ flip. ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΡΡΠΎ Π½Π°ΠΊΠ»Π°Π΄Π½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ map (ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΊΠ°ΠΊ Π°ΠΏΠΎΡΡΡΠΎΡ):
.[aggTable;;:;]'[(idx;)each aggCols; (row[`high] | inputTable`high;row[`volume] + inputTable`volume;β¦)];
ΠΡ ΡΠ½ΠΎΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ. Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π² Q ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° β ΡΡΠΎ ΡΠΎΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠ·Π²Π°ΡΡ Π΅Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ each(map), ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠΏΠΈΡΠΊΠΎΠ².
Π§ΡΠΎΠ±Ρ Π½Π°Π±ΠΎΡ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ Π½Π΅ Π±ΡΠ» ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½, ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΡΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ. ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠ½Π°ΡΠ°Π»Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ row ΠΈ inp Π΄Π»Ρ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅:
aggExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`avgPrice`avgSize`vwap`cumVolume!
("row[`high]|inp`high";"row[`low]&inp`low";"row`firstPrice";"inp`lastPrice";"row`firstSize";"inp`lastSize";"pvolume%numTrades";"volume%numTrades";"turnover%volume";"row[`cumVolume]+inp`volume");
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΠΎΡΠΎΠ±ΡΠ΅, ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΡΡΠΎ ΠΎΠ½ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ row[`numTrades] β Π΅ΡΠ»ΠΈ Π² Π½Π΅ΠΉ 0, ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ΅. Π Q Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ±ΠΎΡΠ° β ?[Boolean list;list1;list2] β ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° 1 ΠΈΠ»ΠΈ 2 Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠ»ΠΎΠ²ΠΈΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ΅:
// high -> ?[isFirst;inp`high;row[`high]|inp`high]
// @ - ΡΠΎΠΆΠ΅ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΠ³Π΄Π° ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π΅Π³Π»ΡΠ±ΠΎΠΊΠΈΠΉ
@[`aggExpression;specialCols;{[x;y]"?[isFirst;inp`",y,";",x,"]"};string specialCols];
Π’ΡΡ Ρ Π²ΡΠ·Π²Π°Π» ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ ΠΌΠΎΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ (Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠΈΠ³ΡΡΠ½ΡΡ ΡΠΊΠΎΠ±ΠΊΠ°Ρ ). Π Π½Π΅Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (ΠΏΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ) ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Ρ Π² 4-ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅.
ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ½ΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ΄Π½Π° ΠΈ ΡΠ° ΠΆΠ΅:
// volume -> row[`volume]+inp`volume
aggExpression[accumulatorCols]:{"row[`",x,"]+inp`",x } each string accumulatorCols;
ΠΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΠΏΠΎ ΠΌΠ΅ΡΠΊΠ°ΠΌ Q ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Ρ Ρ ΡΡΠ°Π·Ρ ΡΠΏΠΈΡΠΎΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π³Π»Π°Π²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ:
// ":",/:aggExprs ~ map[{":",x};aggExpr] => ":row[`high]|inp`high" ΠΏΡΠΈΡΠ²ΠΎΠΈΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΡΠΆΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
// string[cols],'exprs ~ map[,;string[cols];exprs] => "high:row[`high]|inp`high" Π·Π°Π²Π΅ΡΡΠΈΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ. ,β ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ map[concat]
// ";" sv exprs β String from Vector (sv), ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠΎΠΊ Π²ΡΡΠ°Π²Π»ΡΡ β;β ΠΏΠΎΡΡΠ΅Π΄ΠΈΠ½Π΅
updateAgg:value "{[aggTable;idx;inp] row:aggTable idx; isFirst_0=row`numTrades; .[aggTable;;:;]'[(idx;)each aggCols;(",(";"sv string[aggCols],'":",/:aggExpression aggCols),")]}";
ΠΡΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Ρ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ» Π²ΡΡΠ΅. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
{[aggTable;idx;inp] rows:aggTable idx; isFirst_0=row`numTrades; .[aggTable;;:;]'[(idx;)each aggCols ;(cumVolume:row[`cumVolume]+inp`cumVolume;β¦ ; high:?[isFirst;inp`high;row[`high]|inp`high])]}
ΠΠΎΡΡΠ΄ΠΎΠΊ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² Q ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΠΏΡΠ°Π²Π° Π½Π°Π»Π΅Π²ΠΎ.
Π’Π΅ΠΏΠ΅ΡΡ Ρ Π½Π°Ρ Π΅ΡΡΡ Π΄Π²Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, ΠΎΡΡΠ°Π»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΡΠ΅ΡΠ²ΠΈΡ Π³ΠΎΡΠΎΠ².
Π€ΠΈΠ½Π°Π»ΡΠ½ΡΠ΅ ΡΠ°Π³ΠΈ
Π£ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ preprocess ΠΈ updateAgg, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅Π»Π°ΡΡ Π²ΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΅ΡΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΡΠ΅ΡΠ΅Π· ΠΌΠΈΠ½ΡΡΡ ΠΈ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π΄Π»Ρ Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ. Π ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ init:
init:{
tradeAgg:: 0#enlist[initWith]; // ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡΡΡΡΡ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, enlist ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»ΠΎΠ²Π°ΡΡ Π² ΡΠ°Π±Π»ΠΈΡΡ, Π° 0# ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π²Π·ΡΡΡ 0 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· Π½Π΅Π΅
currTime::00:00; // Π½Π°ΡΠ½Π΅ΠΌ Ρ 0, :: ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
currSyms::`u#`symbol$(); // `u# - ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π² Π΄Π΅ΡΠ΅Π²ΠΎ, Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
offset::0; // ΠΈΠ½Π΄Π΅ΠΊΡ Π² tradeAgg, Π³Π΄Π΅ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠ΅ΠΊΡΡΠ°Ρ ΠΌΠΈΠ½ΡΡΠ°
rollCache:: `sym xkey update `u#sym from rollColumns#tradeAgg; // ΠΊΡΡ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ roll ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΠΊΠ»ΡΡΠΎΠΌ sym
}
Π’Π°ΠΊΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ roll, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½ΡΡΡ ΡΠ΅ΠΊΡΡΡΡ ΠΌΠΈΠ½ΡΡΡ:
roll:{[tm]
if[currTime>tm; :init[]]; // Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π²Π°Π»ΠΈΠ»ΠΈ Π·Π° ΠΏΠΎΠ»Π½ΠΎΡΡ, ΡΠΎ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ init
rollCache,::offset _ rollColumns#tradeAgg; // ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ ΠΊΡΡ β Π²Π·ΡΡΡ roll ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΠΈΠ· aggTable, ΠΎΠ±ΡΠ΅Π·Π°ΡΡ, Π²ΡΡΠ°Π²ΠΈΡΡ Π² rollCache
offset::count tradeAgg;
currSyms::`u#`$();
}
ΠΠ°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²:
addSyms:{[syms]
currSyms,::syms; // Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΡΠ°Π±Π»ΠΈΡΡ sym, time ΠΈ rollColumns Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π²ΡΠΈΡΡ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠΌ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ.
// Π€ΡΠ½ΠΊΡΠΈΡ ^ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ roll ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, Π΅ΡΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π½Π΅Ρ Π² ΠΊΡΡΠ΅. value flip table Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΠ΅.
`tradeAgg upsert @[count[syms]#enlist initWith;`sym`time,cols rc;:;(syms;currTime), (initWith cols rc)^value flip rc:rollCache ([] sym: syms)];
}
Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΡΠ½ΠΊΡΠΈΡ upd (ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ Q ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ, Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ :
upd:{[tblName;data] // tblName Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, Π½ΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ΅ΡΠ²ΠΈΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±Π»ΠΈΡ
tm:exec distinct time from data:() xkey preprocess data; // preprocess & calc time
updMinute[data] each tm; // Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠΈΠ½ΡΡΡ
};
updMinute:{[data;tm]
if[tm<>currTime; roll tm; currTime::tm]; // ΠΏΠΎΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΌΠΈΠ½ΡΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ
data:select from data where time=tm; // ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ
if[count msyms:syms where not (syms:data`sym)in currSyms; addSyms msyms]; // Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ
updateAgg[`tradeAgg;offset+currSyms?syms;data]; // ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ ? ΠΈΡΠ΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΏΠΈΡΠΊΠ° ΡΠΏΡΠ°Π²Π° Π² ΡΠΏΠΈΡΠΊΠ΅ ΡΠ»Π΅Π²Π°.
};
ΠΠΎΡ ΠΈ Π²ΡΠ΅. ΠΠΎΡ ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±Π΅ΡΠ°Π»ΠΎΡΡ, Π²ΡΠ΅Π³ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ:
initWith:`sym`time`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover`avgPrice`avgSize`vwap`cumVolume!(`;00:00;0n;0n;0n;0n;0N;0N;0;0;0.0;0.0;0n;0n;0n;0);
aggCols:reverse key[initWith] except `sym`time;
rollColumns:`sym`cumVolume;
accumulatorCols:`numTrades`volume`pvolume`turnover;
specialCols:`high`low`firstPrice`firstSize;
selExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover!parse each ("max price";"min price";"first price";"last price";"first size";"last size";"count i";"sum size";"sum price";"sum price*size");
preprocess:?[;();`sym`time!`sym`time.minute;selExpression];
aggExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`avgPrice`avgSize`vwap`cumVolume!("row[`high]|inp`high";"row[`low]&inp`low";"row`firstPrice";"inp`lastPrice";"row`firstSize";"inp`lastSize";"pvolume%numTrades";"volume%numTrades";"turnover%volume";"row[`cumVolume]+inp`volume");
@[`aggExpression;specialCols;{"?[isFirst;inp`",y,";",x,"]"};string specialCols];
aggExpression[accumulatorCols]:{"row[`",x,"]+inp`",x } each string accumulatorCols;
updateAgg:value "{[aggTable;idx;inp] row:aggTable idx; isFirst_0=row`numTrades; .[aggTable;;:;]'[(idx;)each aggCols;(",(";"sv string[aggCols],'":",/:aggExpression aggCols),")]}"; / '
init:{
tradeAgg::0#enlist[initWith];
currTime::00:00;
currSyms::`u#`symbol$();
offset::0;
rollCache:: `sym xkey update `u#sym from rollColumns#tradeAgg;
};
roll:{[tm]
if[currTime>tm; :init[]];
rollCache,::offset _ rollColumns#tradeAgg;
offset::count tradeAgg;
currSyms::`u#`$();
};
addSyms:{[syms]
currSyms,::syms;
`tradeAgg upsert @[count[syms]#enlist initWith;`sym`time,cols rc;:;(syms;currTime),(initWith cols rc)^value flip rc:rollCache ([] sym: syms)];
};
upd:{[tblName;data] updMinute[data] each exec distinct time from data:() xkey preprocess data};
updMinute:{[data;tm]
if[tm<>currTime; roll tm; currTime::tm];
data:select from data where time=tm;
if[count msyms:syms where not (syms:data`sym)in currSyms; addSyms msyms];
updateAgg[`tradeAgg;offset+currSyms?syms;data];
};
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΡΠΈΠΌ Π΅Π³ΠΎ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ (ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΊΠΎΠ΄ Π² ΡΠ°ΠΉΠ» service.q) ΠΈ Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ init:
q service.q βp 5566
q)init[]
Π Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Π²ΡΠΎΡΠΎΠΉ Q ΠΏΡΠΎΡΠ΅ΡΡ ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΠ΅ΡΡ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ:
h:hopen `:host:5566
h:hopen 5566 // Π΅ΡΠ»ΠΈ ΠΎΠ±Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Ρ
ΠΎΡΡΠ΅
Π‘Π½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² β 10000 ΡΡΡΠΊ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ. ΠΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ:
syms:`IBM`AAPL`GOOG,-9997?`8
rnd:{[n;t] ([] sym:n?syms; time:t+asc n#til 25; price:n?10f; size:n?10)}
Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π² ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΡΡΠΈ Π½Π°ΡΡΠΎΡΡΠΈΡ , ΡΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ ΡΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈΡΠΊΠ°ΡΡ ΠΈΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ rnd ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Ρ n ΡΡΡΠΎΠΊΠ°ΠΌΠΈ, Π³Π΄Π΅ Π²ΡΠ΅ΠΌΡ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΎΡ t Π΄ΠΎ t+25 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ΅ΡΠ²ΠΈΡ (Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π΅ΡΡΡΡ ΡΠ°ΡΠΎΠ²):
{h (`upd;`trade;rnd[10000;x])} each `time$00:00 + til 60*10
ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π² ΡΠ΅ΡΠ²ΠΈΡΠ΅, ΡΡΠΎ ΡΠ°Π±Π»ΠΈΡΠ° ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»Π°ΡΡ:
c 25 200
select from tradeAgg where sym=`AAPL
-20#select from tradeAgg where sym=`AAPL
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
sym|time|high|low|firstPrice|lastPrice|firstSize|lastSize|numTrades|volume|pvolume|turnover|avgPrice|avgSize|vwap|cumVolume
--|--|--|--|--|--------------------------------
AAPL|09:27|9.258904|9.258904|9.258904|9.258904|8|8|1|8|9.258904|74.07123|9.258904|8|9.258904|2888
AAPL|09:28|9.068162|9.068162|9.068162|9.068162|7|7|1|7|9.068162|63.47713|9.068162|7|9.068162|2895
AAPL|09:31|4.680449|0.2011121|1.620827|0.2011121|1|5|4|14|9.569556|36.84342|2.392389|3.5|2.631673|2909
AAPL|09:33|2.812535|2.812535|2.812535|2.812535|6|6|1|6|2.812535|16.87521|2.812535|6|2.812535|2915
AAPL|09:34|5.099025|5.099025|5.099025|5.099025|4|4|1|4|5.099025|20.3961|5.099025|4|5.099025|2919
ΠΡΠΎΠ²Π΅Π΄Π΅ΠΌ ΡΠ΅ΠΏΠ΅ΡΡ Π½Π°Π³ΡΡΠ·ΠΎΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ Π²ΡΡΡΠ½ΠΈΡΡ ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π°Π½Π½ΡΡ ΡΠ΅ΡΠ²ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π² ΠΌΠΈΠ½ΡΡΡ. ΠΠ°ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π΄Π»Ρ Π°ΠΏΠ΄Π΅ΠΉΡΠΎΠ² Π² 25 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ΅ΡΠ²ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ (Π² ΡΡΠ΅Π΄Π½Π΅ΠΌ) ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ Ρ ΠΎΡΡ Π±Ρ Π² 20 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄ Π½Π° Π°ΠΏΠ΄Π΅ΠΉΡ, ΡΡΠΎΠ±Ρ Π΄Π°ΡΡ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π·Π°ΠΏΡΠΎΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅. ΠΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅:
tm:10:00:00.000
stressTest:{[n] 1 string[tm]," "; times,::h ({st:.z.T; upd[`trade;x]; .z.T-st};rnd[n;tm]); tm+:25}
start:{[n] times::(); do[4800;stressTest[n]]; -1 " "; `min`avg`med`max!(min times;avg times;med times;max times)}
4800 β ΡΡΠΎ Π΄Π²Π΅ ΠΌΠΈΠ½ΡΡΡ. ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ½Π°ΡΠ°Π»Π° Π΄Π»Ρ 1000 ΡΡΡΠΎΠΊ ΠΊΠ°ΠΆΠ΄ΡΠ΅ 25 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄:
start 1000
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠ°ΠΉΠΎΠ½Π΅ ΠΏΠ°ΡΡ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄ Π½Π° Π°ΠΏΠ΄Π΅ΠΉΡ. Π’Π°ΠΊ ΡΡΠΎ Ρ ΡΡΠ°Π·Ρ ΡΠ²Π΅Π»ΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ Π΄ΠΎ 10.000:
start 10000
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
min| 00:00:00.004
avg| 9.191458
med| 9f
max| 00:00:00.030
Π‘Π½ΠΎΠ²Π° Π½ΠΈΡΠ΅Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΠ³ΠΎ, Π° Π²Π΅Π΄Ρ ΡΡΠΎ 24 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° ΡΡΡΠΎΠΊ Π² ΠΌΠΈΠ½ΡΡΡ, 400 ΡΡΡΡΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΠΎΠ»ΡΡΠ΅ 25 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄ Π°ΠΏΠ΄Π΅ΠΉΡ ΡΠΎΡΠΌΠΎΠ·ΠΈΠ» ΡΠΎΠ»ΡΠΊΠΎ 5 ΡΠ°Π·, Π²ΠΈΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈ ΡΠΌΠ΅Π½Π΅ ΠΌΠΈΠ½ΡΡΡ. Π£Π²Π΅Π»ΠΈΡΠΈΠΌ Π΄ΠΎ 100.000:
start 100000
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
min| 00:00:00.013
avg| 25.11083
med| 24f
max| 00:00:00.108
q)sum times
00:02:00.532
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ΡΠ²ΠΈΡ Π΅Π΄Π²Π° ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ, Π½ΠΎ ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π΅ΠΌΡ ΡΠ΄Π°Π΅ΡΡΡ ΡΠ΄Π΅ΡΠΆΠ°ΡΡΡΡ Π½Π° ΠΏΠ»Π°Π²Ρ. Π’Π°ΠΊΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ (240 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² ΡΡΡΠΎΠΊ Π² ΠΌΠΈΠ½ΡΡΡ) ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ Π²Π΅Π»ΠΈΠΊ, Π² ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠΈΠ½ΡΡΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΠΎΠ½ΠΎΠ² (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π΄Π΅ΡΡΡΠΊΠΎΠ² ΠΊΠ»ΠΎΠ½ΠΎΠ²) ΡΠ΅ΡΠ²ΠΈΡΠ°, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΠΏΠ΅ΡΠ°ΡΠ»ΡΡΡΠΈΠΉ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ .
ΠΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ Π²ΠΎΠΏΡΠΎΡ, ΠΏΠΎΡΠ΅ΠΌΡ Π²ΡΠ΅ΠΌΡ ΡΠ°ΡΡΠ΅Ρ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΠΏΠ΄Π΅ΠΉΡΠ°. ΠΡΠΈΡΠΈΠ½Π° Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠΆΠΈΠΌΠ°ΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ β ΡΡΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π‘ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π΅Π΅ updateAgg. ΠΠ°ΡΠΈΠ½Π°Ρ Ρ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π°ΠΏΠ΄Π΅ΠΉΡΠ° (Π² ΡΠ°ΠΉΠΎΠ½Π΅ 10.000), updateAgg Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠ»ΠΊΠ° ΠΈ Π΄Π°Π»ΡΡΠ΅ Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π°ΠΏΠ΄Π΅ΠΉΡΠ°. ΠΠΌΠ΅Π½Π½ΠΎ Π·Π° ΡΡΠ΅Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π³Π° Q ΡΠ΅ΡΠ²ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΏΠ΅ΡΠ΅Π²Π°ΡΠΈΠ²Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΌΡ Π΄Π°Π½Π½ΡΡ . ΠΡΠΎ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π΅Ρ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΠΎ, ΡΠ°Π±ΠΎΡΠ°Ρ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ, Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ. ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ β ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠ»ΠΈ Π±Ρ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΡ Π½Π΅ ΠΏΠΎ-ΠΊΠΎΠ»ΠΎΠ½ΠΎΡΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ Π±ΡΠ»ΠΈ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠΎ ΠΌΡ Π±Ρ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ»ΠΈΡΡ Ρ ΡΠ°ΠΊΠΎΠΉ Π²Π΅ΡΡΡ, ΠΊΠ°ΠΊ TLB cache miss β ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ° ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ Π² ΠΊΡΡΠ΅ Π°Π΄ΡΠ΅ΡΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. ΠΠΎΠΈΡΠΊ Π°Π΄ΡΠ΅ΡΠ° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π³Π΄Π΅-ΡΠΎ Π² 30 ΡΠ°Π· Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΡΠ΄Π°ΡΠΈ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΡΡΠ΅ΡΠ½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡΡ ΡΠ΅ΡΠ²ΠΈΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΠΏΠΎΠΊΠ°Π·Π°Π», ΡΡΠΎ Π±Π°Π·Π° KDB+ ΠΈ Q ΠΏΡΠΈΠ³ΠΎΠ΄Π½Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π½ΠΈΠΌ ΡΠ΅ΡΠ΅Π· ΡΠ΅Π»Π΅ΠΊΡ, Π½ΠΎ ΠΈ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½Ρ ΠΏΠ΅ΡΠ΅Π²Π°ΡΠΈΠ²Π°ΡΡ ΡΠΎΡΠ½ΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² ΡΡΡΠΎΠΊ/Π³ΠΈΠ³Π°Π±Π°ΠΉΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π°ΠΆΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π²Π·ΡΡΠΎΠΌ Q ΠΏΡΠΎΡΠ΅ΡΡΠ΅. Π‘Π°ΠΌ ΡΠ·ΡΠΊ Q ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΡΠ°ΡΠΊΠΎ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π΄Π°Π½Π½ΡΡ Π·Π° ΡΡΠ΅Ρ ΡΠ²ΠΎΠ΅ΠΉ Π²Π΅ΠΊΡΠΎΡΠ½ΠΎΠΉ ΠΏΡΠΈΡΠΎΠ΄Ρ, Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° Π΄ΠΈΠ°Π»Π΅ΠΊΡΠ° SQL ΠΈ ΠΎΡΠ΅Π½Ρ ΡΠ΄Π°ΡΠ½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
Π― Π·Π°ΠΌΠ΅ΡΡ, ΡΡΠΎ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅, ΡΡΠΎ Π»ΠΈΡΡ ΡΠ°ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Q, Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ IPC ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΈΡΠ°Π΅Ρ Π³ΡΠ°Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌΠΈ Q ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡ ΡΠΎΡΠ½ΠΈ ΡΡΠΈΡ
ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π² Π΅Π΄ΠΈΠ½ΡΡ ΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π½Π° Π΄Π΅ΡΡΡΠΊΠ°Ρ
ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² Π² ΡΠ°Π·Π½ΡΡ
ΠΊΠΎΠ½ΡΠ°Ρ
ΡΠ²Π΅ΡΠ°.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com