Π₯арактСристики Π½Π° Π΅Π·ΠΈΠΊΠ° Q ΠΈ KDB+ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° услуга Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅

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

Π₯арактСристики Π½Π° Π΅Π·ΠΈΠΊΠ° Q ΠΈ KDB+ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° услуга Π² Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅

въвСдСниС

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

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

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌ изявлСниС

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

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΈΡ‚Π΅ Π½Π° Π³Ρ€ΡƒΠΏΠΈ спорСд Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ трябва Π΄Π° сС Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚. ΠœΠΎΠ³Π°Ρ‚ Π΄Π° сС Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡Π°Ρ‚ Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π°:

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

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

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€