我正在postgresql中编写一个函数来从我拥有的一组股票数据中获取蜡烛信息。为了绘制蜡烛,我需要获得某个时间段(比如说1天)的开盘价,收盘价,最高价和最低价,所以我需要当天的开盘价,即当天的收盘价,最高值。当天的价值和当天的最低价值。
我在postgresql中创建了一个函数,以便在特定时间段内给我一个蜡烛
CREATE OR REPLACE FUNCTION getcandle(
starttime timestamp without time zone,
endtime timestamp without time zone,
psymbol character varying)
RETURNS candle AS
$BODY$
select
startTime,
(select value as open FROM "4" WHERE datetime >= startTime and symbol = pSymbol ORDER BY datetime ASC limit 1),
(select value as close FROM "4" WHERE datetime <= endTime and symbol = pSymbol ORDER BY datetime DESC limit 1),
(select max(value) as high FROM "4" WHERE datetime >= startTime and datetime <= endTime and symbol = pSymbol),
(select min(value) as low FROM "4" WHERE datetime >= startTime and datetime <= endTime and symbol = pSymbol); $BODY$
LANGUAGE sql VOLATILE
当我在特定时间运行时,我会得到类似的结果:
select * from getCandle('2015-06-26 08:30:00', '2015-06-26 08:35:00', 'AAPL')
start |open |close |high |low
---------------------|------|------|------|------
"2015-06-26 08:30:00"|127.51|127.32|127.51|127.23
现在我想编写另一个选择特定时间段内所有蜡烛的函数,我称之为getCandles,这就是我迄今为止所用的大量Google搜索。
CREATE FUNCTION getCandles(startTime timestamp, endTime timestamp, pSymbol varchar, candleWidth int) RETURNS SETOF candle as $$
declare
numberOfCandles int;
candles candle%rowtype;
localStart timeStamp;
localEnd timeStamp;
begin
numberOfCandles := (SELECT EXTRACT(EPOCH FROM (endTime - startTime))) / candleWidth;
FOR i IN 1 .. numberOfCandles LOOP
localStart := startTime + interval candleWidth * (i - 1) ' seconds';
localEnd := startTime + + interval candleWidth * i ' seconds';
candles := getCandle(localStart, localEnd, pSymbol);
return next candles;
end loop;
return;
$$ language 'plpgsql';;
我最大的问题是,当我运行时,我得到了这个:
ERROR: syntax error at or near "*"
LINE 10: localStart := startTime + interval candleWidth * (i - i) ...
^
********** Error **********
ERROR: syntax error at or near "*"
SQL state: 42601
Character: 414
所以我的问题如下:
1)如何使用for循环将时间范围增加x秒?
2)我是否正确地在烛台变量中添加行?
3)有没有更好的方法来做其中任何一个?
顺便说一下,我正在使用所有这些信息并使用不同的程序绘制图表。我宁愿不从帖子收集所有信息并将其发送到我的程序,因为我每天收集近10k记录,所以如果我计算7天或一个月的蜡烛,那将是一个巨大的数据请求。编写一组能够清除我需要的数据的函数似乎更好。非常感谢,Stack是一个了不起的资源,我不知道没有它我会做什么。
答案 0 :(得分:0)
我明白了,对于那些遇到同样问题的人来说,这是我的固定功能。
CREATE FUNCTION getCandles(startTime timestamp, endTime timestamp, pSymbol varchar, candleWidth int) RETURNS SETOF candle as $$
declare
numberOfCandles int;
candles candle%rowtype;
localStart timeStamp;
localEnd timeStamp;
begin
numberOfCandles := (SELECT EXTRACT(EPOCH FROM (endTime - startTime))) / candleWidth;
FOR i IN 1 .. numberOfCandles LOOP
localStart := startTime + (candleWidth * (i - 1) * interval '1 second');
localEnd := startTime + (candleWidth * i * interval '1 second');
candles := getCandle(localStart, localEnd, pSymbol);
return next candles;
end loop;
return;
end
$$ language plpgsql;
我的错误是翻转间隔和烛光。