ืชื›ื•ื ื•ืช ืฉืœ ืฉืคืช 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, ื”ืกืคืจ ืฉ ืœื‘ื ื™ ืชืžื•ืชื” ื•ืžืืžืจื™ื ืฉื•ื ื™ื ื‘ื ื•ืฉื ื–ื”.

ื”ืฆื”ืจืช ื”ื‘ืขื™ื”

ื™ืฉ ืžืงื•ืจ ืฉืฉื•ืœื— ื˜ื‘ืœื” ืขื ื ืชื•ื ื™ื ื›ืœ 25 ืžื™ืœื™ืฉื ื™ื•ืช. ืžื›ื™ื•ื•ืŸ ืฉ-KDB+ ืžืฉืžืฉ ื‘ืขื™ืงืจ ื‘ืชื—ื•ื ื”ืคื™ื ื ืกื™ื, ื ื ื™ื— ืฉืžื“ื•ื‘ืจ ื‘ื˜ื‘ืœืช ืขืกืงืื•ืช (ืขืกืงืื•ืช), ื”ื›ื•ืœืœื•ืช ืืช ื”ืขืžื•ื“ื•ืช ื”ื‘ืื•ืช: ื–ืžืŸ (ื–ืžืŸ ื‘ืืœืคื™ื•ืช ื”ืฉื ื™ื™ื”), sym (ื™ื™ืขื•ื“ ื—ื‘ืจื” ื‘ื‘ื•ืจืกื” - ื™ื‘ืž, AAPL,...), ืžื—ื™ืจ (ื”ืžื—ื™ืจ ืฉื‘ื• ื ืจื›ืฉื• ื”ืžื ื™ื•ืช), ื’ื•ื“ืœ (ื’ื•ื“ืœ ื”ืขืกืงื”). ื”ืžืจื•ื•ื— ืฉืœ 25 ืžื™ืœื™ืฉื ื™ื•ืช ื”ื•ื ืฉืจื™ืจื•ืชื™, ืœื ืงื˜ืŸ ืžื“ื™ ื•ืœื ืืจื•ืš ืžื“ื™. ื”ื ื•ื›ื—ื•ืช ืฉืœื• ืคื™ืจื•ืฉื” ืฉื”ื ืชื•ื ื™ื ืžื’ื™ืขื™ื ืœืฉื™ืจื•ืช ื›ื‘ืจ ืžืื•ื’ืจื™ื. ื™ื”ื™ื” ืงืœ ืœื™ื™ืฉื ื—ืฆื™ืฆื” ื‘ืฆื“ ื”ืฉื™ืจื•ืช, ื›ื•ืœืœ ื—ืฆื™ืฆื” ื“ื™ื ืžื™ืช ื‘ื”ืชืื ืœืขื•ืžืก ื”ื ื•ื›ื—ื™, ืืš ืœืฉื ื”ืคืฉื˜ื•ืช, ื ืชืžืงื“ ื‘ืžืจื•ื•ื— ืงื‘ื•ืข.

ื”ืฉื™ืจื•ืช ื—ื™ื™ื‘ ืœืกืคื•ืจ ื›ืœ ื“ืงื” ืขื‘ื•ืจ ื›ืœ ืกืžืœ ื ื›ื ืก ืžืขืžื•ื“ืช sym ืงื‘ื•ืฆื” ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืฆื‘ื™ืจื” - ืžื—ื™ืจ ืžืงืกื™ืžืœื™, ืžื—ื™ืจ ืžืžื•ืฆืข, ื’ื•ื“ืœ ืกื›ื•ื ื•ื›ื•'. ืžื™ื“ืข ืฉื™ืžื•ืฉื™. ืœืฉื ื”ืคืฉื˜ื•ืช, ื ื ื™ื— ืฉื ื™ืชืŸ ืœื—ืฉื‘ ืืช ื›ืœ ื”ืคื•ื ืงืฆื™ื•ืช ื‘ืื•ืคืŸ ืื™ื ืงืจืžื ื˜ืœื™, ื›ืœื•ืžืจ. ื›ื“ื™ ืœืงื‘ืœ ืขืจืš ื—ื“ืฉ, ืžืกืคื™ืง ืœื“ืขืช ืฉื ื™ ืžืกืคืจื™ื - ื”ื™ืฉืŸ ื•ื”ืขืจื›ื™ื ื”ื ื›ื ืกื™ื. ืœื“ื•ื’ืžื”, ืœืคื•ื ืงืฆื™ื•ืช ืžืงืกื™ืžื•ื, ืžืžื•ืฆืข, ืกื›ื•ื ื™ืฉ ืืช ื”ืžืืคื™ื™ืŸ ื”ื–ื”, ืื‘ืœ ืœืคื•ื ืงืฆื™ื” ื”ื—ืฆื™ื•ื ื™ืช ืื™ืŸ.

