ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π±Π°Π·Π°ΡΠ° KDB+, Π΅Π·ΠΈΠΊΡΡ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Q, ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ° ΡΠ΅Ρ
Π½ΠΈΡΠ΅ ΡΠΈΠ»Π½ΠΈ ΠΈ ΡΠ»Π°Π±ΠΈ ΡΡΡΠ°Π½ΠΈ Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ ΠΌΠΈ
Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
KDB+ Π΅ ΠΊΠΎΠ»ΠΎΠ½Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΡΠΎΠΊΡΡΠΈΡΠ°Π½Π° Π²ΡΡΡ Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΏΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½ (ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅). ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΠ½ΠΎ Π²ΡΠ² ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΠΈ ΠΈΠ½ΡΡΠΈΡΡΡΠΈΠΈ β Π±Π°Π½ΠΊΠΈ, ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΈΠΎΠ½Π½ΠΈ ΡΠΎΠ½Π΄ΠΎΠ²Π΅, Π·Π°ΡΡΡΠ°Ρ ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΠ·ΠΈΠΊΡΡ Q Π΅ Π²ΡΡΡΠ΅ΡΠ½ΠΈΡΡ Π΅Π·ΠΈΠΊ Π½Π° KDB+, ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Ρ ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ. ΠΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° Π½Π° Q Π΅ ΠΊΡΠ°ΡΠΊΠΎΡΡ ΠΈ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠ½ΠΎΡΠ°ΡΠ° Π΅ ΠΆΠ΅ΡΡΠ²Π°Π½Π°. Π’ΠΎΠ²Π° Π΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ ΠΎΡ ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π²Π΅ΠΊΡΠΎΡΠ½ΠΈΡΡ Π΅Π·ΠΈΠΊ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΡΠ΄Π΅Π½ Π·Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, Π° ΠΊΡΠ°ΡΠΊΠΎΡΡΡΠ° ΠΈ Π±ΠΎΠ³Π°ΡΡΡΠ²ΠΎΡΠΎ Π½Π° Π·Π°ΠΏΠΈΡΠ° Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΡΠ°ΡΡ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π½Π° Π΅Π΄ΠΈΠ½ Π΅ΠΊΡΠ°Π½, ΠΊΠΎΠ΅ΡΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° Ρ ΠΏΡΠ°Π²ΠΈ ΠΏΠΎ-Π»Π΅ΡΠ½Π° Π·Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Π²Π½Π΅Π΄ΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½Π° Q ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Ρ ΠΈΠ·ΠΏΡΠΎΠ±Π²Π°ΡΠ΅. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΠ΅ Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ ΡΠ°ΠΌΠΈΡΡ Q. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈΡΠ΅ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½Π°ΡΠ° 32-Π±ΠΈΡΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ ΠΎΡ ΡΠ΅Π±ΡΠ°ΠΉΡΠ° Π½Π° kx company -
ΠΡΠΎΠ±Π»Π΅ΠΌ ΠΈΠ·ΡΠ²Π»Π΅Π½ΠΈΠ΅
ΠΠΌΠ° ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π΄Π°Π½Π½ΠΈ Π½Π° Π²ΡΠ΅ΠΊΠΈ 25 ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ KDB+ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΡΠ΅Π΄ΠΈΠΌΠ½ΠΎ Π²ΡΠ² ΡΠΈΠ½Π°Π½ΡΠΈΡΠ΅, ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ ΡΠΎΠ²Π° Π΅ ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ (ΡΠ΄Π΅Π»ΠΊΠΈ), ΠΊΠΎΡΡΠΎ ΠΈΠΌΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ: Π²ΡΠ΅ΠΌΠ΅ (Π²ΡΠ΅ΠΌΠ΅ Π² ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ), ΡΠΈΠΌ (ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° Π½Π° Π±ΠΎΡΡΠ°ΡΠ° - IBM, AAPL,β¦), ΡΠ΅Π½Π° (ΡΠ΅Π½Π°ΡΠ°, Π½Π° ΠΊΠΎΡΡΠΎ ΡΠ° Π·Π°ΠΊΡΠΏΠ΅Π½ΠΈ Π°ΠΊΡΠΈΠΈΡΠ΅), ΡΠ°Π·ΠΌΠ΅Ρ (ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ°). ΠΠ½ΡΠ΅ΡΠ²Π°Π»ΡΡ ΠΎΡ 25 ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½, Π½Π΅ Π΅ ΡΠ²ΡΡΠ΄Π΅ ΠΌΠ°Π»ΡΠΊ ΠΈ Π½Π΅ Π΅ ΡΠ²ΡΡΠ΄Π΅ Π΄ΡΠ»ΡΠ³. ΠΠ΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΏΡΠΈΡΡΡΡΠ²ΠΈΠ΅ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΈΠ΄Π²Π°Ρ Π² ΡΡΠ»ΡΠ³Π°ΡΠ° Π²Π΅ΡΠ΅ Π±ΡΡΠ΅ΡΠΈΡΠ°Π½ΠΈ. ΠΠΈ Π±ΠΈΠ»ΠΎ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈ Π±ΡΡΠ΅ΡΠΈΡΠ°Π½Π΅ ΠΎΡ ΡΡΡΠ°Π½Π° Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ Π±ΡΡΠ΅ΡΠΈΡΠ°Π½Π΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΠ΅ΠΊΡΡΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅, Π½ΠΎ Π·Π° ΠΏΡΠΎΡΡΠΎΡΠ° ΡΠ΅ ΡΠ΅ ΡΡΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠΌ Π²ΡΡΡ Ρ ΡΠΈΠΊΡΠΈΡΠ°Π½ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π».
Π£ΡΠ»ΡΠ³Π°ΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠΎΠΈ Π²ΡΡΠΊΠ° ΠΌΠΈΠ½ΡΡΠ° Π·Π° Π²ΡΠ΅ΠΊΠΈ Π²Ρ ΠΎΠ΄ΡΡ ΡΠΈΠΌΠ²ΠΎΠ» ΠΎΡ ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° sym Π½Π°Π±ΠΎΡ ΠΎΡ Π°Π³ΡΠ΅Π³ΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ - ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΡΠ΅Π½Π°, ΡΡΠ΅Π΄Π½Π° ΡΠ΅Π½Π°, ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΡΡΠΌΠ°ΡΠ° ΠΈ Ρ.Π½. ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠ° ΠΏΡΠΎΡΡΠΎΡΠ° ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ, Ρ.Π΅. Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π½ΠΎΠ²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ, Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° Π·Π½Π°Π΅ΡΠ΅ Π΄Π²Π΅ ΡΠΈΡΠ»Π° - ΡΡΠ°ΡΠ°ΡΠ° ΠΈ Π²Ρ ΠΎΠ΄ΡΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ max, average, sum ΠΈΠΌΠ°Ρ ΡΠΎΠ²Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ, Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΡΡΠ° median Π½Π΅.
Π©Π΅ ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ ΡΡΡΠΎ, ΡΠ΅ Π²Ρ ΠΎΠ΄ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π΅ ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅. Π’ΠΎΠ²Π° ΡΠ΅ Π½ΠΈ Π΄Π°Π΄Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ ΡΠ°ΠΌΠΎ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΌΠΈΠ½ΡΡΠ°. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ ΡΠ΅ΠΊΡΡΠΈΡΠ΅ ΠΈ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ ΠΌΠΈΠ½ΡΡΠΈ, Π² ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ Π½ΡΠΊΠΎΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π°ΠΊΡΡΠ½Π΅ΡΡ. ΠΠ° ΠΏΡΠΎΡΡΠΎΡΠ° Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ.
ΠΠ³ΡΠ΅Π³ΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π΅ ΡΠ° ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ ΠΏΠΎ-Π΄ΠΎΠ»Ρ. ΠΠ·Π΅Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ ΡΡΡ , Π·Π° Π΄Π° ΡΠ²Π΅Π»ΠΈΡΠ° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°:
- high β max price β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° ΡΠ΅Π½Π° Π½Π° ΠΌΠΈΠ½ΡΡΠ°.
- low β min price β ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° ΡΠ΅Π½Π° Π½Π° ΠΌΠΈΠ½ΡΡΠ°.
- firstPrice β ΠΏΡΡΠ²Π° ΡΠ΅Π½Π° β ΠΏΡΡΠ²Π° ΡΠ΅Π½Π° Π½Π° ΠΌΠΈΠ½ΡΡΠ°.
- lastPrice β ΠΏΠΎΡΠ»Π΅Π΄Π½Π° ΡΠ΅Π½Π° β ΠΏΠΎΡΠ»Π΅Π΄Π½Π° ΡΠ΅Π½Π° Π½Π° ΠΌΠΈΠ½ΡΡΠ°.
- firstSize β ΠΏΡΡΠ²ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ β ΠΏΡΡΠ²ΠΈ ΡΡΡΠ³ΠΎΠ²ΡΠΊΠΈ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΌΠΈΠ½ΡΡΠ°.
- lastSize β ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΡΠ°Π·ΠΌΠ΅Ρ β ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΡΠ΄Π΅Π»ΠΊΠ° Π·Π° ΠΌΠΈΠ½ΡΡΠ°.
- numTrades β count i β Π±ΡΠΎΠΉ ΡΠ΄Π΅Π»ΠΊΠΈ Π² ΠΌΠΈΠ½ΡΡΠ°.
- ΠΎΠ±Π΅ΠΌ β ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΡΡΠΌΠ°ΡΠ° β ΡΠ±ΠΎΡ ΠΎΡ ΡΡΡΠ³ΠΎΠ²ΡΠΊΠΈΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠΈ Π·Π° ΠΌΠΈΠ½ΡΡΠ°.
- pvolume β sum price β ΡΡΠΌΠ° ΠΎΡ ΡΠ΅Π½ΠΈΡΠ΅ Π½Π° ΠΌΠΈΠ½ΡΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° avgPrice.
- β ΡΡΠΌΠ° ΠΎΠ±ΠΎΡΠΎΡ ΡΠ΅Π½Π°*ΡΠ°Π·ΠΌΠ΅Ρ β ΠΎΠ±Ρ ΠΎΠ±Π΅ΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π·Π° ΠΌΠΈΠ½ΡΡΠ°.
- avgPrice β pvolume%numTrades β ΡΡΠ΅Π΄Π½Π° ΡΠ΅Π½Π° Π½Π° ΠΌΠΈΠ½ΡΡΠ°.
- avgSize β volume%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 ΠΈ time Π² ΡΠ΅ΡΠ½ΠΈΠΊΠ° Π·Π° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ, ΡΠ΅Π³Π° initWith Π΅ Π³ΠΎΡΠΎΠ² ΡΠ΅Π΄ ΠΎΡ ΡΠΈΠ½Π°Π»Π½Π°ΡΠ° ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΠΎΡΡΠ°Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡΠ΅ sym ΠΈ time. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅, Π·Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π½ΠΎΠ²ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ°.
Π©Π΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ aggCols, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π΅. Π‘ΠΏΠΈΡΡΠΊΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠ±ΡΡΠ½Π°Ρ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠ΅Π΄Π°, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Ρ ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ Π² Q (ΠΎΡΠ΄ΡΡΠ½ΠΎ Π½Π°Π»ΡΠ²ΠΎ). Π¦Π΅Π»ΡΠ° Π΅ Π΄Π° ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ΡΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΎΡ Π²ΠΈΡΠΎΠΊ ΠΊΡΠΌ cumVolume, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½ΡΠΊΠΎΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅.
ΠΠΎΠ»ΠΎΠ½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΊΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² Π½ΠΎΠ²Π° ΠΌΠΈΠ½ΡΡΠ° ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ°, ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ° sym ΡΠ΅ Π΄ΠΎΠ±Π°Π²Ρ Π·Π° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ:
rollColumns:`sym`cumVolume;
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΡΠ°Π·Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΈΡΠ΅ Π½Π° Π³ΡΡΠΏΠΈ ΡΠΏΠΎΡΠ΅Π΄ ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ. ΠΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ°Π·Π³ΡΠ°Π½ΠΈΡΠ°Ρ ΡΡΠΈ Π²ΠΈΠ΄Π°:
- ΠΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΈ (ΠΎΠ±Π΅ΠΌ, ΠΎΠ±ΠΎΡΠΎΡ,..) β ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π²Ρ ΠΎΠ΄ΡΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΊΡΠΌ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ°.
- Π‘ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° ΡΠΎΡΠΊΠ° (Π²ΠΈΡΠΎΠΊΠ°, Π½ΠΈΡΠΊΠ°, ..) β ΠΏΡΡΠ²Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π² ΠΌΠΈΠ½ΡΡΠ°ΡΠ° ΡΠ΅ Π²Π·Π΅ΠΌΠ° ΠΎΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Ρ ΡΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡΡΠ°.
- ΠΠΎΡΠΈΠ²ΠΊΠ°. ΠΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡ.
ΠΠ΅ΠΊΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° ΡΠ΅Π·ΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅:
accumulatorCols:`numTrades`volume`pvolume`turnover;
specialCols:`high`low`firstPrice`firstSize;
Π Π΅Π΄ Π½Π° ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅
Π©Π΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° Π½Π° Π΄Π²Π° Π΅ΡΠ°ΠΏΠ°. ΠΠ° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ ΠΏΡΡΠ²ΠΎ ΡΠ²ΠΈΠ²Π°ΠΌΠ΅ Π²Ρ ΠΎΠ΄ΡΡΠ°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΡΠ΅Π΄ Π·Π° Π²ΡΠ΅ΠΊΠΈ Π·Π½Π°ΠΊ ΠΈ ΠΌΠΈΠ½ΡΡΠ°. Π€Π°ΠΊΡΡΡ, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π½Π°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ° ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈ ΠΈ Π°ΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΈ, Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ ΡΠ°Π·ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΡΡΡΠΏΠΊΠ° Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ select:
select high:max price, low:min price β¦ by sym,time.minute from table
Π’ΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΠΌΠ° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ - Π½Π°Π±ΠΎΡΡΡ ΠΎΡ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½. ΠΠ° ΡΠ°ΡΡΠΈΠ΅, Π² Q, select ΡΡΡΠΎ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ ΠΊΠ°ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΠΌΠ΅ΡΡΠ²Π°ΡΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ:
?[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 ΠΈ ΠΊΠΎΡΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π²ΡΠ² ΡΡΠ½ΠΊΡΠΈΡΡΠ° select. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΈΡΡ ΠΏΡΠΎΡΠ΅Ρ ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡ (Ρ.Π΅. ΡΡΠ½ΠΊΡΠΈΡ Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ) Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΠΈΠ·Π±ΠΎΡ, Π΅Π΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ (ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°) Π»ΠΈΠΏΡΠ²Π°. ΠΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ°, ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ°Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°.
ΠΡΠΎΡΠΈΡΡ Π΅ΡΠ°ΠΏ Π΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π°ΡΠ° ΡΠ°Π±Π»ΠΈΡΠ°. ΠΠ΅ΠΊΠ° ΠΏΡΡΠ²ΠΎ Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π² ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄:
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;β¦)];
ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π·Π° Π΄Π° ΠΏΡΠΈΡΠ²ΠΎΠΈΡΠ΅ ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ°, Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΡΠΏΠΈΡΡΠΊ ΠΎΡ ΡΠ΅Π΄ΠΎΠ²Π΅, Π° Π½Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ°Π½ΡΠΏΠΎΠ½ΠΈΡΠ°ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° (ΡΠΏΠΈΡΡΠΊ ΠΎΡ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π² ΡΠΏΠΈΡΡΠΊ ΠΎΡ ΡΠ΅Π΄ΠΎΠ²Π΅), ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΠΎΠ±ΡΡΡΠ°Π½Π΅. Π’ΠΎΠ²Π° Π΅ ΡΠΊΡΠΏΠΎ Π·Π° Π³ΠΎΠ»ΡΠΌΠ° ΡΠ°Π±Π»ΠΈΡΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΠΏΡΠΈΠ»Π°Π³Π°ΠΌΠ΅ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΎ ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π°Π½Π΅ ΠΊΡΠΌ Π²ΡΡΠΊΠ° ΠΊΠΎΠ»ΠΎΠ½Π° ΠΏΠΎΠΎΡΠ΄Π΅Π»Π½ΠΎ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° 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 ΡΠ΅Π΄ΡΡ Π½Π° ΠΎΡΠ΅Π½ΡΠ²Π°Π½Π΅ Π΅ ΠΎΡΠ΄ΡΡΠ½ΠΎ Π½Π°Π»ΡΠ²ΠΎ.
Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΈ ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅ Π³ΠΎΡΠΎΠ²Π°.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈ ΡΡΡΠΏΠΊΠΈ
ΠΠΌΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ updateAgg, ΠΊΠΎΠΈΡΠΎ Π²ΡΡΡΠ°Ρ ΡΡΠ»Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ°. ΠΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π΅Π½ ΠΏΡΠ΅Ρ ΠΎΠ΄ ΠΏΡΠ΅Π· ΠΌΠΈΠ½ΡΡΠΈΡΠ΅ ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ΅ Π·Π° Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π΅. ΠΡΡΠ²ΠΎ, Π½Π΅ΠΊΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° init:
init:{
tradeAgg:: 0#enlist[initWith]; // ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡΡΡΡΡ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ, enlist ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»ΠΎΠ²Π°ΡΡ Π² ΡΠ°Π±Π»ΠΈΡΡ, Π° 0# ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π²Π·ΡΡΡ 0 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· Π½Π΅Π΅
currTime::00:00; // Π½Π°ΡΠ½Π΅ΠΌ Ρ 0, :: ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Π² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
currSyms::`u#`symbol$(); // `u# - ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π² Π΄Π΅ΡΠ΅Π²ΠΎ, Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
offset::0; // ΠΈΠ½Π΄Π΅ΠΊΡ Π² tradeAgg, Π³Π΄Π΅ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠ΅ΠΊΡΡΠ°Ρ ΠΌΠΈΠ½ΡΡΠ°
rollCache:: `sym xkey update `u#sym from rollColumns#tradeAgg; // ΠΊΡΡ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ roll ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, ΡΠ°Π±Π»ΠΈΡΠ° Ρ ΠΊΠ»ΡΡΠΎΠΌ sym
}
Π©Π΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° roll, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΠΌΠΈΠ½ΡΡΠ°:
roll:{[tm]
if[currTime>tm; :init[]]; // Π΅ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π²Π°Π»ΠΈΠ»ΠΈ Π·Π° ΠΏΠΎΠ»Π½ΠΎΡΡ, ΡΠΎ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ init
rollCache,::offset _ rollColumns#tradeAgg; // ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ ΠΊΡΡ β Π²Π·ΡΡΡ roll ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΠΈΠ· aggTable, ΠΎΠ±ΡΠ΅Π·Π°ΡΡ, Π²ΡΡΠ°Π²ΠΈΡΡ Π² rollCache
offset::count tradeAgg;
currSyms::`u#`$();
}
Π©Π΅ Π½ΠΈ ΡΡΡΠ±Π²Π° ΡΡΠ½ΠΊΡΠΈΡ Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ Π·Π½Π°ΡΠΈ:
addSyms:{[syms]
currSyms,::syms; // Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΡΠ°Π±Π»ΠΈΡΡ sym, time ΠΈ rollColumns Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π²ΡΠΈΡΡ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠΌ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ.
// Π€ΡΠ½ΠΊΡΠΈΡ ^ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ roll ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ, Π΅ΡΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π½Π΅Ρ Π² ΠΊΡΡΠ΅. value flip table Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ Π² ΡΠ°Π±Π»ΠΈΡΠ΅.
`tradeAgg upsert @[count[syms]#enlist initWith;`sym`time,cols rc;:;(syms;currTime), (initWith cols rc)^value flip rc:rollCache ([] sym: syms)];
}
Π Π½Π°ΠΊΡΠ°Ρ, ΡΡΠ½ΠΊΡΠΈΡΡΠ° upd (ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ Π·Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° Q ΡΡΠ»ΡΠ³ΠΈ), ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ:
upd:{[tblName;data] // tblName Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, Π½ΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ΅ΡΠ²ΠΈΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±Π»ΠΈΡ
tm:exec distinct time from data:() xkey preprocess data; // preprocess & calc time
updMinute[data] each tm; // Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠΈΠ½ΡΡΡ
};
updMinute:{[data;tm]
if[tm<>currTime; roll tm; currTime::tm]; // ΠΏΠΎΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΌΠΈΠ½ΡΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ
data:select from data where time=tm; // ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ
if[count msyms:syms where not (syms:data`sym)in currSyms; addSyms msyms]; // Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ
updateAgg[`tradeAgg;offset+currSyms?syms;data]; // ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ ? ΠΈΡΠ΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΏΠΈΡΠΊΠ° ΡΠΏΡΠ°Π²Π° Π² ΡΠΏΠΈΡΠΊΠ΅ ΡΠ»Π΅Π²Π°.
};
Π’ΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ. ΠΡΠΎ ΠΏΡΠ»Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° Π½Π°ΡΠ°ΡΠ° ΡΡΠ»ΡΠ³Π°, ΠΊΠ°ΠΊΡΠΎ Π±Π΅ΡΠ΅ ΠΎΠ±Π΅ΡΠ°Π½ΠΎ, ΡΠ°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π΄Π°:
initWith:`sym`time`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover`avgPrice`avgSize`vwap`cumVolume!(`;00:00;0n;0n;0n;0n;0N;0N;0;0;0.0;0.0;0n;0n;0n;0);
aggCols:reverse key[initWith] except `sym`time;
rollColumns:`sym`cumVolume;
accumulatorCols:`numTrades`volume`pvolume`turnover;
specialCols:`high`low`firstPrice`firstSize;
selExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover!parse each ("max price";"min price";"first price";"last price";"first size";"last size";"count i";"sum size";"sum price";"sum price*size");
preprocess:?[;();`sym`time!`sym`time.minute;selExpression];
aggExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`avgPrice`avgSize`vwap`cumVolume!("row[`high]|inp`high";"row[`low]&inp`low";"row`firstPrice";"inp`lastPrice";"row`firstSize";"inp`lastSize";"pvolume%numTrades";"volume%numTrades";"turnover%volume";"row[`cumVolume]+inp`volume");
@[`aggExpression;specialCols;{"?[isFirst;inp`",y,";",x,"]"};string specialCols];
aggExpression[accumulatorCols]:{"row[`",x,"]+inp`",x } each string accumulatorCols;
updateAgg:value "{[aggTable;idx;inp] row:aggTable idx; isFirst_0=row`numTrades; .[aggTable;;:;]'[(idx;)each aggCols;(",(";"sv string[aggCols],'":",/:aggExpression aggCols),")]}"; / '
init:{
tradeAgg::0#enlist[initWith];
currTime::00:00;
currSyms::`u#`symbol$();
offset::0;
rollCache:: `sym xkey update `u#sym from rollColumns#tradeAgg;
};
roll:{[tm]
if[currTime>tm; :init[]];
rollCache,::offset _ rollColumns#tradeAgg;
offset::count tradeAgg;
currSyms::`u#`$();
};
addSyms:{[syms]
currSyms,::syms;
`tradeAgg upsert @[count[syms]#enlist initWith;`sym`time,cols rc;:;(syms;currTime),(initWith cols rc)^value flip rc:rollCache ([] sym: syms)];
};
upd:{[tblName;data] updMinute[data] each exec distinct time from data:() xkey preprocess data};
updMinute:{[data;tm]
if[tm<>currTime; roll tm; currTime::tm];
data:select from data where time=tm;
if[count msyms:syms where not (syms:data`sym)in currSyms; addSyms msyms];
updateAgg[`tradeAgg;offset+currSyms?syms;data];
};
Π’Π΅ΡΡΠ²Π°Π½Π΅
ΠΠ΅ΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, Π½Π΅ΠΊΠ° Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ (ΠΏΠΎΡΡΠ°Π²Π΅ΡΠ΅ ΠΊΠΎΠ΄Π° Π²ΡΠ² ΡΠ°ΠΉΠ»Π° service.q) ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ°ΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° init:
q service.q βp 5566
q)init[]
Π Π΄ΡΡΠ³Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ Π²ΡΠΎΡΠΈΡ Q ΠΏΡΠΎΡΠ΅Ρ ΠΈ ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ ΠΏΡΡΠ²ΠΈΡ:
h:hopen `:host:5566
h:hopen 5566 // Π΅ΡΠ»ΠΈ ΠΎΠ±Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Ρ
ΠΎΡΡΠ΅
ΠΡΡΠ²ΠΎ, Π½Π΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠΏΠΈΡΡΠΊ ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ - 10000 XNUMX Π±ΡΠΎΡ ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°. ΠΡΠ² Π²ΡΠΎΡΠ°ΡΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π°:
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 XNUMX:
start 10000
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈ:
min| 00:00:00.004
avg| 9.191458
med| 9f
max| 00:00:00.030
ΠΡΠ½ΠΎΠ²ΠΎ Π½ΠΈΡΠΎ ΠΎΡΠΎΠ±Π΅Π½ΠΎ, Π½ΠΎ ΡΠΎΠ²Π° ΡΠ° 24 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΡΠ΅Π΄Π° Π² ΠΌΠΈΠ½ΡΡΠ°, 400 Ρ ΠΈΠ»ΡΠ΄ΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 25 ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΠ΅ Π·Π°Π±Π°Π²ΠΈ ΡΠ°ΠΌΠΎ 5 ΠΏΡΡΠΈ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΠΏΡΠΈ ΡΠΌΡΠ½Π° Π½Π° ΠΌΠΈΠ½ΡΡΠ°ΡΠ°. ΠΠ΅ΠΊΠ° ΡΠ²Π΅Π»ΠΈΡΠΈΠΌ Π΄ΠΎ 100.000 XNUMX:
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 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° ΡΠ΅Π΄Π° Π² ΠΌΠΈΠ½ΡΡΠ°) Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π³ΠΎΠ»ΡΠΌ; Π² ΡΠ°ΠΊΠΈΠ²Π° ΡΠ»ΡΡΠ°ΠΈ Π΅ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠ»ΠΎΠ½ΠΈΠ½Π³Π° (ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ Π΄Π΅ΡΠ΅ΡΠΊΠΈ ΠΊΠ»ΠΎΠ½ΠΈΠ½Π³ΠΈ) Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°, Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΡΠ°ΠΌΠΎ ΡΠ°ΡΡ ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅. ΠΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ Π΅ Π²ΠΏΠ΅ΡΠ°ΡΠ»ΡΠ²Π°Ρ Π·Π° ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠ°Π½ Π΅Π·ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π²ΡΡΡ Ρ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ.
ΠΠΎΠΆΠ΅ Π΄Π° Π²ΡΠ·Π½ΠΈΠΊΠ½Π΅ Π²ΡΠΏΡΠΎΡΡΡ Π·Π°ΡΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΡΠ°ΡΡΠ΅ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π²ΡΡΠΊΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ. ΠΡΠΈΡΠΈΠ½Π°ΡΠ° Π΅, ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΡΠ²ΠΈΠ²Π°Π½Π΅ Π²ΡΡΡΠ½ΠΎΡΡ Π΅ C ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½Π° ΠΎΡ updateAgg. ΠΠ°ΠΏΠΎΡΠ²Π°ΠΉΠΊΠΈ ΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° (ΠΎΠΊΠΎΠ»ΠΎ 10.000 30), updateAgg Π΄ΠΎΡΡΠΈΠ³Π° ΡΠ²ΠΎΡ ΡΠ°Π²Π°Π½ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ°. Π’ΠΎΠ²Π° ΡΠ΅ Π΄ΡΠ»ΠΆΠΈ Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π°ΡΠ° ΡΡΡΠΏΠΊΠ° Q, ΡΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅ Π² ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π° ΡΡΠ²ΠΎΠΈ ΡΠ°ΠΊΠΈΠ²Π° ΠΎΠ±Π΅ΠΌΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ. Π’ΠΎΠ²Π° ΠΏΠΎΠ΄ΡΠ΅ΡΡΠ°Π²Π° ΠΊΠΎΠ»ΠΊΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ Π³ΠΎΠ»Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ. ΠΡΡΠ³ ΠΌΠΎΠΌΠ΅Π½Ρ Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°. ΠΠΊΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π΅ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΠΊΠΎΠ»ΠΎΠ½Π½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄ΡΠ΅ΠΆΠ΄Π°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΠΎΠ³Π°Π²Π° ΡΡΡ ΠΌΠ΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌ Ρ ΡΠ°ΠΊΠΎΠ²Π° Π½Π΅ΡΠΎ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠΏΡΡΠΊ Π½Π° TLB ΠΊΠ΅Ρ - Π»ΠΈΠΏΡΠ°ΡΠ° Π½Π° Π°Π΄ΡΠ΅Ρ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ° ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π² Π°Π΄ΡΠ΅ΡΠ½ΠΈΡ ΠΊΠ΅Ρ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°. Π’ΡΡΡΠ΅Π½Π΅ΡΠΎ Π½Π° Π°Π΄ΡΠ΅Ρ ΠΎΡΠ½Π΅ΠΌΠ° ΠΎΠΊΠΎΠ»ΠΎ XNUMX ΠΏΡΡΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅, Π°ΠΊΠΎ Π΅ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ, Π° Π°ΠΊΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ° ΡΠ°Π·ΠΏΡΡΡΠ½Π°ΡΠΈ, ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±Π°Π²ΠΈ ΡΡΠ»ΡΠ³Π°ΡΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΡΠΈ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΏΠΎΠΊΠ°Π·Π°Ρ , ΡΠ΅ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ KDB+ ΠΈ Q ΡΠ° ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ Π·Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ Π»Π΅ΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΡΡ ΡΡΠ΅Π· select, Π½ΠΎ ΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³ΠΈ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΈ Π΄Π° ΡΡΠ²ΠΎΡΠ²Π°Ρ ΡΡΠΎΡΠΈΡΠΈ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅/Π³ΠΈΠ³Π°Π±Π°ΠΉΡΠΈ Π΄Π°Π½Π½ΠΈ Π΄ΠΎΡΠΈ Π² Π΅Π΄ΠΈΠ½ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ Q ΠΏΡΠΎΡΠ΅Ρ. Π‘Π°ΠΌΠΈΡΡ Π΅Π·ΠΈΠΊ Q ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠ΅Π³Π½Π°ΡΠΎ ΠΈ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ²ΠΎΡ Π²Π΅ΠΊΡΠΎΡΠ΅Π½ Ρ Π°ΡΠ°ΠΊΡΠ΅Ρ, Π²Π³ΡΠ°Π΄Π΅Π½ SQL Π΄ΠΈΠ°Π»Π΅ΠΊΡΠ΅Π½ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΏΠ΅ΡΠ΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π©Π΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠ°, ΡΠ΅ Π³ΠΎΡΠ½ΠΎΡΠΎ Π΅ ΡΠ°ΠΌΠΎ ΡΠ°ΡΡ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Q; ΡΠΎΠΉ ΠΈΠΌΠ° ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠΎΡΡ IPC ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΡΡΠΈΠ²Π° Π³ΡΠ°Π½ΠΈΡΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΡΠ΄Π΅Π»Π½ΠΈΡΠ΅ Q ΠΏΡΠΎΡΠ΅ΡΠΈ ΠΈ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΡΡΠΎΡΠΈΡΠΈ ΠΎΡ ΡΠ΅Π·ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ Π² Π΅Π΄Π½Π° ΠΌΡΠ΅ΠΆΠ°, ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π° Π½Π° Π΄Π΅ΡΠ΅ΡΠΊΠΈ ΡΡΡΠ²ΡΡΠΈ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ°ΡΡΠΈ Π½Π° ΡΠ²Π΅ΡΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com