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 日にほぼ 10,000 レコードを収集しているため、7 日または 1 か月のローソク足を計算すると、膨大なデータ要求になります。必要なデータを取り除く一連の関数を作成する方がよいように思われました。どうもありがとうございます。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;

私の間違いは、間隔とキャンドル幅を反転していました。

于 2015-06-28T23:04:18.200 に答える