ื›ืžื• ื›ืŸ, ื ื ื™ื— ืฉื–ืจื ื”ื ืชื•ื ื™ื ื”ื ื›ื ืก ืžื•ืกื“ืจ ื‘ื–ืžืŸ. ื–ื” ื™ื™ืชืŸ ืœื ื• ืืช ื”ื”ื–ื“ืžื ื•ืช ืœืขื‘ื•ื“ ืจืง ืขื ื”ืจื’ืข ื”ืื—ืจื•ืŸ. ื‘ืคื•ืขืœ, ืžืกืคื™ืง ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœืขื‘ื•ื“ ืขื ื”ื“ืงื•ืช ื”ื ื•ื›ื—ื™ื•ืช ื•ื”ืงื•ื“ืžื•ืช ืœืžืงืจื” ืฉื—ืœืง ืžื”ืขื“ื›ื•ื ื™ื ื™ืื—ืจื•. ืœืฉื ื”ืคืฉื˜ื•ืช, ืœื ื ืฉืงื•ืœ ืืช ื”ืžืงืจื” ื”ื–ื”.

ืคื•ื ืงืฆื™ื•ืช ืฆื‘ื™ืจื”

ืคื•ื ืงืฆื™ื•ืช ื”ืฆื‘ื™ืจื” ื”ื ื“ืจืฉื•ืช ืžืคื•ืจื˜ื•ืช ืœื”ืœืŸ. ืœืงื—ืชื™ ื›ืžื” ืฉื™ื•ืชืจ ืžื”ื ื›ื“ื™ ืœื”ื’ื“ื™ืœ ืืช ื”ืขื•ืžืก ืขืœ ื”ืฉื™ืจื•ืช:

  • ืžื—ื™ืจ ื’ื‘ื•ื” โ€“ ืžืงืกื™ืžื•ื ืžื—ื™ืจ โ€“ ืžื—ื™ืจ ืžืงืกื™ืžืœื™ ืœื“ืงื”.
  • ื ืžื•ืš โ€“ ืžื—ื™ืจ ืžื™ื ื™ืžืœื™ โ€“ ืžื—ื™ืจ ืžื™ื ื™ืžื•ื ืœื“ืงื”.
  • firstPrice โ€“ ืžื—ื™ืจ ืจืืฉื•ืŸ โ€“ ืžื—ื™ืจ ืจืืฉื•ืŸ ืœื“ืงื”.
  • lastPrice โ€“ ืžื—ื™ืจ ืื—ืจื•ืŸ โ€“ ืžื—ื™ืจ ืื—ืจื•ืŸ ืœื“ืงื”.
  • firstSize - ืžื™ื“ื” ืจืืฉื•ื ื” - ื’ื•ื“ืœ ืกื—ืจ ืจืืฉื•ืŸ ืœื“ืงื”.
  • lastSize - ื’ื•ื“ืœ ืื—ืจื•ืŸ - ื’ื•ื“ืœ ื˜ืจื™ื™ื“ ืื—ืจื•ืŸ ืชื•ืš ื“ืงื”.
  • numTrades โ€“ count i โ€“ ืžืกืคืจ ื”ืขืกืงืื•ืช ื‘ื“ืงื”.
  • ื ืคื— โ€“ ื’ื•ื“ืœ ืกื›ื•ื โ€“ ืกื›ื•ื ื’ื“ืœื™ ืžืกื—ืจ ืœื“ืงื”.
  • pvolume โ€“ ืกื›ื•ื ืžื—ื™ืจ โ€“ ืกื›ื•ื ืžื—ื™ืจื™ื ืœื“ืงื”, ื ื“ืจืฉ ืขื‘ื•ืจ avgPrice.
  • โ€“ ืกื›ื•ื ืžื—ื–ื•ืจ ืžื—ื™ืจ*ื’ื•ื“ืœ โ€“ ื”ื™ืงืฃ ืขืกืงืื•ืช ื›ื•ืœืœ ืœื“ืงื”.
  • avgPrice โ€“ pvolume%numTrades โ€“ ืžื—ื™ืจ ืžืžื•ืฆืข ืœื“ืงื”.
  • avgSize โ€“ volume%numTrades โ€“ ื’ื•ื“ืœ ืžืกื—ืจ ืžืžื•ืฆืข ืœื“ืงื”.
  • vwap โ€“ turnover%volume โ€“ ืžื—ื™ืจ ืžืžื•ืฆืข ืœื“ืงื” ืžืฉื•ืงืœืœ ืœืคื™ ื’ื•ื“ืœ ื”ืขืกืงื”.
  • cumVolume โ€“ ื ืคื— ืกื›ื•ื โ€“ ื’ื•ื“ืœ ืขืกืงืื•ืช ืžืฆื˜ื‘ืจ ืœืื•ืจืš ื›ืœ ื”ื–ืžืŸ.

