ΠΠ° ΡΠΎΠ° ΡΡΠΎ Π΅ Π±Π°Π·Π°ΡΠ° Π½Π° KDB+, ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈΠΎΡ ΡΠ°Π·ΠΈΠΊ Q, ΠΊΠΎΠΈ ΡΠ΅ Π½ΠΈΠ²Π½ΠΈΡΠ΅ ΡΠΈΠ»Π½ΠΈ ΠΈ ΡΠ»Π°Π±ΠΈ ΡΡΡΠ°Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠΈΡΠ°ΡΠ΅ Π²ΠΎ ΠΌΠΎΠΈΡΠ΅ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΈ
ΠΠΎΠ²Π΅Π΄
KDB+ Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠΎΠΊΡΡΠΈΡΠ°Π½Π° Π½Π° ΠΌΠ½ΠΎΠ³Ρ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠ»ΠΈΡΠΈΠ½ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ Π½Π° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½ (ΠΏΡΠ²Π΅Π½ΡΡΠ²Π΅Π½ΠΎ ΡΠΏΠΎΡΠ΅Π΄ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ). Π‘Π΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΏΡΠ²Π΅Π½ΡΡΠ²Π΅Π½ΠΎ Π²ΠΎ ΡΠΈΠ½Π°Π½ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΠΈΡΡΡΠΈΠΈ - Π±Π°Π½ΠΊΠΈ, ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΈΡΠΊΠΈ ΡΠΎΠ½Π΄ΠΎΠ²ΠΈ, ΠΎΡΠΈΠ³ΡΡΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΠ°Π·ΠΈΠΊΠΎΡ Q Π΅ Π²Π½Π°ΡΡΠ΅ΡΠ½ΠΈΠΎΡ ΡΠ°Π·ΠΈΠΊ Π½Π° KDB+ ΠΊΠΎΡ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ ΠΎΠ²ΠΈΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΡΠ°ΡΠ° Q Π΅ ΠΊΡΠ°ΡΠΊΠΎΡΡ ΠΈ Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎΡΡ, Π΄ΠΎΠ΄Π΅ΠΊΠ° ΡΠ°ΡΠ½ΠΎΡΡΠ° Π΅ ΠΆΡΡΠ²ΡΠ²Π°Π½Π°. ΠΠ²Π° ΡΠ΅ ΠΎΠΏΡΠ°Π²Π΄ΡΠ²Π° ΡΠΎ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° Π²Π΅ΠΊΡΠΎΡΡΠΊΠΈΠΎΡ ΡΠ°Π·ΠΈΠΊ Π²ΠΎ ΡΠ΅ΠΊΠΎΡ ΡΠ»ΡΡΠ°Ρ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΡΠ΅ΡΠΊΠΎ ΡΠ°Π·Π±ΠΈΡΠ»ΠΈΠ², Π° ΠΊΡΠ°ΡΠΊΠΎΡΡΠ° ΠΈ Π±ΠΎΠ³Π°ΡΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠ½ΠΈΠΌΠΊΠ°ΡΠ° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌ Π΄Π΅Π» ΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π½Π° Π΅Π΄Π΅Π½ Π΅ΠΊΡΠ°Π½, ΡΡΠΎ Π½Π° ΠΊΡΠ°ΡΠΎΡ Π³ΠΎ ΠΎΠ»Π΅ΡΠ½ΡΠ²Π° ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅ΡΠΎ.
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ»Π½ΠΎΠΏΡΠ°Π²Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π²ΠΎ Q ΠΈ ΠΌΠΎΠΆΠ΅Π±ΠΈ ΡΠ΅ ΡΠ°ΠΊΠ°ΡΠ΅ Π΄Π° ΡΠ° ΠΈΡΠΏΡΠΎΠ±Π°ΡΠ΅. ΠΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ²Π°, ΡΠ΅ Π²ΠΈ ΡΡΠ΅Π±Π° Π²ΠΈΡΡΠΈΠ½ΡΠΊΠΈΠΎΡ Q. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΏΡΠ΅Π·Π΅ΠΌΠ΅ΡΠ΅ Π±Π΅ΡΠΏΠ»Π°ΡΠ½Π°ΡΠ° 32-Π±ΠΈΡΠ½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠ°ΡΠ° kx -
ΠΡΠΎΠ±Π»Π΅ΠΌ ΠΈΠ·ΡΠ°Π²Π°
ΠΠΎΡΡΠΎΠΈ ΠΈΠ·Π²ΠΎΡ ΠΊΠΎΡ ΠΈΡΠΏΡΠ°ΡΠ° ΡΠ°Π±Π΅Π»Π° ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° ΡΠ΅ΠΊΠΎΠΈ 25 ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ. ΠΠΈΠ΄Π΅ΡΡΠΈ KDB+ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΏΡΠ²Π΅Π½ΡΡΠ²Π΅Π½ΠΎ Π²ΠΎ ΡΠΈΠ½Π°Π½ΡΠΈΠΈΡΠ΅, ΡΠ΅ ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΎΠ²Π° Π΅ ΡΠ°Π±Π΅Π»Π° Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ (ΡΡΠ³ΠΎΠ²ΠΈΡΠ°), ΠΊΠΎΡΠ° Π³ΠΈ ΠΈΠΌΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ: Π²ΡΠ΅ΠΌΠ΅ (Π²ΡΠ΅ΠΌΠ΅ Π²ΠΎ ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ), sym (ΠΎΠ·Π½Π°ΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π° Π±Π΅ΡΠ·Π°ΡΠ° - IBM,, AAPL,β¦), ΡΠ΅Π½Π° (ΡΠ΅Π½Π°ΡΠ° ΠΏΠΎ ΠΊΠΎΡΠ° ΡΠ΅ ΠΊΡΠΏΠ΅Π½ΠΈ Π°ΠΊΡΠΈΠΈΡΠ΅), Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° (Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ°). ΠΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΡ ΠΎΠ΄ 25 ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½, Π½Π΅ Π΅ ΠΏΡΠ΅ΠΌΠ½ΠΎΠ³Ρ ΠΌΠ°Π» ΠΈ Π½Π΅ Π΅ ΠΏΡΠ΅ΠΌΠ½ΠΎΠ³Ρ Π΄ΠΎΠ»Π³. ΠΠ΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΏΡΠΈΡΡΡΡΠ²ΠΎ Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π΄ΠΎΠ°ΡΠ°Π°Ρ Π΄ΠΎ ΡΡΠ»ΡΠ³Π°ΡΠ° Π²Π΅ΡΠ΅ Π±Π°ΡΠ΅ΡΠΈΡΠ°Π½ΠΈ. ΠΠΈ Π±ΠΈΠ»ΠΎ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΡΠ°ΠΌΠΏΠΎΠ½ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΠ½Π°ΡΠ° ΡΡΡΠ°Π½Π°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ Π±Π°ΡΠ΅ΡΠΈΡΠ°ΡΠ΅ Π²ΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ ΡΠ΅ΠΊΠΎΠ²Π½ΠΎΡΠΎ ΠΎΠΏΡΠΎΠ²Π°ΡΡΠ²Π°ΡΠ΅, Π½ΠΎ Π·Π° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΡΡ, ΡΠ΅ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ°ΠΌΠ΅ Π½Π° ΡΠΈΠΊΡΠ΅Π½ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π».
Π£ΡΠ»ΡΠ³Π°ΡΠ° ΠΌΠΎΡΠ° Π΄Π° Π±ΡΠΎΠΈ ΡΠ΅ΠΊΠΎΡΠ° ΠΌΠΈΠ½ΡΡΠ° Π·Π° ΡΠ΅ΠΊΠΎΡ Π΄ΠΎΡΠ΄ΠΎΠ²Π΅Π½ ΡΠΈΠΌΠ±ΠΎΠ» ΠΎΠ΄ ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° sym Π·Π±ΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ - ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΡΠ΅Π½Π°, ΠΏΡΠΎΡΠ΅ΡΠ½Π° ΡΠ΅Π½Π°, Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° ΡΡΠΌΠ° ΠΈΡΠ½. ΠΊΠΎΡΠΈΡΠ½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. ΠΠ° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΡΡ, ΡΠ΅ ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°Π°Ρ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½ΠΎ, Ρ.Π΅. Π·Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ Π½ΠΎΠ²Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡ, Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π·Π½Π°Π°Ρ Π΄Π²Π° Π±ΡΠΎΡΠ° - ΡΡΠ°ΡΠΈΡΠ΅ ΠΈ Π΄ΠΎΡΠ΄ΠΎΠ²Π½ΠΈΡΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ max, average, sum Π³ΠΎ ΠΈΠΌΠ°Π°Ρ ΠΎΠ²Π° ΡΠ²ΠΎΡΡΡΠ²ΠΎ, Π½ΠΎ ΡΡΠ΅Π΄Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ° Π½Π΅.
ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΡΠ΅ ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π΄ΠΎΡΠ΄ΠΎΠ²Π½ΠΈΠΎΡ ΠΏΡΠΎΡΠΎΠΊ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π΅ Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠΈ Π½Π°ΡΠ΅Π΄Π΅Π½. ΠΠ²Π° ΡΠ΅ Π½ΠΈ Π΄Π°Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌΠ΅ ΡΠ°ΠΌΠΎ ΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΌΠΈΠ½ΡΡΠ°. ΠΠΎ ΠΏΡΠ°ΠΊΡΠ°, Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅ Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΡΠ΅ ΠΈ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΌΠΈΠ½ΡΡΠΈ Π²ΠΎ ΡΠ»ΡΡΠ°Ρ Π½Π΅ΠΊΠΎΠΈ Π°ΠΆΡΡΠΈΡΠ°ΡΠ° Π΄Π° Π΄ΠΎΡΠ½Π°Ρ. ΠΠ° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΡΡ, Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ.
Π€ΡΠ½ΠΊΡΠΈΠΈ Π½Π° Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ°
ΠΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ° ΡΠ΅ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ ΠΏΠΎΠ΄ΠΎΠ»Ρ. ΠΠ΅Π΄ΠΎΠ² ΡΡΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ Π½ΠΈΠ² Π·Π° Π΄Π° Π³ΠΎ Π·Π³ΠΎΠ»Π΅ΠΌΠ°ΠΌ ΠΎΠΏΡΠΎΠ²Π°ΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°:
- Π²ΠΈΡΠΎΠΊΠ° β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΡΠ΅Π½Π° β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΠ°.
- Π½ΠΈΡΠΊΠ° β ΠΌΠΈΠ½ ΡΠ΅Π½Π° β ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΠ°.
- ΠΏΡΠ²Π° Π¦Π΅Π½Π° β ΠΏΡΠ²Π° ΡΠ΅Π½Π° β ΠΏΡΠ²Π° ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΠ°.
- lastPrice β ΠΏΠΎΡΠ»Π΅Π΄Π½Π° ΡΠ΅Π½Π° β ΠΏΠΎΡΠ»Π΅Π΄Π½Π° ΡΠ΅Π½Π° Π·Π° ΠΌΠΈΠ½ΡΡΠ°.
- firstSize β ΠΏΡΠ²Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° β ΠΏΡΠ²Π° ΡΡΠ³ΠΎΠ²ΡΠΊΠ° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ°.
- lastSize β ΠΏΠΎΡΠ»Π΅Π΄Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° β ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° ΡΡΠ³ΡΠ²Π°ΡΠ΅ Π·Π° Π΅Π΄Π½Π° ΠΌΠΈΠ½ΡΡΠ°.
- numTrades β Π±ΡΠΎΠΈ i β Π±ΡΠΎΡ Π½Π° Π·Π°Π½Π°Π΅ΡΠΈ Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ°.
- Π²ΠΎΠ»ΡΠΌΠ΅Π½ β Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° ΡΡΠΌΠ° β Π·Π±ΠΈΡ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½ΠΈ Π½Π° ΡΡΠ³ΠΎΠ²ΠΈΡΠ° Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ°.
- pvolume β ΡΡΠΌΠ° ΡΠ΅Π½Π° β Π·Π±ΠΈΡ Π½Π° ΡΠ΅Π½ΠΈ Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ°, ΠΏΠΎΡΡΠ΅Π±Π½Π° Π·Π° avgPrice.
- β ΡΡΠΌΠ° ΠΏΡΠΎΠΌΠ΅Ρ ΡΠ΅Π½Π°*Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° β Π²ΠΊΡΠΏΠ΅Π½ ΠΎΠ±Π΅ΠΌ Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ°.
- avgPrice β pvolume%numTrades β ΠΏΡΠΎΡΠ΅ΡΠ½Π° ΡΠ΅Π½Π° ΠΏΠΎ ΠΌΠΈΠ½ΡΡΠ°.
- avgSize β Π²ΠΎΠ»ΡΠΌΠ΅Π½%numTrades β ΠΏΡΠΎΡΠ΅ΡΠ½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° ΡΡΠ³ΡΠ²Π°ΡΠ΅ Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ°.
- vwap β ΠΏΡΠΎΠΌΠ΅Ρ%Π²ΠΎΠ»ΡΠΌΠ΅Π½ β ΠΏΡΠΎΡΠ΅ΡΠ½Π° ΡΠ΅Π½Π° Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ° ΠΏΠΎΠ½Π΄Π΅ΡΠΈΡΠ°Π½Π° ΡΠΏΠΎΡΠ΅Π΄ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ°.
- cumVolume β ΡΡΠΌΠ° Π²ΠΎΠ»ΡΠΌΠ΅Π½ β Π°ΠΊΡΠΌΡΠ»ΠΈΡΠ°Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ Π²ΠΎ ΡΠ΅ΠΊΠΎΡ Π½Π° ΡΠ΅Π»ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΡΠ΄Π΅ Π²Π΅Π΄Π½Π°Ρ Π΄Π° ΡΠ°Π·Π³ΠΎΠ²Π°ΡΠ°ΠΌΠ΅ Π·Π° Π΅Π΄Π½Π° Π½Π΅ΠΎΡΠΈΠ³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° - ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π°Ρ ΠΎΠ²ΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π·Π° ΠΏΡΠ² ΠΏΠ°Ρ ΠΈ Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΡΠ»Π΅Π΄Π½Π° ΠΌΠΈΠ½ΡΡΠ°. ΠΠ΅ΠΊΠΎΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΠΎΠ΄ ΡΠΈΠΏΠΎΡ firstPrice ΠΌΠΎΡΠ° Π΄Π° ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π°Ρ Π·Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ Π½ΡΠ»Π° ΡΠ΅ΠΊΠΎΡ ΠΏΠ°Ρ; Π½ΠΈΠ²Π½Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π΅ Π½Π΅Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π°. ΠΡΡΠ³ΠΈΡΠ΅ ΡΠΈΠΏΠΎΠ²ΠΈ ΡΠ°ΡΠΈΠ½Π° ΠΌΠΎΡΠ° ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π΄Π° Π±ΠΈΠ΄Π°Ρ ΠΏΠΎΡΡΠ°Π²Π΅Π½ΠΈ Π½Π° 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 ΠΈ Π²ΡΠ΅ΠΌΠ΅ Π²ΠΎ ΡΠ΅ΡΠ½ΠΈΠΊΠΎΡ Π·Π° ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΡΡ, ΡΠ΅Π³Π° initWith Π΅ Π³ΠΎΡΠΎΠ²Π° Π»ΠΈΠ½ΠΈΡΠ° ΠΎΠ΄ ΠΊΠΎΠ½Π΅ΡΠ½Π°ΡΠ° Π·Π±ΠΈΡΠ½Π° ΡΠ°Π±Π΅Π»Π°, ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΠΎΡΡΠ°Π½ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Π°Ρ ΡΠΎΡΠ½ΠΈΠΎΡ ΡΠΈΠΌΠ±ΠΎΠ» ΠΈ Π²ΡΠ΅ΠΌΠ΅. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π·Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π½ΠΎΠ²ΠΈ ΡΠ΅Π΄ΠΎΠ²ΠΈ Π½Π° ΡΠ°Π±Π΅Π»Π°ΡΠ°.
ΠΠ΅ Π½ΠΈ ΡΡΠ΅Π±Π°Π°Ρ aggCols ΠΊΠΎΠ³Π° ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ° Π·Π° Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ°. Π‘ΠΏΠΈΡΠΎΠΊΠΎΡ ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ΠΎΡ ΠΏΠΎ ΠΊΠΎΡ ΡΠ΅ ΠΎΡΠ΅Π½ΡΠ²Π°Π°Ρ ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ Π²ΠΎ Q (ΠΎΠ΄ Π΄Π΅ΡΠ½ΠΎ ΠΊΠΎΠ½ Π»Π΅Π²ΠΎ). Π¦Π΅Π»ΡΠ° Π΅ Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ Π΄Π΅ΠΊΠ° ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠ°ΡΠ° ΠΎΠ΄ΠΈ ΠΎΠ΄ Π²ΠΈΡΠΎΠΊ Π΄ΠΎ cumVolume, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π½Π΅ΠΊΠΎΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π·Π°Π²ΠΈΡΠ°Ρ ΠΎΠ΄ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΈΡΠ΅.
ΠΠΎΠ»ΠΎΠ½ΠΈ ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°Π°Ρ Π²ΠΎ Π½ΠΎΠ²Π° ΠΌΠΈΠ½ΡΡΠ° ΠΎΠ΄ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½Π°ΡΠ°, Π·Π° ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΡΡ ΡΠ΅ Π΄ΠΎΠ΄Π°Π²Π° ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° sym:
rollColumns:`sym`cumVolume;
Π‘Π΅Π³Π° Π΄Π° Π³ΠΈ ΠΏΠΎΠ΄Π΅Π»ΠΈΠΌΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈΡΠ΅ Π²ΠΎ Π³ΡΡΠΏΠΈ ΡΠΏΠΎΡΠ΅Π΄ ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ°Π°Ρ. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΡΠ²Π°Π°Ρ ΡΡΠΈ Π²ΠΈΠ΄Π°:
- ΠΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΈ (Π²ΠΎΠ»ΡΠΌΠ΅Π½, ΠΏΡΠΎΠΌΠ΅Ρ,..) β ΠΌΠΎΡΠ° Π΄Π° ΡΠ° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ Π΄ΠΎΡΠ΄ΠΎΠ²Π½Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π½Π° ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½Π°ΡΠ°.
- Π‘ΠΎ ΠΏΠΎΡΠ΅Π±Π½Π° ΡΠΎΡΠΊΠ° (Π²ΠΈΡΠΎΠΊΠ°, Π½ΠΈΡΠΊΠ°, ..) β ΠΏΡΠ²Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ° ΡΠ΅ Π·Π΅ΠΌΠ° ΠΎΠ΄ Π΄ΠΎΡΠ΄ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π° ΠΎΡΡΠ°Π½Π°ΡΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°Π°Ρ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ°.
- ΠΠ΄ΠΌΠΎΡ. Π‘Π΅ΠΊΠΎΠ³Π°Ρ ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π° ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°.
ΠΡΠ΄Π΅ Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° ΠΎΠ²ΠΈΠ΅ ΠΊΠ»Π°ΡΠΈ:
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]
ΠΠ΅ΠΌΠ° Π΄Π° Π³ΠΎ ΠΎΠΏΠΈΡΠ°ΠΌ Π΄Π΅ΡΠ°Π»Π½ΠΎ ΡΠΎΡΠΌΠ°ΡΠΎΡ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅; Π²ΠΎ Π½Π°ΡΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΠ°ΠΌΠΎ ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ ΡΠΎ ΠΈ ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ Π½Π΅ΡΡΠΈΠ²ΠΈΡΠ°Π»Π½ΠΈ ΠΈ ΡΠΈΠ΅ ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ ΡΠ΅ΡΠ½ΠΈΡΠΈ Π½Π° ΡΠΎΡΠΌΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ!ΠΈΠ·ΡΠ°Π·ΠΈ. Π’Π°ΠΊΠ°, ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π·Π° ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΠΎΠ² Π½Π°ΡΠΈΠ½:
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];
ΠΠ° ΡΠ°ΡΠ½ΠΎΡΡ, ΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅Π² ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π·Π° Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠΎΡΠ° ΠΏΡΠ΅ΡΠ²ΠΎΡΠ° Π½ΠΈΠ·Π° ΡΠΎ ΠΈΠ·ΡΠ°Π· Q Π²ΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° eval ΠΈ ΠΊΠΎΡΠ° Π΅ ΠΏΠΎΡΡΠ΅Π±Π½Π° Π²ΠΎ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅. ΠΡΡΠΎ ΡΠ°ΠΊΠ°, Π·Π°Π±Π΅Π»Π΅ΠΆΠ΅ΡΠ΅ Π΄Π΅ΠΊΠ° ΠΏΡΠ΅Π΄ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ ΠΊΠ°ΠΊΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ° (Ρ.Π΅. ΡΡΠ½ΠΊΡΠΈΡΠ° ΡΠΎ Π΄Π΅Π»ΡΠΌΠ½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ) Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅, Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠ²Π° Π΅Π΄Π΅Π½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ (ΡΠ°Π±Π΅Π»Π°ΡΠ°). ΠΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ΅ ΠΏΡΠ΅ΡΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π±Π΅Π»Π°, ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ°Π½Π° ΡΠ°Π±Π΅Π»Π°.
ΠΡΠΎΡΠ°ΡΠ° ΡΠ°Π·Π° Π΅ Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Π·Π±ΠΈΡΠ½Π°ΡΠ° ΡΠ°Π±Π΅Π»Π°. ΠΡΠ΄Π΅ ΠΏΡΠ²ΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΠΈΡΠ΅ΠΌΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΡ Π²ΠΎ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄:
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, Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΌΠ°ΠΏ/Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΡΠ΅ Π½Π°ΠΌΠ΅ΡΡΠΎ ΡΠΈΠΊΠ»ΡΡΠΈ. ΠΠΎ, Π±ΠΈΠ΄Π΅ΡΡΠΈ 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;β¦)];
ΠΠ° ΠΆΠ°Π», Π·Π° Π΄Π° Π΄ΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π±Π΅Π»Π° ΠΏΠΎΡΡΠ΅Π±Π½Π° Π²ΠΈ Π΅ Π»ΠΈΡΡΠ° Π½Π° ΡΠ΅Π΄ΠΎΠ²ΠΈ, Π° Π½Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΈ ΠΌΠΎΡΠ° Π΄Π° ΡΠ° ΠΏΡΠ΅ΡΡΠ»ΠΈΡΠ΅ ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° (ΡΠΏΠΈΡΠΎΠΊ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π²ΠΎ ΡΠΏΠΈΡΠΎΠΊ ΡΠΎ ΡΠ΅Π΄ΠΎΠ²ΠΈ) ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° ΠΏΡΠ΅Π²ΡΡΡΠ²Π°ΡΠ΅. ΠΠ²Π° Π΅ ΡΠΊΠ°ΠΏΠΎ Π·Π° Π³ΠΎΠ»Π΅ΠΌΠ° ΡΠ°Π±Π΅Π»Π°, ΠΏΠ° Π½Π°ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ°, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ²Π°ΠΌΠ΅ Π³Π΅Π½Π΅ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π·Π°Π΄Π°ΡΠ° Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΊΠΎΠ»ΠΎΠ½Π° ΠΏΠΎΡΠ΅Π±Π½ΠΎ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π·Π° ΠΌΠ°ΠΏΠ° (ΠΊΠΎΡΠ° ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ Π°ΠΏΠΎΡΡΡΠΎΡ):
.[aggTable;;:;]'[(idx;)each aggCols; (row[`high] | inputTable`high;row[`volume] + inputTable`volume;β¦)];
ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°. ΠΡΡΠΎ ΡΠ°ΠΊΠ°, Π·Π°Π±Π΅Π»Π΅ΠΆΠ΅ΡΠ΅ Π΄Π΅ΠΊΠ° Π²ΠΎ Q, ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ΡΠΎ Π»ΠΈΡΡΠ° Π΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡΠ° ΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ° ΠΏΠΎΠ²ΠΈΠΊΠ°ΠΌΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° every(map) Π·Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Π»ΠΈΡΡΠ° Π½Π° ΡΠΏΠΈΡΠΎΡΠΈ.
ΠΠ° Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠ°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ°Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π½Π΅ Π΅ ΡΠΈΠΊΡΠΈΡΠ°Π½ΠΎ, Π΄ΠΈΠ½Π°ΠΌΠΈΡΠΊΠΈ ΡΠ΅ Π³ΠΎ ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π³ΠΎΡΠ΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ ΠΈΠ·ΡΠ°Π·. ΠΡΠ΄Π΅ ΠΏΡΠ²ΠΎ Π΄Π° Π³ΠΈ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π·Π° ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΊΠΎΠ»ΠΎΠ½Π°, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΡΠ΅Π΄ ΠΈ 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");
ΠΠ΅ΠΊΠΎΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΡΠ΅ ΠΏΠΎΡΠ΅Π±Π½ΠΈ; Π½ΠΈΠ²Π½Π°ΡΠ° ΠΏΡΠ²Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π½Π΅ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π° ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ°. ΠΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΎΠ΄ΡΠ΅Π΄ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π΅ ΠΏΡΠ² ΠΏΠΎ ΡΠ΅Π΄ΠΎΡ [`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];
ΠΠ²Π΄Π΅ ΠΏΠΎΠ²ΠΈΠΊΠ°Π² Π³Π΅Π½Π΅ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π·Π°Π΄Π°ΡΠ° ΡΠΎ ΠΌΠΎΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ° (ΠΈΠ·ΡΠ°Π· Π²ΠΎ ΠΊΠ°Π΄ΡΠ°Π²ΠΈ Π·Π°Π³ΡΠ°Π΄ΠΈ). ΠΠ° Π΄ΠΎΠ±ΠΈΠ²Π° ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ (ΠΏΡΠ²ΠΈΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ) ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡ Π³ΠΎ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΠΌ Π²ΠΎ ΡΠ΅ΡΠ²ΡΡΠΈΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°Ρ.
ΠΡΠ΄Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ Π·Π²ΡΡΠ½ΠΈΡΠΈ Π·Π° Π±Π°ΡΠ΅ΡΠΈΠΈ ΠΏΠΎΡΠ΅Π±Π½ΠΎ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π΅ ΠΈΡΡΠ° Π·Π° Π½ΠΈΠ²:
// 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 ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ΠΎΡ Π½Π° ΠΎΡΠ΅Π½ΡΠ²Π°ΡΠ΅ Π΅ ΠΎΠ΄ Π΄Π΅ΡΠ½ΠΎ ΠΊΠΎΠ½ Π»Π΅Π²ΠΎ.
Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π΅ Π³Π»Π°Π²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΈ Π·Π° ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈ, ΡΠ°ΠΌΠΎ ΡΡΠ΅Π±Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ ΠΌΠ°Π»ΠΊΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΈ ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π°.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈ ΡΠ΅ΠΊΠΎΡΠΈ
ΠΠΌΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΏΡΠ΅ΡΠΏΡΠΎΡΠ΅ΡΠΈΡΠ°ΡΠ΅ ΠΈ Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Agg ΠΊΠΎΠΈ ΡΠ° Π²ΡΡΠ°Ρ ΡΠ΅Π»Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ°. ΠΠΎ, ΡΠ΅ΠΏΠ°ΠΊ Π΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½Π° ΡΡΠ°Π½Π·ΠΈΡΠΈΡΠ° Π½ΠΈΠ· ΠΌΠΈΠ½ΡΡΠΈ ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ°Π°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ Π·Π° Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ°. ΠΡΠ΅Π΄ ΡΓ¨, Π΄Π° ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° ΠΈΠ½ΠΈΡΠΈΡΠ°ΡΠ΅:
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:{[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 ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ ΡΠ΅Π΄ΠΎΠ²ΠΈ Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ°) Π΅ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π³ΠΎΠ»Π΅ΠΌ; Π²ΠΎ ΡΠ°ΠΊΠ²ΠΈ ΡΠ»ΡΡΠ°ΠΈ, Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π»Π°Π½ΡΠΈΡΠ°Π°Ρ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΊΠ»ΠΎΠ½ΠΎΠ²ΠΈ (ΠΈΠ»ΠΈ Π΄ΡΡΠΈ ΠΈ Π΄Π΅ΡΠ΅ΡΠΈΡΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²ΠΈ) Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°, ΠΎΠ΄ ΠΊΠΎΠΈ ΡΠ΅ΠΊΠΎΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠ²Π° ΡΠ°ΠΌΠΎ Π΄Π΅Π» ΠΎΠ΄ Π»ΠΈΠΊΠΎΠ²ΠΈΡΠ΅. Π‘Π΅ΠΏΠ°ΠΊ, ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ Π΅ ΠΈΠΌΠΏΡΠ΅ΡΠΈΠ²Π΅Π½ Π·Π° ΡΠΎΠ»ΠΊΡΠ²Π°Π½ΠΈΠΎΡ ΡΠ°Π·ΠΈΠΊ ΠΊΠΎΡ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ° ΠΏΡΠ²Π΅Π½ΡΡΠ²Π΅Π½ΠΎ Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ ΠΏΡΠ°ΡΠ°ΡΠ΅ΡΠΎ Π·ΠΎΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΡΠ°ΡΡΠ΅ Π½Π΅Π»ΠΈΠ½Π΅Π°ΡΠ½ΠΎ ΡΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ΅ΠΊΠΎΠ΅ Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅. ΠΡΠΈΡΠΈΠ½Π°ΡΠ° Π΅ ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° shrink Π΅ Π²ΡΡΡΠ½ΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΡΠ° C, ΡΡΠΎ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ΅ΡΠΈΠΊΠ°ΡΠ½Π° ΠΎΠ΄ updateAgg. ΠΠΎΡΠ½ΡΠ²Π°ΡΡΠΈ ΠΎΠ΄ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π° Π½Π° Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ (ΠΎΠΊΠΎΠ»Ρ 10.000), updateAgg Π³ΠΎ Π΄ΠΎΡΡΠΈΠ³Π½ΡΠ²Π° ΡΠ²ΠΎΡΠΎΡ ΠΏΠ»Π°ΡΠΎΠ½ ΠΈ ΡΠΎΠ³Π°Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π΅ Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ΡΠΎ. ΠΠΎΡΠ°Π΄ΠΈ ΠΏΡΠ΅Π»ΠΈΠΌΠΈΠ½Π°ΡΠ½ΠΈΠΎΡ ΡΠ΅ΠΊΠΎΡ Q ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ ΡΠ²Π°ΡΠΈ ΡΠ°ΠΊΠ²ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΈΡΠΈΠ½ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ²Π° Π½Π°Π³Π»Π°ΡΡΠ²Π° ΠΊΠΎΠ»ΠΊΡ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅ΡΠ΅ Π²ΠΈΡΡΠΈΠ½ΡΠΊΠΈΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌ ΠΊΠΎΠ³Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΡΡΠ³Π° ΡΠΎΡΠΊΠ° Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ°. ΠΠΎΠΊΠΎΠ»ΠΊΡ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π½Π΅ Π±Π΅Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ Π±Π΅Π° Π½Π°ΡΠ°ΡΠ°Π½ΠΈ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΠΎΠ³Π°Ρ ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌΠ΅ ΡΠΎ ΡΠ°ΠΊΠ²ΠΎ Π½Π΅ΡΡΠΎ ΠΊΠ°ΠΊΠΎ ΠΏΡΠΎΠΌΠ°ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠ΅ΡΠΎΡ Π½Π° TLB - ΠΎΡΡΡΡΡΠ²ΠΎ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠΊΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π²ΠΎ ΠΊΠ΅ΡΠΎΡ Π·Π° Π°Π΄ΡΠ΅ΡΠΈ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΎΡ. ΠΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π°Π΄ΡΠ΅ΡΠ° ΡΡΠ°Π΅ ΠΎΠΊΠΎΠ»Ρ 30 ΠΏΠ°ΡΠΈ ΠΏΠΎΠ΄ΠΎΠ»Π³ΠΎ Π°ΠΊΠΎ Π΅ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ, Π° Π°ΠΊΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΡΠ΅ ΡΠ°ΡΡΡΠ»Π°Π½ΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ° Π·Π°Π±Π°Π²ΠΈ ΡΡΠ»ΡΠ³Π°ΡΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΠ°ΡΠΈ.
ΠΠ°ΠΊΠ»ΡΡΠΎΠΊ
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ°, ΠΏΠΎΠΊΠ°ΠΆΠ°Π² Π΄Π΅ΠΊΠ° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ KDB+ ΠΈ Q ΡΠ΅ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ Π»Π΅ΡΠ΅Π½ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π½ΠΈΠ² ΠΏΡΠ΅ΠΊΡ ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅, ΡΡΠΊΡ ΠΈ Π·Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΊΠΎΠΈ ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΈ Π΄Π° ΡΠ²Π°ΡΠ°Ρ ΡΡΠΎΡΠΈΡΠΈ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ ΡΠ΅Π΄ΠΎΠ²ΠΈ/Π³ΠΈΠ³Π°Π±Π°ΡΡΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π΄ΡΡΠΈ ΠΈ Π²ΠΎ Π΅Π΄Π΅Π½ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ Q ΠΏΡΠΎΡΠ΅Ρ. Π‘Π°ΠΌΠΈΠΎΡ ΡΠ°Π·ΠΈΠΊ Q ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ·Π½Π° ΠΈ Π΅ΡΠΈΠΊΠ°ΡΠ½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΡΠ°Π΄ΠΈ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° Π²Π΅ΠΊΡΠΎΡΡΠΊΠ° ΠΏΡΠΈΡΠΎΠ΄Π°, Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΠΎΡ SQL Π΄ΠΈΡΠ°Π»Π΅ΠΊΡ ΠΏΡΠ΅Π²Π΅Π΄ΡΠ²Π°Ρ ΠΈ ΠΌΠ½ΠΎΠ³Ρ ΡΡΠΏΠ΅ΡΠ΅Π½ ΡΠ΅Ρ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°ΠΌ Π΄Π΅ΠΊΠ° Π³ΠΎΡΠ΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΡΠΎ Π΅ ΡΠ°ΠΌΠΎ Π΄Π΅Π» ΠΎΠ΄ ΠΎΠ½Π° ΡΡΠΎ Q ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈ, ΠΈΠΌΠ° ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠ½ΠΈΠΊΠ°ΡΠ½ΠΈ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ IPC ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΊΠΎΡ ΡΠ° Π±ΡΠΈΡΠ΅ Π³ΡΠ°Π½ΠΈΡΠ°ΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΈ Q ΠΈ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΡΡΠΎΡΠΈΡΠΈ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΈ Π²ΠΎ Π΅Π΄Π½Π° ΠΌΡΠ΅ΠΆΠ°, ΠΊΠΎΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΎΡΠ° Π½Π° Π΄Π΅ΡΠ΅ΡΠΈΡΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΈ Π²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈ Π½Π° ΡΠ²Π΅ΡΠΎΡ.
ΠΠ·Π²ΠΎΡ: www.habr.com