Łukasz
Tomaszkiewicz
Członek Rady
Nadzorczej HFT
Brokers S.A.
Temat: Wydobywanie świeczek z danych tickowych
Witam,Byłbym bardzo wdzięczy za pomoc w rozwiązaniu następującego problemu związanego z wybieraniem pierwszego i ostatniego rekordu w danej grupie GROUP BY:
Mam tabelę Ticks składającą się z pól:
Provider (int)
Symbol (int)
Time (datetime)
Bid (decimal(18,5))
Ask (decimal(18,5))
Tabela zawiera dane o każdej pojedynczej zmianie wartości wybranych instrumentów finansowych (Bid/Ask to ceny kupna/sprzedaży) w danym czasie Time, Symbol to identyfikator symbolu, Provider to dostawca danych (w bazie znajdują się informacje od kilku dostawców).
Ponieważ szeregi czasowe zazwyczaj analizuje się w formie tzw. świeczek japońskich, szukam sposobu na możliwie łatwą zamianę danych tickowych na świeczki.
Świeczka to najprościej rzecz ujmując struktura składająca się z: symbolu, czasu otwarcia świczki, ceny Open, ceny High, ceny Low oraz ceny Close.
Świeczki wyznacza się dla danego przedziału czasowego np. świeczka piętnastomintowa o czasie otwarcia 15:00 obejmuje wszystkie ticki z przedziału [15:00, 15:15).
W tym przypadku cena Open to pierwszy rekord w bazie o Time >= 15:00, High to maksymalna cena z tego przedziału czasowego, Low analogicznie, Close to ostatnia cena przed 15:15.
Oczywiście takie świeczki można zrobić w zewnętrznym programie który to przetworzy, ale po pierwsze będzie to mniej elastyczne, a po drugie niczego się nie nauczę (SQL Servera używam od niedawna).
Na chwilę obecną skonstruowałem część zapytania:
SELECT
Provider,
Symbol,
CONVERT(Date,Time,101) AS Date,
DATEPART(HOUR,Time) AS Hour,
(DATEPART(MINUTE,Time) - (DATEPART(MINUTE,Time) % 15)) AS Minute,
MAX(Bid) AS High,
MIN(Bid) AS Low,
COUNT(*) AS TickCount
FROM
Ticks
GROUP BY
Provider,
Symbol,
CONVERT(Date,Time,101),
DATEPART(HOUR,Time),
(DATEPART(MINUTE,Time) - (DATEPART(MINUTE,Time) % 15))
ORDER BY
Symbol,
Date,
Hour,
Minute
Moja prośba i problem dotyczy ustalenia cen Open i Close.
W jaki sposób mogę poprosić SQL Servera o podanie mi pierwszego i ostatniego rekordu w danej grupie?
(bo do tego cały problem się sprowadza, aby dla każdej wyjściowej grupy wydobyć pierwszy i ostatni chronologicznie [Time] rekord)
(Próbowałem kilku zapytań z subquery, no ale delikatnie mówiąc nie bardzo wychodzą...)