ืžื™ื“ ื ื“ื•ืŸ ื‘ื ืงื•ื“ื” ืื—ืช ืœื ื‘ืจื•ืจื” - ื›ื™ืฆื“ ืœืืชื—ืœ ืืช ื”ืขืžื•ื“ื•ืช ื”ืœืœื• ื‘ืคืขื ื”ืจืืฉื•ื ื” ื•ืœื›ืœ ื“ืงื” ืฉืœืื—ืจ ืžื›ืŸ. ื™ืฉ ืœืืชื—ืœ ื›ืžื” ืขืžื•ื“ื•ืช ืžืกื•ื’ firstPrice ืœ-null ื‘ื›ืœ ืคืขื; ื”ืขืจืš ืฉืœื”ืŸ ืื™ื ื• ืžื•ื’ื“ืจ. ืกื•ื’ื™ ื ืคื—ื™ื ืื—ืจื™ื ื—ื™ื™ื‘ื™ื ืœื”ื™ื•ืช ืžื•ื’ื“ืจื™ื ืชืžื™ื“ ืœ-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 ะพะฑัŠััะฝะตะฝ ะฝะธะถะต

ื”ื•ืกืคืชื™ ืกื™ืžืŸ ื•ื–ืžืŸ ืœืžื™ืœื•ืŸ ืžื˜ืขืžื™ ื ื•ื—ื•ืช, ื›ืขืช initWith ื”ื™ื ืฉื•ืจื” ืžื•ื›ื ื” ืžื”ื˜ื‘ืœื” ื”ืžืฆื˜ื‘ืจืช ื”ืกื•ืคื™ืช, ืฉื‘ื” ื ื•ืชืจ ืœื”ื’ื“ื™ืจ ืืช ื”ืกืžืœ ื•ื”ื–ืžืŸ ื”ื ื›ื•ื ื™ื. ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื• ื›ื“ื™ ืœื”ื•ืกื™ืฃ ืฉื•ืจื•ืช ื—ื“ืฉื•ืช ืœื˜ื‘ืœื”.

