package com.activequant.messages;
import java.util.List;
import com.activequant.domainmodel.OHLCV;
import com.activequant.domainmodel.TimeStamp;
import com.activequant.domainmodel.streaming.AccountDataEvent;
import com.activequant.domainmodel.streaming.InformationalEvent;
import com.activequant.domainmodel.streaming.MarketDataSnapshot;
import com.activequant.domainmodel.streaming.PositionEvent;
import com.activequant.domainmodel.streaming.Tick;
import com.activequant.domainmodel.streaming.TimeStreamEvent;
import com.activequant.domainmodel.trade.event.OrderAcceptedEvent;
import com.activequant.domainmodel.trade.event.OrderCancelSubmittedEvent;
import com.activequant.domainmodel.trade.event.OrderCancellationRejectedEvent;
import com.activequant.domainmodel.trade.event.OrderCancelledEvent;
import com.activequant.domainmodel.trade.event.OrderEvent;
import com.activequant.domainmodel.trade.event.OrderFillEvent;
import com.activequant.domainmodel.trade.event.OrderRejectedEvent;
import com.activequant.domainmodel.trade.event.OrderReplacedEvent;
import com.activequant.domainmodel.trade.event.OrderSubmittedEvent;
import com.activequant.domainmodel.trade.event.OrderUpdateRejectedEvent;
import com.activequant.domainmodel.trade.event.OrderUpdateSubmittedEvent;
import com.activequant.domainmodel.trade.order.LimitOrder;
import com.activequant.domainmodel.trade.order.MarketOrder;
import com.activequant.domainmodel.trade.order.OrderSide;
import com.activequant.domainmodel.trade.order.SingleLegOrder;
import com.activequant.domainmodel.trade.order.StopOrder;
import com.activequant.messages.AQMessages.BaseMessage;
import com.activequant.utils.ArrayUtils;
import com.google.protobuf.ExtensionRegistry;
import com.google.protobuf.InvalidProtocolBufferException;
/**
* Marshaller for MDS messages. TODO: fix the functionality clash between this
* and the message factory. Should be merged.
*
* @author GhostRider
*
*/
@Deprecated
public class Marshaller {
MessageFactory2 mf = new MessageFactory2();
ExtensionRegistry registry;
public Marshaller() {
registry = ExtensionRegistry.newInstance();
AQMessages.registerAllExtensions(registry);
}
/**
* faster marshaller for MDS. Use message factory implementation instead
*
* @param mdiId
* @param bidPrices
* @param askPrices
* @param bidSizes
* @param askSizes
* @return
*/
@Deprecated
public byte[] marshallToMDS(String mdiId, List<Double> bidPrices,
List<Double> askPrices, List<Double> bidSizes, List<Double> askSizes) {
return (marshallToMDS(mdiId, bidPrices, askPrices, bidSizes, askSizes,
false));
}
@Deprecated
/**
* Use message factory implementation instead.
*
* @param mdiId
* @param bidPrices
* @param askPrices
* @param bidSizes
* @param askSizes
* @param resend
* @return
*/
public byte[] marshallToMDS(String mdiId, List<Double> bidPrices,
List<Double> askPrices, List<Double> bidSizes,
List<Double> askSizes, boolean resend) {
BaseMessage mdsm = mf.buildMds(mdiId, bidPrices, askPrices, bidSizes,
askSizes, resend);
return mdsm.toByteArray();
}
public byte[] marshall(MarketDataSnapshot mds)
throws InvalidProtocolBufferException {
BaseMessage mdsm = mf.buildMds(mds.getMdiId(),
ArrayUtils.toDoubleList(mds.getBidPrices()),
ArrayUtils.toDoubleList(mds.getAskPrices()),
ArrayUtils.toDoubleList(mds.getBidSizes()),
ArrayUtils.toDoubleList(mds.getAskSizes()), mds.isResend());
return mdsm.toByteArray();
}
public AQMessages.BaseMessage demarshall(byte[] in)
throws InvalidProtocolBufferException {
return AQMessages.BaseMessage.parseFrom(in, registry);
}
public OrderEvent demarshallOrderEvent(AQMessages.BaseMessage bm) {
switch (bm.getType()) {
case ORD_ACCPTD:
return demarshall((AQMessages.OrderAccepted) bm
.getExtension(AQMessages.OrderAccepted.cmd));
case ORD_SUBMITTED:
return demarshall((AQMessages.OrderSubmitted) bm
.getExtension(AQMessages.OrderSubmitted.cmd));
case ORD_CANCEL_SUBMITTED:
return demarshall((AQMessages.OrderCancelSubmitted) bm
.getExtension(AQMessages.OrderCancelSubmitted.cmd));
case ORD_CANCELLED:
return demarshall((AQMessages.OrderCancelled) bm
.getExtension(AQMessages.OrderCancelled.cmd));
case ORD_CNCL_REJ:
return demarshall((AQMessages.OrderCancelReject) bm
.getExtension(AQMessages.OrderCancelReject.cmd));
case ORD_REJ:
return demarshall((AQMessages.OrderRejected) bm
.getExtension(AQMessages.OrderRejected.cmd));
case ORD_UPDATE_SUBMITTED:
return demarshall((AQMessages.OrderUpdateSubmitted) bm
.getExtension(AQMessages.OrderUpdateSubmitted.cmd));
case ORD_UPD_REJECTED:
return demarshall((AQMessages.OrderUpdateRejected) bm
.getExtension(AQMessages.OrderUpdateRejected.cmd));
case ORD_UPDATED:
return demarshall((AQMessages.OrderUpdated) bm
.getExtension(AQMessages.OrderUpdated.cmd));
case EXECUTION_REPORT2:
return demarshall((AQMessages.ExecutionReport2) bm
.getExtension(AQMessages.ExecutionReport2.cmd));
}
// nothing ...
return null;
}
public TimeStreamEvent demarshall(AQMessages.ServerTime in) {
TimeStreamEvent tse = new TimeStreamEvent(new TimeStamp(
in.getTimestamp()));
return tse;
}
public AccountDataEvent demarshall(AQMessages.AccountDataMessage adm) {
AccountDataEvent ad = new AccountDataEvent(new TimeStamp(),
adm.getType(), adm.getValue());
return ad;
}
public OrderFillEvent demarshall(AQMessages.ExecutionReport2 adm) {
OrderFillEvent ofe = new OrderFillEvent();
ofe.setRefOrderId(adm.getClOrdId());
ofe.setExecId(adm.getExecId());
ofe.setFillPrice(adm.getPrice());
ofe.setFillAmount(adm.getQty());
ofe.setSide(OrderSide.valueOf(adm.getSide()));
ofe.setOptionalInstId(adm.getTdiId());
ofe.setLeftQuantity(adm.getQuantityLeft());
ofe.setTimeStamp(new TimeStamp(adm.getTransactTime()));
return ofe;
}
public void demarshall(AQMessages.Login adm) {
}
public void demarshall(AQMessages.LoginResponse adm) {
}
public String demarshall(AQMessages.CustomCommand adm) {
return adm.getCommand();
}
public OrderAcceptedEvent demarshall(AQMessages.OrderAccepted adm) {
OrderAcceptedEvent oae = new OrderAcceptedEvent();
oae.setRefOrderId(adm.getClOrdId());
oae.setTimeStamp(new TimeStamp());
return oae;
}
public OrderCancelledEvent demarshall(AQMessages.OrderCancelled adm) {
OrderCancelledEvent oce = new OrderCancelledEvent();
oce.setRefOrderId(adm.getClOrdId());
oce.setTimeStamp(new TimeStamp());
return oce;
}
public OrderCancellationRejectedEvent demarshall(
AQMessages.OrderCancelReject adm) {
OrderCancellationRejectedEvent ocr = new OrderCancellationRejectedEvent();
ocr.setRefOrderId(adm.getClOrdId());
ocr.setTimeStamp(new TimeStamp());
ocr.setReason(adm.getClxRejReason());
return ocr;
}
public OrderCancelSubmittedEvent demarshall(
AQMessages.OrderCancelSubmitted adm) {
OrderCancelSubmittedEvent ocse = new OrderCancelSubmittedEvent();
ocse.setRefOrderId(adm.getClOrdId());
ocse.setTimeStamp(new TimeStamp());
return ocse;
}
public OrderRejectedEvent demarshall(AQMessages.OrderRejected adm) {
OrderRejectedEvent ore = new OrderRejectedEvent();
ore.setRefOrderId(adm.getClOrdId());
ore.setTimeStamp(new TimeStamp());
ore.setReason(adm.getReason());
return ore;
}
public OrderSubmittedEvent demarshall(AQMessages.OrderSubmitted adm) {
OrderSubmittedEvent ose = new OrderSubmittedEvent();
ose.setRefOrderId(adm.getClOrdId());
ose.setTimeStamp(new TimeStamp());
return ose;
}
public OrderReplacedEvent demarshall(AQMessages.OrderUpdated adm) {
OrderReplacedEvent ore = new OrderReplacedEvent();
ore.setRefOrderId(adm.getClOrdId());
ore.setTimeStamp(new TimeStamp());
return ore;
}
public OrderUpdateRejectedEvent demarshall(
AQMessages.OrderUpdateRejected adm) {
OrderUpdateRejectedEvent oure = new OrderUpdateRejectedEvent();
oure.setRefOrderId(adm.getClOrdId());
oure.setTimeStamp(new TimeStamp());
oure.setReason(adm.getReason());
return oure;
}
public SingleLegOrder demarshall(AQMessages.NewOrder newOrder) {
Double limitPrice = null;
Double stopPrice = null;
SingleLegOrder slo = null;
switch (newOrder.getOrdType()) {
case 1: {
// market order ...
slo = new MarketOrder();
slo.setOrderId(newOrder.getClOrdId());
slo.setTradInstId(newOrder.getTradInstId());
slo.setOrderSide(newOrder.getSide() == 1 ? OrderSide.BUY
: OrderSide.SELL);
slo.setQuantity(newOrder.getOrderQty());
slo.setOpenQuantity(newOrder.getOrderQty());
break;
}
case 2: {
// limit order ...
slo = new LimitOrder();
slo.setOrderId(newOrder.getClOrdId());
slo.setTradInstId(newOrder.getTradInstId());
slo.setOrderSide(newOrder.getSide() == 1 ? OrderSide.BUY
: OrderSide.SELL);
slo.setQuantity(newOrder.getOrderQty());
slo.setOpenQuantity(newOrder.getOrderQty());
((LimitOrder) slo).setLimitPrice(newOrder.getPrice());
break;
}
case 3: {
// stop order ...
slo = new StopOrder();
slo.setOrderId(newOrder.getClOrdId());
slo.setTradInstId(newOrder.getTradInstId());
slo.setOrderSide(newOrder.getSide() == 1 ? OrderSide.BUY
: OrderSide.SELL);
slo.setQuantity(newOrder.getOrderQty());
slo.setOpenQuantity(newOrder.getOrderQty());
((StopOrder) slo).setStopPrice(newOrder.getPrice());
break;
}
default: {
break;
}
}
return slo;
}
public OrderUpdateSubmittedEvent demarshall(
AQMessages.OrderUpdateSubmitted adm) {
OrderUpdateSubmittedEvent ouse = new OrderUpdateSubmittedEvent();
ouse.setRefOrderId(adm.getClOrdId());
ouse.setTimeStamp(new TimeStamp());
return ouse;
}
public PositionEvent demarshall(AQMessages.PositionReport adm) {
PositionEvent pos = new PositionEvent(adm.getTradInstId(),
new TimeStamp(), adm.getEntryPrice(), adm.getQuantity());
return pos;
}
public void demarshall(AQMessages.SecurityStatus adm) {
}
public InformationalEvent demarshall(AQMessages.InfoEvent adm) {
InformationalEvent ie = new InformationalEvent(new TimeStamp(
adm.getTimestamp()), adm.getMessage());
return ie;
}
public OHLCV demarshall(AQMessages.OHLC adm) {
OHLCV ie = new OHLCV();
ie.setOpen(adm.getOpen());
ie.setClose(adm.getClose());
ie.setHigh(adm.getHigh());
ie.setLow(adm.getLow());
ie.setTimeStamp(new TimeStamp(adm.getTimestamp()));
ie.setMdiId(adm.getMdiId());
return ie;
}
public Tick demarshall(AQMessages.Tick tick) {
Tick ret = new Tick(tick.getMdiId(),
new TimeStamp(tick.getTimestamp()), tick.getPrice(),
tick.getQuantity(), tick.getTickDirection());
return ret;
}
public MarketDataSnapshot demarshall(AQMessages.MarketDataSnapshot mdsm) {
MarketDataSnapshot mds = new MarketDataSnapshot();
mds.setMdiId(mdsm.getMdiId());
mds.setTimeStamp(new TimeStamp(mdsm.getTimestamp()));
mds.setBidPrices(ArrayUtils.toPrimArray(mdsm.getBidPxList()));
mds.setAskPrices(ArrayUtils.toPrimArray(mdsm.getAskPxList()));
mds.setBidSizes(ArrayUtils.toPrimArray(mdsm.getBidQList()));
mds.setAskSizes(ArrayUtils.toPrimArray(mdsm.getAskQList()));
if (mdsm.hasResend())
mds.setResend(mdsm.getResend());
return mds;
}
}