final MarketTradeSequencing sequencing, final PriceValue price,
final SizeValue size, final TimeValue time, final TimeValue date) {
final MarketBarType barType = session == EXTENDED ? CURRENT_EXT
: CURRENT;
final MarketDoBar bar = loadBar(barType.field);
eventAdd(barType.event);
// Reset current bar if session day changes
final TimeValue prevDate = bar.get(TRADE_DATE);
if (session == DEFAULT && !prevDate.isNull() && !date.equals(prevDate)) {
log.debug("New day code: old=" + prevDate + "; new=" + date);
bar.set(MarketBarField.OPEN, price);
bar.set(MarketBarField.HIGH, price);
bar.set(MarketBarField.LOW, price);
bar.set(MarketBarField.INTEREST, size);
bar.set(MarketBarField.VOLUME, size);
setState(MarketStateEntry.IS_SETTLED, false);
} else {
// ### volume
final SizeValue volumeOld = bar.get(VOLUME);
final SizeValue volumeNew = volumeOld.add(size);
bar.set(VOLUME, volumeNew);
eventAdd(NEW_VOLUME);
}
// ### last
// Only update last for normal in-sequence trades
if (sequencing == NORMAL) {
if (price.isNull()) {
log.warn("null or zero price on trade message, not applying to bar");
} else {
bar.set(CLOSE, price);
if (session == DEFAULT) {
// events only for combo
eventAdd(NEW_CLOSE);
}
// ### time
bar.set(BAR_TIME, time);
}
} else {
// XXX: Update high / low, or just wait for refresh?
}
bar.set(MarketBarField.TRADE_DATE, date);
}