private void OnExchangeUpdatePosition(PBPosition rsp) { lock (PositionVMCollection) { var positionCollection = PositionVMCollection.Where(p => p.Contract == rsp.Contract && (int)p.Direction == rsp.Direction); foreach (var positionVM in positionCollection) { if (positionVM != null) { if (rsp.PositionDateFlag == (int)PositionDateFlagType.PSD_TODAY) { if (rsp.TdPosition > 0) { positionVM.TdCost = rsp.TdCost / rsp.TdPosition * positionVM.TdCost; } } else { if (rsp.YdPosition > 0) { positionVM.YdCost = rsp.YdCost / rsp.YdPosition * positionVM.YdCost; } } } } } }
private void UpdatePosition(PBPosition rsp) { lock (PositionVMCollection) { PositionVM positionVM = PositionVMCollection.FirstOrDefault(p => p.Contract == rsp.Contract && (int)p.Direction == rsp.Direction && p.Portfolio == rsp.Portfolio); if (rsp.TdPosition == 0 && rsp.YdPosition == 0) { if (positionVM != null) { PositionVMCollection.Remove(positionVM); } if (!PositionVMCollection.Any(p => p.Contract == rsp.Contract)) { PositionContractSet.Remove(rsp.Contract); } } else { if (positionVM == null) { var contractInfo = ClientDbContext.FindContract(rsp.Contract); positionVM = new PositionVM { Contract = rsp.Contract, Exchange = rsp.Exchange, Portfolio = rsp.Portfolio, Direction = (PositionDirectionType)rsp.Direction, HedgeFlag = (HedgeType)rsp.HedgeFlag, PositionDateFlag = (PositionDateFlagType)rsp.PositionDateFlag, Multiplier = contractInfo == null ? 1 : contractInfo.VolumeMultiple, TodayPosition = rsp.TdPosition, YdPosition = rsp.YdPosition, OpenVolume = rsp.OpenVolume, CloseVolume = rsp.CloseVolume, OpenAmount = rsp.OpenAmount, CloseAmount = rsp.CloseAmount, TdCost = rsp.TdCost, YdCost = rsp.YdCost, OpenCost = rsp.OpenCost, Profit = rsp.Profit, CloseProfit = rsp.CloseProfit, UseMargin = rsp.UseMargin, }; PositionVMCollection.Add(positionVM); PositionContractSet.Add(rsp.Contract); OnPositionUpdated?.Invoke(positionVM); } else { positionVM.OpenVolume = rsp.OpenVolume; positionVM.CloseVolume = rsp.CloseVolume; positionVM.OpenAmount = rsp.OpenAmount; positionVM.CloseAmount = rsp.CloseAmount; positionVM.OpenCost = rsp.OpenCost; if (positionVM.YdPosition != rsp.YdPosition || positionVM.TodayPosition != rsp.TdPosition) { positionVM.TodayPosition = rsp.TdPosition; positionVM.YdPosition = rsp.YdPosition; OnPositionUpdated?.Invoke(positionVM); } } } } }