α’αααβα’αΆα βα’αΆαβα’αααΈβα’αααΈβαααβααΌαααααΆα KDB+ ααΆααΆβαααααβαααααα·ααΈ Q α’αααΈβααΆβα ααα»α βααααΆααβαα·αβα ααα»α βαααααβααααβααΆβαα βαααα»αβαααααα·ααΈβαα»αβααααβαααα»α α αΎαααααααααααα αααα»αααΆαααααΆαα αα αααα»αα’ααααα ααΎαααΉαα’αα»ααααααααΆαααααα½ααα ααΎ Q αααααΉαααααΎαααΆαααααααΈααα·ααααααα αΌα αα·αααααΆαα»αααΆααααααΌααααα»αααααααααΆαααααΆααααΆααΈαααα»ααααα "αααααααΆαα·α" (α§ααΆα ααα ααΆααΉαααΆααααααααΆααΎααααΈααααΆα’αααΈαααΆααα’αααα»αααΉαααααααααααΆαααααα·αααααα)α αααααααα·αααα αααααααα Q ααΊααΆααΆααΆααΆααΆααα·α ααααααα’αα»ααααΆαα±ααα’αααααααΎαααΆααα·ααααααΆαα½αααααα»αααα½ααα ααα»ααααααΆαα½αααΉαα’αΆαααααααα½ααα α’αΆααααα’αΆαα αα·αααααα»αααα»αααααΆαααααααααα ααΆααΆααΌα ααΆ Q αα·αααΆα αααΆαα·ααααααΆ K, J, APL ααΆαααΆαααααΈααααΆααααααΆαααΆαααααΈαααααα½αααα ααΆααΉααα αααααα·ααΈαααααααΎα’ααααααααΌαααΆα αααΎααα αααα»αααΆααΆαααααααΆααααααΆααααΌα ααΆ Java α’αΆα ααααΌαααΆαααααααα ααΎαα½αααΆααΆααΈααα½αα αααααΆα’αααΈααααααα»αα αααααα αΆααα αααα»αα’ααααααααα

