Как записать время прибытия события в esper
Я хочу записать время обработки данных в esper и в качестве примера выбираю полосу Боллинджера. В полосе Боллинджера она называется скользящей средней (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-го события и одновременно ввести следующее событие в окно просмотра данных. пожалуйста помоги
2 ответа
Адаптер CSV не обеспечивает обратный вызов при отправке событий. Однако вы можете легко изменить его код. Или вы можете использовать другой читатель CSV и отправлять события через API времени выполнения.
Может быть, есть какой-то тип TickCounter, в котором есть карта, которая принимает пару ключ-значение (item_count и timestamp). Вы обновляете это во втором UpdateListener и, конечно же, всегда можете найти элемент с ключом 20.
Кстати, я использовал ваш расчет полос Боллинджера, но с использованием Storm и EsperBolt. Об этом написали в блоге: http://chanchal.wordpress.com/2014/07/08/using-esperbolt-and-storm-to-calculate-bollinger-bands/