ื ืฆื˜ืจืš aggCols ื‘ืขืช ื™ืฆื™ืจืช ืคื•ื ืงืฆื™ื™ืช ืฆื‘ื™ืจื”. ื™ืฉ ืœื”ืคื•ืš ืืช ื”ืจืฉื™ืžื” ื‘ืฉืœ ืกื“ืจ ื”ืขืจื›ืช ื”ื‘ื™ื˜ื•ื™ื™ื ื‘-Q (ืžื™ืžื™ืŸ ืœืฉืžืืœ). ื”ืžื˜ืจื” ื”ื™ื ืœื”ื‘ื˜ื™ื— ืฉื”ื—ื™ืฉื•ื‘ ื™ืขื‘ื•ืจ ืžื’ื‘ื•ื” ืœ-cumVolume, ืžื›ื™ื•ื•ืŸ ืฉื—ืœืง ืžื”ืขืžื•ื“ื•ืช ืชืœื•ื™ื•ืช ื‘ืขืžื•ื“ื•ืช ื”ืงื•ื“ืžื•ืช.

ืขืžื•ื“ื•ืช ืฉืฆืจื™ืš ืœื”ืขืชื™ืง ืœื“ืงื” ื—ื“ืฉื” ืžื”ืงื•ื“ืžืช, ืขืžื•ื“ืช ื”ืกืžืœ ืžืชื•ื•ืกืคืช ืžื˜ืขืžื™ ื ื•ื—ื•ืช:

rollColumns:`sym`cumVolume;

ื›ืขืช ื ื—ืœืง ืืช ื”ืขืžื•ื“ื•ืช ืœืงื‘ื•ืฆื•ืช ืœืคื™ ืื•ืคืŸ ื”ืขื“ื›ื•ืŸ ืฉืœื”ืŸ. ื ื™ืชืŸ ืœื”ื‘ื—ื™ืŸ ื‘ื™ืŸ ืฉืœื•ืฉื” ืกื•ื’ื™ื:

  1. ืžืฆื‘ืจื™ื (ื ืคื—, ืžื—ื–ื•ืจ,..) โ€“ ืขืœื™ื ื• ืœื”ื•ืกื™ืฃ ืืช ื”ืขืจืš ื”ื ื›ื ืก ืœืงื•ื“ื.
  2. ืขื ื ืงื•ื“ื” ืžื™ื•ื—ื“ืช (ื’ื‘ื•ื”ื”, ื ืžื•ื›ื”, ..) - ื”ืขืจืš ื”ืจืืฉื•ืŸ ื‘ื“ืงื” ื ืœืงื— ืžื”ื ืชื•ื ื™ื ื”ื ื›ื ืกื™ื, ื”ืฉืืจ ืžื—ื•ืฉื‘ื™ื ื‘ืืžืฆืขื•ืช ื”ืคื•ื ืงืฆื™ื”.
  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, select ืžื™ื•ืฉืžืช ื’ื ื›ืคื•ื ืงืฆื™ื” ืฉื‘ื” ืืชื” ื™ื›ื•ืœ ืœื”ื—ืœื™ืฃ ืืจื’ื•ืžื ื˜ื™ื ืฉื ื•ืฆืจื• ื‘ืื•ืคืŸ ื“ื™ื ืžื™:

?[table;whereClause;byClause;selectClause]

