public void Update(BfChildOrderEvent coe) { if (!string.IsNullOrEmpty(coe.ChildOrderAcceptanceId)) { AcceptanceId = coe.ChildOrderAcceptanceId; } if (!string.IsNullOrEmpty(coe.ChildOrderId)) { OrderId = coe.ChildOrderId; } LastUpdatedTime = coe.EventDate; switch (coe.EventType) { case BfOrderEventType.Order: OrderDate = coe.EventDate; // Is it same value to real ordered date ? ExpireDate = coe.ExpireDate; ChangeState(BfxOrderState.Ordered); break; case BfOrderEventType.OrderFailed: ChangeState(BfxOrderState.OrderFailed); break; case BfOrderEventType.Cancel: ChangeState(BfxOrderState.Canceled); break; case BfOrderEventType.CancelFailed: if (State != BfxOrderState.Outstanding) // Sometimes recived before ordered which under canceled OCO { ChangeState(BfxOrderState.CancelFailed); } break; case BfOrderEventType.Execution: _executions.Add(new BfxExecution(coe)); ExecutedSize = _executions.Sum(e => e.Size); ExecutedPrice = Math.Round(_executions.Sum(e => e.Price * e.Size) / ExecutedSize.Value, ProductCode.GetPriceDecimals(), MidpointRounding.ToEven); ChangeState(OrderSize > ExecutedSize ? BfxOrderState.PartiallyExecuted : BfxOrderState.Executed); break; case BfOrderEventType.Expire: ChangeState(BfxOrderState.Expired); break; case BfOrderEventType.Unknown: case BfOrderEventType.Trigger: // Parent order only case BfOrderEventType.Complete: // Parent order only throw new NotSupportedException(); } }