}
Order signal;
//convert everything to relatives, should have already been relatives?
RelativeNumber limit = (RelativeNumber)request.get(Parameter.RelativeLimitOrder);
if (limit != null) {
OrderProcessor limitProcessor = new OrderProcessorLimit(timeToExecute, symbol,limit);
signal = new Order(this, id, instrument, symbol, action, quantityComputable, cancelAtMs, timeInForce,limitProcessor,conditionalUponOrder);
} else {
RelativeNumber stop = (RelativeNumber)request.get(Parameter.RelativeStopOrder);
if (stop != null) {
OrderProcessor stopProcessor = new OrderProcessorStop(timeToExecute, symbol,stop);
signal = new Order(this, id, instrument, symbol, action, quantityComputable, cancelAtMs, timeInForce, stopProcessor,conditionalUponOrder);
} else {
//market
OrderProcessor marketProcessor = new OrderProcessorMarket(timeToExecute, symbol);
signal = new Order(this, id, instrument, symbol, action, quantityComputable, cancelAtMs, timeInForce, marketProcessor,conditionalUponOrder);
}
}
Integer ocaId = (Integer)request.get(OCAId);
if (ocaId!=null) {
signal.oneCancelsAnother(ocaId);
//add this signal to the group under this ocaId
ocaMap.get(ocaId).add(signal);
}
order = signal;
}
//must be done before adding the all-in-one stop or target because they must also be added
archive.add(order);//needed for long term lookup by id order
scheduled.add(order);//needed for processing by time order
Integer ocaId = null;
RelativeNumber stopLoss = (RelativeNumber)request.get(Parameter.RelativeStopLoss);
RelativeNumber profitTarget = (RelativeNumber)request.get(RelativeProfitTarget);
Integer forceNoOCA = (Integer)request.get(ForceNoOCA);
if ((forceNoOCA==null || forceNoOCA.intValue()!=1) && (null!=stopLoss) && (null!=profitTarget)) {
ocaId = generateNewOCAId();
}