ืœื ืืชืืจ ื‘ืคื™ืจื•ื˜ ืืช ื”ืคื•ืจืžื˜ ืฉืœ ื”ื˜ื™ืขื•ื ื™ื; ื‘ืžืงืจื” ืฉืœื ื•, ืจืง ื‘ื™ื˜ื•ื™ื™ื ืœืคื™ ื•ื‘ื—ืจ ื™ื”ื™ื• ืœื ื˜ืจื™ื•ื•ื™ืืœื™ื™ื ื•ื”ื ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช ืžื™ืœื•ื ื™ื ืฉืœ ืขืžื•ื“ื•ืช ื”ืฆื•ืจื”!ื‘ื™ื˜ื•ื™ื™ื. ืœืคื™ื›ืš, ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืืช ืคื•ื ืงืฆื™ื™ืช ื”ื›ื™ื•ื•ืฅ ื‘ืื•ืคืŸ ื”ื‘ื:

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 ื•ืืฉืจ ื ื“ืจืฉืช ื‘-function select. ืฉื™ืžื• ืœื‘ ื’ื ืฉ-preprocess ืžื•ื’ื“ืจ ื›ื”ืฉืœื›ื” (ื›ืœื•ืžืจ, ืคื•ื ืงืฆื™ื” ืขื ืืจื’ื•ืžื ื˜ื™ื ืžื•ื’ื“ืจื™ื ื—ืœืงื™ืช) ืฉืœ ืคื•ื ืงืฆื™ื™ืช ื”ื‘ื—ื™ืจื”, ืืจื’ื•ืžื ื˜ ืื—ื“ (ื”ื˜ื‘ืœื”) ื—ืกืจ. ืื ื ื—ื™ืœ ืงื“ื-process ืขืœ ื˜ื‘ืœื”, ื ืงื‘ืœ ื˜ื‘ืœื” ื“ื—ื•ืกื”.

ื”ืฉืœื‘ ื”ืฉื ื™ ื”ื•ื ืขื“ื›ื•ืŸ ื”ื˜ื‘ืœื” ื”ืžืฆื˜ื‘ืจืช. ื‘ื•ื ื ื›ืชื•ื‘ ืชื—ื™ืœื” ืืช ื”ืืœื’ื•ืจื™ืชื ื‘ืคืกืื•ื“ื•ืงื•ื“:

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, ืžืงื•ื‘ืœ ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ืžืคื”/ื”ืงื˜ื ื” ื‘ืžืงื•ื ืœื•ืœืื•ืช. ืื‘ืœ ืžื›ื™ื•ื•ืŸ ืฉ-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;โ€ฆ)];

ืœืžืจื‘ื” ื”ืฆืขืจ, ื›ื“ื™ ืœื”ืงืฆื•ืช ืœื˜ื‘ืœื” ืืชื” ืฆืจื™ืš ืจืฉื™ืžื” ืฉืœ ืฉื•ืจื•ืช, ืœื ืขืžื•ื“ื•ืช, ื•ืืชื” ืฆืจื™ืš ืœื”ืขื‘ื™ืจ ืืช ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹(ืจืฉื™ืžืช ืขืžื•ื“ื•ืช ืœืจืฉื™ืžืช ืฉื•ืจื•ืช) ื‘ืืžืฆืขื•ืช ืคื•ื ืงืฆื™ื™ืช ื”ื™ืคื•ืš. ื–ื” ื™ืงืจ ืขื‘ื•ืจ ื˜ื‘ืœื” ื’ื“ื•ืœื”, ืื– ื‘ืžืงื•ื ื–ืืช ืื ื• ืžื™ื™ืฉืžื™ื ื”ืงืฆืื” ื›ืœืœื™ืช ืขืœ ื›ืœ ืขืžื•ื“ื” ื‘ื ืคืจื“, ื‘ืืžืฆืขื•ืช ืคื•ื ืงืฆื™ื™ืช ื”ืžืคื” (ืฉื ืจืื™ืช ื›ืžื• ืืคื•ืกืชืจื•ืฃ):

.[aggTable;;:;]'[(idx;)each aggCols; (row[`high] | inputTable`high;row[`volume] + inputTable`volume;โ€ฆ)];

ืื ื• ืฉื•ื‘ ืžืฉืชืžืฉื™ื ื‘ื”ืงืจื ืช ืคื•ื ืงืฆื™ื•ืช. ืฉื™ืžื• ืœื‘ ื’ื ืฉื‘-Q, ื™ืฆื™ืจืช ืจืฉื™ืžื” ื”ื™ื ื’ื ืคื•ื ืงืฆื™ื” ื•ื ื•ื›ืœ ืœืงืจื•ื ืœื” ื‘ืืžืฆืขื•ืช ื”ืคื•ื ืงืฆื™ื” each(map) ื›ื“ื™ ืœืงื‘ืœ ืจืฉื™ืžื” ืฉืœ ืจืฉื™ืžื•ืช.

ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืฉืžืขืจื›ืช ื”ืขืžื•ื“ื•ืช ื”ืžื—ื•ืฉื‘ืช ืœื ืชื”ื™ื” ืงื‘ื•ืขื”, ื ื™ืฆื•ืจ ืืช ื”ื‘ื™ื˜ื•ื™ ื”ื "ืœ ื‘ืื•ืคืŸ ื“ื™ื ืžื™. ืชื—ื™ืœื” ื ื’ื“ื™ืจ ืคื•ื ืงืฆื™ื•ืช ืœื—ื™ืฉื•ื‘ ื›ืœ ืขืžื•ื“ื”, ืชื•ืš ืฉื™ืžื•ืฉ ื‘ืžืฉืชื ื™ ื”ืฉื•ืจื” ื•ื”-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 ื™ืฉ ืคื•ื ืงืฆื™ื™ืช ื‘ื—ื™ืจื” - ?[ืจืฉื™ืžื” ื‘ื•ืœื™ืื ื™ืช;ืจืฉื™ืžื”1;ืจืฉื™ืžื”2] - ืฉื‘ื•ื—ืจืช ืขืจืš ืžืจืฉื™ืžื” 1 ืื• 2 ื‘ื”ืชืื ืœืชื ืื™ ื‘ืืจื’ื•ืžื ื˜ ื”ืจืืฉื•ืŸ:

// high -> ?[isFirst;inp`high;row[`high]|inp`high]
// @ - ั‚ะพะถะต ะพะฑะพะฑั‰ะตะฝะฝะพะต ะฟั€ะธัะฒะฐะธะฒะฐะฝะธะต ะดะปั ัะปัƒั‡ะฐั ะบะพะณะดะฐ ะธะฝะดะตะบั ะฝะตะณะปัƒะฑะพะบะธะน
@[`aggExpression;specialCols;{[x;y]"?[isFirst;inp`",y,";",x,"]"};string specialCols];

ื›ืืŸ ืงืจืืชื™ ืžื˜ืœื” ื›ืœืœื™ืช ืขื ื”ืคื•ื ืงืฆื™ื” ืฉืœื™ (ื‘ื™ื˜ื•ื™ ื‘ืกื•ื’ืจื™ื ืžืชื•ืœืชืœื™ื). ื”ื•ื ืžืงื‘ืœ ืืช ื”ืขืจืš ื”ื ื•ื›ื—ื™ (ื”ืืจื’ื•ืžื ื˜ ื”ืจืืฉื•ืŸ) ื•ืืจื’ื•ืžื ื˜ ื ื•ืกืฃ, ืื•ืชื• ืื ื™ ืžืขื‘ื™ืจ ื‘ืคืจืžื˜ืจ ื”ืจื‘ื™ืขื™.

ื‘ื•ืื• ื ื•ืกื™ืฃ ืจืžืงื•ืœื™ื ืกื•ืœืœื” ื‘ื ืคืจื“, ืžื›ื™ื•ื•ืŸ ืฉื”ืคื•ื ืงืฆื™ื” ื–ื”ื” ืขื‘ื•ืจื:

// 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:{[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 ื—ืœืงื™ื ื•ื ื•ืกื™ืฃ ืคื•ื ืงืฆื™ื” ืœื™ืฆื™ืจืช ื˜ื‘ืœื” ืืงืจืื™ืช. ื‘ืงื•ื ืกื•ืœื” ื”ืฉื ื™ื™ื”:

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 ืžื™ืœื™ื•ืŸ ืฉื•ืจื•ืช ืœื“ืงื”) ื”ื•ื ื’ื“ื•ืœ ื‘ื™ื•ืชืจ, ื‘ืžืงืจื™ื ื›ืืœื” ืžืงื•ื‘ืœ ืœื”ืฉื™ืง ื›ืžื” ืฉื™ื‘ื•ื˜ื™ื (ืื• ืืคื™ืœื• ืขืฉืจื•ืช ืฉื™ื‘ื•ื˜ื™ื) ืฉืœ ื”ืฉื™ืจื•ืช, ืฉื›ืœ ืื—ื“ ืžื”ื ืžืขื‘ื“ ืจืง ื—ืœืง ืžื”ื“ืžื•ื™ื•ืช. ื•ื‘ื›ืœ ื–ืืช, ื”ืชื•ืฆืื” ืžืจืฉื™ืžื” ืขื‘ื•ืจ ืฉืคื” ืžืคื•ืจืฉืช ื”ืžืชืžืงื“ืช ื‘ืขื™ืงืจ ื‘ืื—ืกื•ืŸ ื ืชื•ื ื™ื.

ืขืœื•ืœื” ืœื”ืชืขื•ืจืจ ื”ืฉืืœื” ืžื“ื•ืข ื”ื–ืžืŸ ื’ื“ืœ ื‘ืื•ืคืŸ ืœื ืœื™ื ื™ืืจื™ ืขื ื’ื•ื“ืœื• ืฉืœ ื›ืœ ืขื“ื›ื•ืŸ. ื”ืกื™ื‘ื” ื”ื™ื ืฉืคื•ื ืงืฆื™ื™ืช ื”-shrink ื”ื™ื ืœืžืขืฉื” ืคื•ื ืงืฆื™ื™ืช C, ืฉื”ื™ื ื”ืจื‘ื” ื™ื•ืชืจ ื™ืขื™ืœื” ืž-updateAgg. ื”ื—ืœ ืžื’ื•ื“ืœ ืขื“ื›ื•ืŸ ืžืกื•ื™ื (ื‘ืกื‘ื™ื‘ื•ืช 10.000), updateAgg ืžื’ื™ืข ืœืชืงืจื” ืฉืœื• ื•ืื– ื–ืžืŸ ื”ื‘ื™ืฆื•ืข ืฉืœื• ืื™ื ื• ืชืœื•ื™ ื‘ื’ื•ื“ืœ ื”ืขื“ื›ื•ืŸ. ื–ื” ื‘ื’ืœืœ ื”ืฉืœื‘ ื”ืžืงื“ื™ื Q ืฉื”ืฉื™ืจื•ืช ืžืกื•ื’ืœ ืœืขื›ืœ ื›ืžื•ื™ื•ืช ื›ืืœื” ืฉืœ ื ืชื•ื ื™ื. ื–ื” ืžื“ื’ื™ืฉ ื›ืžื” ื—ืฉื•ื‘ ืœื‘ื—ื•ืจ ื‘ืืœื’ื•ืจื™ืชื ื”ื ื›ื•ืŸ ื›ืฉืขื•ื‘ื“ื™ื ืขื ื‘ื™ื’ ื“ืื˜ื”. ื ืงื•ื“ื” ื ื•ืกืคืช ื”ื™ื ืื—ืกื•ืŸ ื ื›ื•ืŸ ืฉืœ ื ืชื•ื ื™ื ื‘ื–ื™ื›ืจื•ืŸ. ืื ื”ื ืชื•ื ื™ื ืœื ื”ื™ื• ืžืื•ื—ืกื ื™ื ื‘ืขืžื•ื“ื•ืช ืื• ืœื ื”ื™ื• ืžืกื•ื“ืจื™ื ืœืคื™ ื–ืžืŸ, ืื– ื”ื™ื™ื ื• ืžื›ื™ืจื™ื ื“ื‘ืจ ื›ื–ื” ื›ืžื• ืคืกืคื•ืก ืžื˜ืžื•ืŸ TLB - ื”ื™ืขื“ืจ ื›ืชื•ื‘ืช ืขืžื•ื“ ื–ื™ื›ืจื•ืŸ ื‘ืžื˜ืžื•ืŸ ื›ืชื•ื‘ืช ื”ืžืขื‘ื“. ื—ื™ืคื•ืฉ ื›ืชื•ื‘ืช ืœื•ืงื— ื‘ืขืจืš ืคื™ 30 ื™ื•ืชืจ ืื ืœื ืžืฆืœื™ื—, ื•ืื ื”ื ืชื•ื ื™ื ืžืคื•ื–ืจื™ื, ื–ื” ื™ื›ื•ืœ ืœื”ืื˜ ืืช ื”ืฉื™ืจื•ืช ืžืกืคืจ ืคืขืžื™ื.

