Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° Q ΠΈ KDB+ Ρ‡Ρ€Π΅Π· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° услуга Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅

Π—Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ прСдставлява Π±Π°Π·Π°Ρ‚Π° KDB+, Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Q, Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ силни ΠΈ слаби страни, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° ΠΌΠΈ статията ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΎ във Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ. Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ услуга Π½Π° Q, която Ρ‰Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° входящ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ ΠΈ Ρ‰Π΅ изчислява Π½Π° ΠΌΠΈΠ½ΡƒΡ‚Π½Π° Π±Π°Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° "Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅" (Ρ‚.Π΅. Ρ‰Π΅ успява Π΄Π° изчисли всичко ΠΏΡ€Π΅Π΄ΠΈ слСдващата порция Π΄Π°Π½Π½ΠΈ). ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° особСност Π½Π° Q Π΅, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅Π½ Π΅Π·ΠΈΠΊ, позволяващ Ρ€Π°Π±ΠΎΡ‚Π° Π½Π΅ само с Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, Π° с масиви, масиви ΠΎΡ‚ масиви ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ слоТни структури. Π―Π·Ρ‹Ρ†ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π½Π° Q, ΠΊΠ°Ρ‚ΠΎ K, J, APL са извСстни със своСто краткост. ЧСсто ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, която Π·Π°Π΅ΠΌΠ° няколко Π΅ΠΊΡ€Π°Π½Π° ΠΊΠΎΠ΄ Π½Π° ΠΏΠΎΠ·Π½Π°Ρ‚ Π΅Π·ΠΈΠΊ ΠΊΠ°Ρ‚ΠΎ Java, ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС написана Π½Π° тях Π·Π° няколко Ρ€Π΅Π΄Π°. ИмСнно Ρ‚ΠΎΠ²Π° ΠΈ искам Π΄Π° дСмонстрирам Π² Ρ‚Π°Π·ΠΈ статия.

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° Q ΠΈ KDB+ Ρ‡Ρ€Π΅Π· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° услуга Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅

Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅

KDB+ Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΎΡ‡Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π° към ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π½Π°Ρ‡ΠΈΠ½ (Π² Π½Π°ΠΉ-голяма стСпСн ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅). Вя сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΡ€Π΅Π΄ΠΈΠΌΠ½ΠΎ във финансови ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ – Π±Π°Π½ΠΊΠΈ, инвСстиционни Ρ„ΠΎΠ½Π΄ΠΎΠ²Π΅, застраховатСлни ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. Π•Π·ΠΈΠΊΡŠΡ‚ Q Π΅ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈΡΡ‚ Π΅Π·ΠΈΠΊ Π½Π° KDB+, ΠΊΠΎΠΉΡ‚ΠΎ позволява Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с Ρ‚Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ. Π˜Π΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΡΡ‚Π° Π½Π° Q Π΅ краткост ΠΈ СфСктивност, Π° Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π΅ ΠΆΠ΅Ρ€Ρ‚Π²Π°Π½ΠΎ. Π’ΠΎΠ²Π° сС обосновава с Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ вСкторният Π΅Π·ΠΈΠΊ Ρ‚Π°ΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ Ρ‰Π΅ бъдС слоТСн Π·Π° Π²ΡŠΠ·ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅, Π° краткостта Π½Π° записа позволява Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½Π° Π΅Π΄ΠΈΠ½ Π΅ΠΊΡ€Π°Π½ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-голяма част ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка улСснява Π½Π΅ΠΉΠ½ΠΎΡ‚ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅.

Π’ статията Ρ‰Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡŠΠ»Π½ΠΎΡ†Π΅Π½Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π½Π° Q ΠΈ Π²ΠΈΠ΅, вСроятно, Ρ‰Π΅ искатС Π΄Π° я ΠΈΠ·ΠΏΡ€ΠΎΠ±Π²Π°Ρ‚Π΅ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. Π—Π° Ρ†Π΅Π»Ρ‚Π° Ρ‰Π΅ Π²ΠΈ Π΅ Π½ΡƒΠΆΠ΅Π½ самият Q. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΡ‚Π΅ Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π½Π°Ρ‚Π° 32-Π±ΠΈΡ‚Π½Π° вСрсия ΠΎΡ‚ сайта Π½Π° компанията kx – www.kx.com. Π’Π°ΠΌ Ρ‰Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΈ справочна информация Π·Π° Q, ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Q For Mortals ΠΈ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΈ статии ΠΏΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚Π°.

Π€ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π°

Има ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° с Π΄Π°Π½Π½ΠΈ Π½Π° всСки 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;

Π‘Π΅Π³Π° Ρ‰Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΈΡ‚Π΅ Π½Π° Π³Ρ€ΡƒΠΏΠΈ Π² зависимост ΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ трябва Π΄Π° сС Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚. МоТСм Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ°:

  1. Акумулатори (volume, turnover,..) – трябва Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ входящата стойност към ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π°.
  2. Π‘ особСна Ρ‚ΠΎΡ‡ΠΊΠ° (high, low, ..) – ΠΏΡŠΡ€Π²Π°Ρ‚Π° стойност Π² ΠΌΠΈΠ½ΡƒΡ‚Π°Ρ‚Π° сС Π²Π·ΠΈΠΌΠ° ΠΎΡ‚ входящитС Π΄Π°Π½Π½ΠΈ, останалитС сС изчисляват с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° функция.
  3. ΠžΡΡ‚Π°Π½Π°Π»ΠΈΡ‚Π΅. Π’ΠΈΠ½Π°Π³ΠΈ сС изчисляват с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° функция.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠΌΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° Ρ‚Π΅Π·ΠΈ класовС:

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster