internal void OnExecutionReport(ExecutionReport report)
{
report.Order = report.Order ?? (report.OrderId == -1 ? ordersByClOrderId[report.ClOrderId] : ordersById[report.OrderId]);
report.ClientId = report.Order.ClientId;
report.ClOrderId = report.Order.ClOrderId;
var order = report.Order;
var orderStatus = order.Status;
Messages.Add(report);
order.OnExecutionReport(report);
if (orderStatus != order.Status)
this.framework.EventServer.OnOrderStatusChanged(order, true);
switch (report.ExecType)
{
case ExecType.ExecNew:
if (report.ProviderOrderId != null)
ordersByProviderId[report.ProviderOrderId] = order;
this.framework.EventServer.OnNewOrder(order, true);
break;
case ExecType.ExecRejected:
this.framework.EventServer.OnOrderRejected(order, true);
this.framework.EventServer.OnOrderDone(order, true);
CancelOCAOrder(order);
break;
case ExecType.ExecExpired:
this.framework.EventServer.OnOrderExpired(order, true);
this.framework.EventServer.OnOrderDone(order, true);
CancelOCAOrder(order);
break;
case ExecType.ExecTrade:
if (order.Status == OrderStatus.PartiallyFilled)
this.framework.EventServer.OnOrderPartiallyFilled(order, true);
else
{
this.framework.EventServer.OnOrderFilled(order, true);
this.framework.EventServer.OnOrderDone(order, true);
CancelOCAOrder(order);
}
break;
case ExecType.ExecCancelled:
this.framework.EventServer.OnOrderCancelled(order, true);
this.framework.EventServer.OnOrderDone(order, true);
CancelOCAOrder(order);
break;
case ExecType.ExecCancelReject:
this.framework.EventServer.OnOrderCancelRejected(order, true);
break;
case ExecType.ExecReplace:
this.framework.EventServer.OnOrderReplaced(order, true);
break;
case ExecType.ExecReplaceReject:
this.framework.EventServer.OnOrderReplaceRejected(order, true);
break;
}
if (IsPersistent)
Server?.Save(report, -1);
}