0

esper でデータ処理時間を記録したいので、例としてボリンジャー バンドを選択します。ボリンジャーバンドには、移動平均線(MA)と呼ばれるものがあります。株価平均を計算した結果から得られたMA。この場合、win:length(20) を設定します。したがって、MA は、データ ウィンドウ ビューに存在する 20 のイベントから株価平均を計算した結果から取得できます。以下は私が作成したコードです。

public class BollingerBand {
    static double startTime, finishTime;

    public static void main (String [] args){
        Configuration configuration = new Configuration();
        configuration.addEventType("Stock", Stock.class);

        EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider(configuration);
        AdapterInputSource source = new AdapterInputSource("BollingerBand.csv");

        EPStatement statement = epService.getEPAdministrator().createEPL("insert into Aggregation " +
                "select prevcount(symbol), symbol, avg(price) as SimpleMovingAverage, stddev(price) as StandardDeviation, " +
                "last(price) as price, last(timestamp) as date from Stock.std:groupwin(symbol).win:length(20)" +
                " group by symbol having count(*) >=20");

        statement.addListener(new UpdateListener() {

            public void update(EventBean[] newEvents, EventBean[] oldEvents) {
                // TODO Auto-generated method stub
                //System.out.println("Event Receive : "+newEvents[0].getUnderlying());
                startTime = System.currentTimeMillis();
                System.out.println("\nStart time : " + startTime + " miliseconds\n");
            }
        });

        EPStatement statement2 = epService.getEPAdministrator().createEPL("select symbol, " +
                 "SimpleMovingAverage + 2*StandardDeviation as UpperBand," +
                 "SimpleMovingAverage as MiddleBand," +
                 "SimpleMovingAverage - 2*StandardDeviation as LowerBand," +
                 "price," +
                 "4*StandardDeviation/SimpleMovingAverage as Bandwidth," +
                 "(price - (SimpleMovingAverage - (2 * StandardDeviation))) / ((SimpleMovingAverage + " +
                 "(2 * StandardDeviation)) - (SimpleMovingAverage - (2 * StandardDeviation))) as PercentB," +
                 "date from Aggregation");

        statement2.addListener(new UpdateListener() {

            public void update(EventBean[] newEvents, EventBean[] oldEvents) {
                // TODO Auto-generated method stub
                //System.out.println("Event Receive : "+newEvents[0].getUnderlying());
                finishTime = System.currentTimeMillis();
                System.out.println("Start time : " + startTime + " miliseconds");
                System.out.println("Finish time : " + finishTime + " miliseconds");
                System.out.println("Processing time : " + (finishTime-startTime) + " miliseconds");
            }
        });

        (new CSVInputAdapter(epService, source, "Stock")).start();
    }

}

上記のコードから、平均が計算された場合に時間が記録されます。しかし、私が必要としているのは、20 番目のイベントと次のイベントがデータ ウィンドウ ビューに入ったときに時間を記録することです。ボリンジャーバンドの計算結果から得られる開始時刻と終了時刻のとおりです。私の質問は、20 番目のイベントの時間を記録し、同時に次のイベントをウィンドウ ビュー データに入力する方法です。助けてください

4

2 に答える 2

0

CSV アダプターは、イベントが送信されたときにコールバックを提供しません。ただし、そのコードは簡単に変更できます。または、別の CSV リーダーを使用して、ランタイム API 経由でイベントを送信することもできます。

于 2013-06-10T12:14:39.083 に答える
0

たぶん、(item_count とタイムスタンプ) のキーと値のペアを取るマップがあるある種の TickCounter があります。これを 2 番目の UpdateListener で更新すると、もちろんキー 20 の項目をいつでも検索できます。

ところで、ボリンジャー バンド計算を使用しましたが、Storm と EsperBolt を使用しました。ここでそれについてブログを書いた: http://chanchal.wordpress.com/2014/07/08/using-esperbolt-and-storm-to-calculate-bollinger-bands/

于 2014-07-08T13:06:35.407 に答える