/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.example.stockticker;
import com.espertech.esper.example.stockticker.eventbean.PriceLimit;
import com.espertech.esper.example.stockticker.eventbean.StockTick;
import java.util.LinkedList;
import java.util.Random;
public class StockTickerEventGenerator {
private Random random = new Random(System.currentTimeMillis());
public LinkedList<Object> makeEventStream(int numberOfTicks,
int ratioOutOfLimit,
int numberOfStocks,
double priceLimitPctLowerLimit,
double priceLimitPctUpperLimit,
double priceLowerLimit,
double priceUpperLimit,
boolean isLastTickOutOfLimit) {
LinkedList<Object> stream = new LinkedList<Object>();
PriceLimit[] limitBeans = makeLimits("example_user", numberOfStocks, priceLimitPctLowerLimit, priceLimitPctUpperLimit);
for (int i = 0; i < limitBeans.length; i++) {
stream.add(limitBeans[i]);
}
// The first stock ticker sets up an initial price
StockTick[] initialPrices = makeInitialPriceStockTicks(limitBeans, priceLowerLimit, priceUpperLimit);
for (int i = 0; i < initialPrices.length; i++) {
stream.add(initialPrices[i]);
}
for (int i = 0; i < numberOfTicks; i++) {
int index = i % limitBeans.length;
StockTick tick = makeStockTick(limitBeans[index], initialPrices[index]);
// Generate an out-of-limit price
if ((i % ratioOutOfLimit) == 0) {
tick = new StockTick(tick.getStockSymbol(), -1);
}
// Last tick is out-of-limit as well
if ((i == (numberOfTicks - 1)) && isLastTickOutOfLimit) {
tick = new StockTick(tick.getStockSymbol(), 9999);
}
stream.add(tick);
}
return stream;
}
public StockTick makeStockTick(PriceLimit limitBean, StockTick initialPrice) {
String stockSymbol = limitBean.getStockSymbol();
double range = initialPrice.getPrice() * limitBean.getLimitPct() / 100;
double price = initialPrice.getPrice() - range + (range * 2 * random.nextDouble());
double priceReducedPrecision = to1tenthPrecision(price);
if (priceReducedPrecision < (initialPrice.getPrice() - range)) {
priceReducedPrecision = initialPrice.getPrice();
}
if (priceReducedPrecision > (initialPrice.getPrice() + range)) {
priceReducedPrecision = initialPrice.getPrice();
}
return new StockTick(stockSymbol, priceReducedPrecision);
}
public PriceLimit[] makeLimits(String userName,
int numBeans,
double limitPctLowerBoundary,
double limitPctUpperBoundary) {
PriceLimit[] limitBeans = new PriceLimit[numBeans];
for (int i = 0; i < numBeans; i++) {
String stockSymbol = "SYM_" + i;
double diff = limitPctUpperBoundary - limitPctLowerBoundary;
double limitPct = limitPctLowerBoundary + (random.nextDouble() * diff);
limitBeans[i] = new PriceLimit(userName, stockSymbol, to1tenthPrecision(limitPct));
}
return limitBeans;
}
public StockTick[] makeInitialPriceStockTicks(PriceLimit[] limitBeans,
double priceLowerBoundary,
double priceUpperBoundary) {
StockTick[] stockTickBeans = new StockTick[limitBeans.length];
for (int i = 0; i < stockTickBeans.length; i++) {
String stockSymbol = limitBeans[i].getStockSymbol();
// Determine a random price
double diff = priceUpperBoundary - priceLowerBoundary;
double price = priceLowerBoundary + random.nextDouble() * diff;
stockTickBeans[i] = new StockTick(stockSymbol, to1tenthPrecision(price));
}
return stockTickBeans;
}
private double to1tenthPrecision(double aDouble) {
int intValue = (int) (aDouble * 10);
return intValue / 10.0;
}
}