ααα ααααΈααααΆα
KDB+ ααΊβααΆβααΌαααααΆαβαα·ααααααβαα½αβααβαααβαααααβααΎβα ααα½αβαα·ααααααβααβα αααΎαβαααβααΆαβααααααβααΆαβαα·ααΈβααΆααααΆααβαα½α (ααΆβα ααααβααΆαβαααααααΆ)α ααΆααααΌαααΆαααααΎααΆα αααααα αααα»αααααΆαααα α·ααααααααα» - αααΆααΆα ααΌααα·αα·αα·αα·ααα αααα»αα αα»αααΆααΆαααΆααααα ααΆααΆ Q ααΊααΆααΆααΆαααααααα»ααααα KDB+ αααα’αα»ααααΆαα±ααα’αααααααΎααΆαααΆαα½ααα·αααααααααααααααααααααα·αααααΆαα ααααααα·ααααΆ Q ααΆαααΆααα αααα α½α αα·αααααα·αααααΆα αααααααααααΆαα αααΆααααΆααααααΌαααΆααααααα αααααα ααα»αααααααΆααα·ααααααΆααΆααΆααα·α αααααΉααα·ααΆαααααααα»αααααΈααΆααααα α αΎαααΆααα αααα α½α αα·αααΆααααααΌααααααααΆαααα’αα»ααααΆαα±ααα’αααααΎααααααααααΆααααααααα·ααΈαα ααΎα’αααααααααα½α ααααα ααΈαααα»αααααΎα±ααααΆααΆααααααΆααααα½ααααα
αα αααα»αα’αααααααα ααΎαα’αα»αααααααααα·ααΈαααααααα αααα»α Q α αΎαα’ααααααα ααααΆα ααααΆαααααααΆα ααΎααααΈααααΎααΌα αααα’αααααΉαααααΌαααΆα Q αα·αααααΆαα α’αααα’αΆα ααΆααααααα 32 αααΈααααα₯ααα·ααααααα ααΎααα ααααααααααααα»αα αα»α kx - . αα ααΈααα ααααα·αααΎα’αααα αΆααα’αΆαααααα α’αααααΉαααααΎαααααααΆαααααα ααΎ Q ααααα αααα αα·αα’αααααααααααααΎαααααΆααααααα
ααΆααααααΎααααα αΆ
ααΆαααααααααααααΎααΆααΆαααΆαα½ααα·αααααααααααΆαα 25 ααΈααΈαα·ααΆααΈα αααααΆα KDB+ ααααΌαααΆαααααΎααΆα αααααααα»ααααααα α·ααααααααα» ααΎαααΉαααααααααΆαααααΆααΆααΆαααααα·ααααα·ααΆα (ααΆαα·ααααααα) αααααΆααα½αααΌα ααΆααααααα αααααααΆ (αααααααΆαα·αααΆαα·ααααΈαα·ααΆααΈ) αααΈα (ααΆαααααααααα»αα αα»ααα ααΎααααΆαα αα»α - αααα»αα αα»α IBM, Apple ααΆα,β¦), ααααα (ααααααααααΆαα αα»αααααΌαααΆααα·α), ααα α (ααα αααααα·ααααα·ααΆα) α α αααααααα 25 αα·ααααΈαα·ααΆααΈααΊααΆαα’αααΎα α·ααα αα·αααΌα ααα αα·ααα·αααΌααααα ααααααΆαααααααΆααΆααααααΆ αα·αααααααααααααααΆααααΌαααΆαααΆααΆαααα½α α αΎαα ααΆααΉαααΆαααΆαααΆααααα½ααααα»αααΆαα’αα»αααα buffering αα ααΎαααααααααΆαααα αα½αααΆαα dynamic buffering α’αΆαααααααΎααααα»ααα αα α»αααααα ααα»αααααααααΆααααΆαααΆαααα ααΎαααΉααααααααΎα αααααααααααα
ααααΆααααααααΌαααααΆααααΆααααΆααΈαααααΆαααα·αα·ααααααααΆα αΌαααΈαα½ααααΈαα½α sym αααα»ααααα»αααΆαααα»α - αααααα’αα·ααααΆ αααααααΆααααα ααα αααΌαααα ααααααΆαααΆαααααααααα αααααΆααααΆαααΆαααα ααΎαααΉαααααααααΆαα»αααΆαααΆααα’ααα’αΆα ααααΌαααΆαααααΆααΆαααααΎαα i.e. ααΎααααΈααα½αααΆααααααααααΈ ααΆαααααααααΆααααΎααααΈααΉαα ααα½αααΈα - αααααα αΆαα αα·ααααααα αΌαα α§ααΆα ααα α’αα»ααααα’αα·ααααΆ ααααα ααααΌαααΆααααααααααααααα·ααα ααα»ααααα’αα»ααααααααααα·αααΆαααα
ααΎαβααβααΉαβαααααβααΆβααΆαβααααααΈαβαα·ααααααβα αΌαβααααΌαβααΆαβαααααΆβααΆαβαααβααααΆα αααααΉααααααα±ααααΎαααΌαα±ααΆαααΎααααΈααααΎααΆαααααΆαα½αααΆααΈα α»ααααααααα»αααααα αα αααα»αααΆαα’αα»αααα ααΆαααααααααΆααααΎααααΈα’αΆα ααααΎααΆαααΆαα½αααΆααΈαα αα α»αααααα αα·ααα»α αααα»αααααΈαααααΆαα’αΆαααααααααααΊαα αααααΆααααΆαααΆααααααΎαααΉααα·ααα·α αΆαααΆααααΈαααααα
αα»αααΆαααααΆααααααΌααααα»α
αα»αααΆααααααΌααααα»ααααααααΌαααΆαααααΌαααΆαααΆαααΆααααααα αααα»αααΆαααααΆα±ααααΆαα αααΎαααΆααααα’αΆα ααααΎαα ααΆα ααΎααααΈαααααΎαααααα»αααΎααααΆααααα
- αααααααααα - αααααα’αα·ααααΆ - αααααα’αα·ααααΆαααα»ααα½αααΆααΈα
- αααααααΆα - αααααα’αααααααΆ - αααααα’αααααααΆαααα»ααα½αααΆααΈα
- FirstPrice - αααααααααΌα - αααααααααΌααααα»ααα½αααΆααΈα
- LastPrice - αααααα α»αααααα - αααααα α»αααααααααα»ααα½αααΆααΈα
- ααα αααααΌα - ααα αααααΌα - ααα αααΆαα·αααααααααααΌααααα»ααα½αααΆααΈα
- LastSize - ααα αα α»αααααα - ααα αααΆαα·αααααααα α»αααααααααα»ααααααααα½αααΆααΈα
- numTrades - ααΆαα i - α ααα½αααααΆααα½αααΌααααα»ααα½αααΆααΈα
- ααα·ααΆα - ααα αααα»α - ααααΌαααααα αααΆαα·ααααααααααα»ααα½αααΆααΈα
- pvolume β sum price β ααααΌαααααααααααα»ααα½αααΆααΈ ααΆαααΆααααααΆαα avgPrice α
- - ααααΌαααααα * ααα α - ααα·ααΆαααα»αααααααα·ααααα·ααΆααααα»ααα½αααΆααΈα
- avgPrice β pvolume%numTrades β αααααααΆααααααααα»ααα½αααΆααΈα
- avgSize β volume%numTrades β ααα αααΆαα·αααααααααΆααααααααα»ααα½αααΆααΈα
- vwap β turnover%volume β αααααααΆααααααααα»ααα½αααΆααΈααΆαααααααααΆαααα αααααα·ααααα·ααΆαα
- cumVolume - ααα·ααΆαααα»α - ααα ααααααααααααα·ααααα·ααΆαααααα½ααααα
α αΌαααΎααα·ααΆααααΆααααΆααααΌαα ααα»α ααααα·αα αααΆαααα½α - ααααα αΆααααααΎααα½αααααΆαααααααΆααΎαααααΌα αα·ααααααΆααααΆααΈαααααααααΆααααΈαα½ααα αα½αβααβαα½αβα ααα½αβααβααααααβαααααβααααΌαβααααΌαβααβααααΌαβααΆαβαααααβααΆβααααβααΆααβαααβαααβαααααβααααβααΆβαα·αβααααΌαβααΆαβαααααα ααααααααααα·αααα‘ααααααααααααααΌααααααααααΆ 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 αα·ααααααααΆαα αα ααΆαα»αααααααααΆααααΆαααΆααααα½α α₯α‘αΌαααα initWith ααΊααΆαααααΆαααααααααααα½α ααΆααααα ααΈααΆααΆαααα»αα α»αααααα αααααΆαα αααααΎααααΈααααα sym αα·ααααααααΆααααΉαααααΌαα α’αααα’αΆα ααααΎααΆααΎααααΈαααααααα½αααααΈαα ααΆααΆαα
ααΎαααΉαααααΌαααΆα aggCols αα ααααααααΎααα»αααΆααααααΌααααα»αα αααααΈααααΌαααααΆαααααα αααΆααααααΆαααααααΆααααααααααααα αααα»α Q ααααΌαααΆαααΆαααααα (ααΈααααΆααα ααααα)α ααααα ααΊααΎααααΈααΆααΆααΆααΆαααααΆααΈααααα·αααααααα cumVolume α αΆααααΆααααΈαα½ααααα½αα ααα½αα’αΆαααααααΎαα½ααα»αα
αα½αβααβαααβααααΌαβα ααααβαα βααΆααΈβααααΈβααΈβααΎαβαα»α αα½αβαα sym ααααΌαβααΆαβααααααβααΎααααΈβααΆααααα½αα
rollColumns:`sym`cumVolume;
α₯α‘αΌαβααΎαβα ααβαα½αβααβααΆβαααα»αβααΆαβααααβαααβααβαα½αβααααΎβαα αα α»ααααααααΆαα ααΈααααααα’αΆα ααααΌαααΆααααααΆαα:
- Accumulators (volume, turnover,..) β ααΎαααααΌααααααααααααα αΌααα ααΆααααααα»αα
- ααΆαα½αααΉαα ααα»α αα·ααα (ααααα ααΆα ..) - αααααααααΌααααα»αααΆααΈααααΌαααΆαααα ααααΈαα·ααααααα αΌα αα αααααααΌαααΆαααααΆαααααααΎαα»αααΆαα
- αααααΆαα αααααααααΆαααααααΎαα»αααΆαα
α αΌααααααα’ααααααααΆααααααΆααααΆαααααα
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]
αααα»αααΉααα·ααα·αααααΆαααα’α·αα’αααΈααααααααα’αΆαα»ααααααα αααα»αααααΈααααααΎααα ααΆαααααα αα·αααααΎαααΎαααααααααα»ααααα α αΎαααΆαα½αααααΆαα ααΆαα»αααααααααααααα½ααα!ααααααα ααΌα αααααα»αααΆαααααα½αα’αΆα ααααΌαααΆααααααααΌα ααΆαααααα:
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];
ααΎααααΈααΆαα αααΆααααΆαα αααα»αααΆαααααΎα’αα»ααααααα αααααααααααα’αααααααααΆααααααα Q αα ααΆααααααααα’αΆα ααααΌαααΆααααααΌααα α’αα»αααα eval αα·ααααααααΌαααΆααα αααα»ααα»αααΆαααααΎαααΎαα ααΌαα αααΆααααααααΆααααΎαααΆααα»αααααΌαααΆααααααααΆααΆαααααΆαα (α§. αα»αααΆααααααΆαα’αΆαα»ααααααααααΆαααααααααααααα) ααα’αα»ααααααααΎαααΎα α’αΆαα»ααααααα½α (ααΆααΆα) ααααΌαααΆαααΆααα ααααα·αβααΎβααΎαβα’αα»ααααβααααΎαααΆαβαα»αβαα βααΆααΆα ααΎαβααΉαβααα½αβααΆαβααΆααΆαβαααα αΆααα
ααααΆααααΆαααΈααΈαααΊααΆαααααΎαα αα α»ααααααααΆαααΆααΆαααα»αα ααααΌαααΎαααααα algorithm αααα»α pseudocodeα
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 ααΆααααααΎααααααΈααααΆαα»αααΆααα½αααα α αΎαααΎαα’αΆα α α ααΆαααααααΎαα»αααΆαααΈαα½αα (αααααΈ) ααΎααααΈααα½αααΆααααααΈαααααΈα
ααΎααααΈααΆααΆααΆαααα»ααααα½ααααααααΆαααααΆαα·αααααΌαααΆααα½ααα»α ααΎαααΉααααααΎαααααααααΆαααΎαααααΆαααααα ααααΌαβααΎαβαααααβαα»αααΆαβαααα»αβααΆαβααααΆβαα½αβααβααΈαα½αα αααβααααΎβα’αααβαα½αβααα αα·αβαααα αΌαβααΎααααΈβαααβαα βααΎβαα·ααααααβαααβαα½αβαααα αΌα αα·αβαααα αΌαα
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");
αα½αβααβαα½αβα ααα½αβααΆαβααααααβαα·ααα αααααβααααΌαβααααβααΆβαα·αβαα½αβααααΌαβααΆαβααααΆβαααβα’αα»ααααβααα ααΎαβα’αΆα βαααααβααΆαβααΆβααΆβααΆβααααΌαβαααβαα½αβαα [`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:{[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 ααΆααα½ααααα»ααα½αααΆααΈ) ααΊααααααΆααααΆαα αα αααα»αααααΈαααααα ααΆααΆααΏαααααααΆαααα»αααΆαααΎαααααΎαααΆαααααΌαααΆα αααΎα (α¬ααΌααααΈααααααΌαααΆαααα·α) ααααααΆαααα αααααΈαα½ααααααΎαααΆαααααααααααα½α’ααααααα»αααααα ααααααΆαααΆααααα ααααααααΊαα½αα±ααα αΆααα’αΆαααααααααααΆααααΆααΆαααααΆαααααααααααααααααΎααΆααααα»ααα·ααααααααΆα ααααα
αααα½αα’αΆα ααΎαα‘αΎαααΆα ααα»α’αααΈααΆαααΆαααααααΆααΎαα‘αΎααα·αααααΎααααΆααΆαα½αααΉαααα αααααΆαααααΎαα αα α»ααααααααΆαααΈαα½ααα α ααα»ααααΊααΆ αα»αααΆααα½α ααΆααα·ααα αα»αααΆα C αααααΆαααααα·αααααΆαααΆα updateAgg α α αΆααααααΎαααΈααα αα’αΆαααααααΆααααΆαα (αααα αα 10.000) updateAgg ααΆαααααα·ααΆαααααααΆ α αΎααααααΆαααααααααααΆααααα·ααααα·ααααααΆαα·αα’αΆαααααααΎααα αα’αΆααααααααααα ααΆααΎαα‘αΎααααααΆαααα αΆαααα Q αααααααΆααααα’αΆα ααααΆαααα·ααΆααα·ααααααααααααα ααααααα αΆαααΈααΆααααααΆααααααΆαααααΎαααΎααααα½ααααααααΆαααααΉαααααΌααα αααααααΎααΆαααΆαα½ααα·ααααααααα α ααα»α αα½ααααααΊααΆααααα»ααα·αααααααααα»αα’αααα αα αΆαααααΉαααααΌαα ααααα·αααΎαα·αααααααα·αααααΌαααΆααααααΆαα»αααΆαα½α α¬αα·αααααΌαααΆααααααΆαα·αααΆααααααααΆαα αααααΎαααΉααααΆαααΆαα½αααΏαααΌα ααΆ ααΆααααααΆαααααααΆαα TLB - α’ααααααΆαααα’αΆααααααΆααααααα’αααα αα αΆααα αααα»αααααΆαααααααΆααα’αΆααααααΆαααααΎαααΆαα ααΆααααααααα’αΆααααααΆαααααΌαα αααΆααααααΌαααΆαααααααα αα 30 αα ααααα·αααΎαα·ααααααα α αΎαααααα·αααΎαα·ααααααααααΌαααΆαααα αΆααααα αΆα ααΆα’αΆα αααααααααΆααααααΆα αααΎαααα
ααα ααααΈααααα·ααααΆα
αα αααα»αα’αααααααα αααα»αααΆααααα αΆαααΆ ααΌαααααΆααα·αααααα KDB+ αα·α Q ααΊαααααααα·αααααΉααααααααΆαααααααΆαα»ααα·αααααααα αα·αααΆααααα½αα αΌαααααΎααΆααΆααααααΆαααααΎαααΎαααα»ααααααα ααα»αααααααααΆαααααααΆαααααααΎαααααΆααααααααΎαααΆααα·αααααααααααΆααααααααΆαααααΆααα·ααααααααΆααααααΆααα½α/ααΈα αααΆααααΌααααΈαααα αααα»α ααααΎαααΆα Q αααα½αα ααΆααΆ Q αααα½αααΆα’αα»ααααΆαα±ααααΆαααΆαα’αα»αααααααΆααααααα αα·αααΆαααααα·αααααΆααααααα½ααααααααΆαααΆααααααΉαααααΎαααΆααα·αααααα αααααΆαααααααααα·α αααααααααΆ α’αααααααααααΆααΆ SQL αααααααΆααααααΆαα½α αα·ααααα»ααα»αααΆααααααΆαααααααααααα
αααα»αααΉαααααααααΆααααΆααΆαααΎααααΆααααααΆαααααααα’αααΈααα Q α’αΆα
ααααΎααΆα ααΆααΆααααααααα·αααααααααααααααααααααα α§ααΆα ααα αα·ααΈααΆα IPC ααααΆαααααααα»αααααα»αααααααααααΆαααααΎαααΆα Q ααΈαα½αα αα·αα’αα»ααααΆαα±ααα’ααααααα
αΌαααααΆααΆααααααααααΎαααΆαααΆααααααα
αααα»ααααααΆααααα½α αααα’αΆα
ααΆαααΈααΆαααα
ααΎαααΆαααΈαααααΆαααα·ααα
αααα»αααααααααααααααα·αααααα
ααααα: www.habr.com
