ΠΠ° ΡΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π±Π°Π·Π°ΡΠ° 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,β¦), ΡΠ΅Π½Π° (ΡΠ΅Π½Π°ΡΠ°, ΠΏΠΎ ΠΊΠΎΡΡΠΎ ΡΠ° ΠΊΡΠΏΠ΅Π½ΠΈ Π°ΠΊΡΠΈΠΈΡΠ΅), ΡΠ°Π·ΠΌΠ΅Ρ (ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ°). ΠΠ½ΡΠ΅ΡΠ²Π°Π» ΠΎΡ 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 ("ΠΌΠ°ΠΊΡ. ΡΠ΅Π½Π°";"ΠΌΠΈΠ½. ΡΠ΅Π½Π°";"ΠΏΡΡΠ²Π° ΡΠ΅Π½Π°";"ΠΏΠΎΡΠ»Π΅Π΄Π½Π° ΡΠ΅Π½Π°";"ΠΏΡΡΠ²ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ";"ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΡΠ°Π·ΠΌΠ΅Ρ";"Π±ΡΠΎΡ i";"ΡΡΠΌΠ° ΡΠ°Π·ΠΌΠ΅Ρ";"ΡΡΠΌΠ° ΡΠ΅Π½Π°";"ΡΡΠΌΠ° ΡΠ΅Π½Π°*ΡΠ°Π·ΠΌΠ΅Ρ"); // each Π΅ ΡΡΠ½ΠΊΡΠΈΡ map Π² Q Π·Π° Π΅Π΄ΠΈΠ½ ΡΠΏΠΈΡΡΠΊ
preprocess:?[;();`sym`time!`sym`time.minute;selExpression];
ΠΠ° Π΄Π° Π±ΡΠ΄Π΅ ΡΡΠ½ΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ parse, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π° ΡΡΡΠΈΠ½Π³ Ρ Q ΠΈΠ·ΡΠ°Π· Π² ΡΡΠΎΠΉΠ½ΠΎΡΡ, ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ΄Π°Π΄Π΅Π½Π° Π½Π° ΡΡΠ½ΠΊΡΠΈΡ eval ΠΈ ΠΊΠΎΡΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΡΠ΅Π»Π΅ΠΊΡ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΎΡΠ±Π΅Π»ΡΠ·Π²Π°ΠΌΠ΅, ΡΠ΅ preprocess Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ΠΎ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ (Ρ.Π΅. ΡΡΠ½ΠΊΡΠΈΡ Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ) Π½Π° ΡΡΠ½ΠΊΡΠΈΡ select, Π΅Π΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ (ΡΠ°Π±Π»ΠΈΡΠ°) Π΅ ΠΎΡΡΡΡΡΠ²Π°Ρ. ΠΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ 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[tmcurrTime; 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
