Ejemplo n.º 1
0
        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();
            }
        }