0

我正在 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,这是迄今为止我在谷歌上搜索的内容。

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)有没有更好的方法来做这些?

顺便说一句,我正在获取所有这些信息并使用不同的程序绘制它。我宁愿不从帖子中收集所有信息并将其发送到我的程序,因为我每天要收集近 1 万条记录,所以如果我计算 7 天或一个月的蜡烛,这将是一个巨大的数据请求。编写一组函数来清除我需要的数据似乎更好。非常感谢,Stack 是一个了不起的资源,如果没有它,我不知道该怎么办。

4

1 回答 1

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;

我的错误是翻转间隔和candleWidth。

于 2015-06-28T23:04:18.200 回答