ΠΠ° ΡΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Π±Π°Π·Π° KDB+, Π΅Π·ΠΈΠΊΡΡ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Q, ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ° ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈΡΠ΅ ΠΈΠΌ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ Π² ΠΌΠΎΡΡΠ° ΠΏΡΠ΅Π΄ΠΈΡΠ½Π° ΠΈ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ Π²ΡΠ² Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ. Π ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½Π° Q ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π²Ρ ΠΎΠ΄ΡΡ ΠΏΠΎΡΠΎΠΊ ΠΎΡ Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΠΏΠΎΠΌΠΈΠ½ΡΡΠ½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°Π³ΡΠ΅Π³ΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° 'ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅' (Ρ.Π΅. ΡΠ΅ ΡΡΠΏΡΠ²Π° Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈ Π²ΡΠΈΡΠΊΠΎ ΠΏΡΠ΅Π΄ΠΈ ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΠΏΠΎΡΡΠΈΡ Π΄Π°Π½Π½ΠΈ). ΠΠ»Π°Π²Π½Π°ΡΠ° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° Q Π΅, ΡΠ΅ ΡΠΎΠ²Π° Π΅ Π²Π΅ΠΊΡΠΎΡΠ΅Π½ Π΅Π·ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΎΠΏΠ΅ΡΠΈΡΠ°ΠΌΠ΅ Π½Π΅ Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ, Π° Ρ ΠΌΠ°ΡΠΈΠ²ΠΈ, ΠΌΠ°ΡΠΈΠ²ΠΈ ΠΎΡ ΠΌΠ°ΡΠΈΠ²ΠΈ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΡΠ°Π²Π½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ. ΠΠΎΠ΄ΠΎΠ±Π½ΠΈ Π΅Π·ΠΈΡΠΈ ΠΊΠ°ΡΠΎ Q ΠΈ ΡΡΠΎΠ΄Π½ΠΈΡΠ΅ ΠΌΡ K, J, APL ΡΠ° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΡΡΡ ΡΠ²ΠΎΡΡΠ° ΠΊΡΠ°ΡΠΊΠΎΡΡ. Π§Π΅ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, Π·Π°Π΅ΠΌΠ°ΡΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΅ΠΊΡΠ°Π½Π° ΠΊΠΎΠ΄ Π½Π° ΠΏΠΎΠ·Π½Π°Ρ Π΅Π·ΠΈΠΊ ΠΊΠ°ΡΠΎ Java, ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° ΡΡΡ ΡΠ°ΠΌΠΎ Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π΄Π°. Π’ΠΎΡΠ½ΠΎ ΡΠΎΠ²Π° ΠΈΡΠΊΠ°ΠΌ Π΄Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°ΠΌ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ.

ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
KDB+ Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΎΡΠ½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°Π½Π° ΠΊΡΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π½Π°ΡΠΈΠ½ (ΠΏΡΠ΅Π΄ΠΈ Π²ΡΠΈΡΠΊΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅). Π’Ρ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π² ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΠΈΡΠ΅ ΠΈΠ½ΡΡΠΈΡΡΡΠΈΠΈ β Π±Π°Π½ΠΊΠΈ, ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΈΠΎΠ½Π½ΠΈ ΡΠΎΠ½Π΄ΠΎΠ²Π΅, Π·Π°ΡΡΡΠ°Ρ ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΠ·ΠΈΠΊΡΡ Q Π΅ Π²ΡΡΡΠ΅ΡΠ½ΠΈΡΡ Π΅Π·ΠΈΠΊ Π½Π° KDB+, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ. ΠΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° Π½Π° Q Π΅ ΠΊΡΠ°ΡΠΊΠΎΡΡ ΠΈ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ, ΠΊΠ°ΡΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌΠΎΡΡΡΠ° ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΠ΅ ΠΆΠ΅ΡΡΠ²Π°. Π’ΠΎΠ²Π° ΡΠ΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π²Π° Ρ ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π²Π΅ΠΊΡΠΎΡΠ½ΠΈΡΡ Π΅Π·ΠΈΠΊ ΡΠ°ΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ»ΠΎΠΆΠ΅Π½ Π·Π° Π²ΡΠ·ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅, Π° ΠΊΡΠ°ΡΠΊΠΎΡΡΡΠ° ΠΈ Π½Π°ΡΠΈΡΠ΅Π½ΠΎΡΡΡΠ° Π½Π° Π·Π°ΠΏΠΈΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Π½Π° Π΅Π΄ΠΈΠ½ Π΅ΠΊΡΠ°Π½ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΡΠ°ΡΡ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΊΠΎΠ΅ΡΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΠ»Π΅ΡΠ½ΡΠ²Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΉ.
Π ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π½Π° Q ΠΈ Π²ΠΈΠ΅, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΠ΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Ρ ΠΈΠ·ΠΏΡΠΎΠ±Π²Π°ΡΠ΅ Π½Π° Π΄Π΅Π»ΠΎ. ΠΠ° ΡΠΎΠ²Π° ΡΠ΅ Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΡΠ°ΠΌΠΈΡΡ Q. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈΡΠ΅ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½Π°ΡΠ° 32-Π±ΠΈΡΠ½Π° Π²Π΅ΡΡΠΈΡ ΠΎΡ ΡΠ°ΠΉΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° kx β . Π’Π°ΠΌ ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠΏΡΠ°Π²ΠΎΡΠ½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ Q, ΠΊΠ½ΠΈΠ³Π°ΡΠ° ΠΈ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΠ΅ ΠΎΡ ΡΡΠ°ΡΠΈΠΈ Π½Π° ΡΠ°Π·ΠΈ ΡΠ΅ΠΌΠ°.
Π€ΠΎΡΠΌΡΠ»ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°
ΠΠΌΠ° ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π΄Π°Π½Π½ΠΈ Π½Π° Π²ΡΠ΅ΠΊΠΈ 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: ΡΠ΅Π΄ΠΎΠ² ΠΈΠ½Π΄Π΅ΠΊΡ Π² Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π·Π° 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]; // ΡΡΠ·Π΄Π°Π²ame ΠΏΡΠ°Π·Π½Π° ΡΠΈΠΏΠΈΠ·ΠΈΡΠ°Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°, 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; // ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° & ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ
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