ืžืกืงื ื”

ื‘ืžืืžืจ ื–ื”, ื”ืจืื™ืชื™ ืฉืžืกื“ ื”ื ืชื•ื ื™ื KDB+ ื•-Q ืžืชืื™ืžื™ื ืœื ืจืง ืœืื—ืกื•ืŸ ื ืชื•ื ื™ื ื’ื“ื•ืœื™ื ื•ื’ื™ืฉื” ืืœื™ื”ื ื‘ืงืœื•ืช ื‘ืืžืฆืขื•ืช select, ืืœื ื’ื ืœื™ืฆื™ืจืช ืฉื™ืจื•ืชื™ ืขื™ื‘ื•ื“ ื ืชื•ื ื™ื ื”ืžืกื•ื’ืœื™ื ืœืขื›ืœ ืžืื•ืช ืžื™ืœื™ื•ื ื™ ืฉื•ืจื•ืช/ื’ื™ื’ื”-ื‘ื™ื™ื˜ ืฉืœ ื ืชื•ื ื™ื ืืคื™ืœื• ืชื”ืœื™ืš Q ืื—ื“ ื‘ื•ื“ื“. ืฉืคืช ื”-Q ืขืฆืžื” ืžืืคืฉืจืช ื™ื™ืฉื•ื ืชืžืฆื™ืชื™ ื•ื™ืขื™ืœ ื‘ื™ื•ืชืจ ืฉืœ ืืœื’ื•ืจื™ืชืžื™ื ื”ืงืฉื•ืจื™ื ืœืขื™ื‘ื•ื“ ื ืชื•ื ื™ื ื‘ืฉืœ ื”ืื•ืคื™ ื”ื•ื•ืงื˜ื•ืจื™ ืฉืœื”, ืžืชื•ืจื’ืžืŸ ื ื™ื‘ื™ื ืžื•ื‘ื ื” ืฉืœ SQL ื•ืžืขืจื›ืช ืžื•ืฆืœื—ืช ืžืื•ื“ ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืกืคืจื™ื™ื”.

ืืฆื™ื™ืŸ ืฉื”ืืžื•ืจ ืœืขื™ืœ ื”ื•ื ืจืง ื—ืœืง ืžืžื” ืฉ-Q ื™ื›ื•ืœ ืœืขืฉื•ืช, ื™ืฉ ืœื• ื’ื ืชื›ื•ื ื•ืช ื™ื™ื—ื•ื“ื™ื•ืช ืื—ืจื•ืช. ืœืžืฉืœ, ืคืจื•ื˜ื•ืงื•ืœ IPC ืคืฉื•ื˜ ื‘ืžื™ื•ื—ื“ ืฉืžื•ื—ืง ืืช ื”ื’ื‘ื•ืœ ื‘ื™ืŸ ืชื”ืœื™ื›ื™ Q ื‘ื•ื“ื“ื™ื ื•ืžืืคืฉืจ ืœืฉืœื‘ ืžืื•ืช ืชื”ืœื™ื›ื™ื ืืœื• ืœืจืฉืช ืื—ืช, ืฉื™ื›ื•ืœื” ืœื”ืชืžืงื ืขืœ ืขืฉืจื•ืช ืฉืจืชื™ื ื‘ืžืงื•ืžื•ืช ืฉื•ื ื™ื ื‘ืขื•ืœื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”