public void ConvertToDeliveryPreviousDaysExpiringOpenPositions() { if (!MarketUtils.IsTimeAfter2XMin(50)) { return; } BrokerErrorCode errCode = BrokerErrorCode.Unknown; // Get holding order matching this. check expiry date. if today then cancel holding order and convert it List <EquityPendingPositionForDelivery> pendingPositions; errCode = broker.GetOpenPositionsPendingForDelivery(stockCode, out pendingPositions); var positionsExpiringToday = pendingPositions.Where(p => p.ExpiryDate <= DateTime.Today.Date); var holdingsOrdersToRemove = new List <HoldingOrder>(); foreach (var position in positionsExpiringToday) { var holdingOrder = holdingsOrders.Where(h => h.Type == OrderPositionTypeEnum.OpenPendingDelivery && h.SettlementNumber == position.SettlementNumber && !string.IsNullOrEmpty(h.OrderRef) && h.Qty == position.BlockedQuantity && h.Qty > 0).FirstOrDefault(); var qtyToConvert = holdingOrder.Qty; // free up the blocked qty to go ahead with conversion errCode = CancelEquityOrder(string.Format("[Holding Conversion EOD] {0} {1}", holdingOrder.Type, holdingOrder.SettlementNumber), ref holdingOrder.OrderRef, EquityOrderType.DELIVERY, OrderDirection.SELL); if (errCode == BrokerErrorCode.Success) { // instead of removing the order mark the status as Cancelled and set Qty to 0 holdingOrder.Qty = 0; holdingOrder.Status = OrderStatus.CANCELLED; //holdingsOrdersToRemove.Add(holdingOrder); } int retryCount = 0; errCode = BrokerErrorCode.Unknown; while (errCode != BrokerErrorCode.Success && retryCount++ < 3) { // Just to ensure the qty is freed up and some time before retry Thread.Sleep(5000); // convert to delivery errCode = ConvertToDeliveryFromPendingForDelivery(stockCode, qtyToConvert, qtyToConvert, position.SettlementNumber, position.Exchange); if (errCode != BrokerErrorCode.Success) { // Conversion fails.. log the parameters Trace(string.Format("Previous ConversionToDelivery Failed: {5} {0} {1} qty expiring on {2} {3} {4}", stockCode, qtyToConvert, position.ExpiryDate.Date, position.SettlementNumber, position.Exchange, errCode)); } } } if (holdingsOrdersToRemove.Any()) { holdingsOrders.RemoveAll(h => holdingsOrdersToRemove.Contains(h)); UpdatePositionFile(); } }