Пример #1
0
        private bool ProcessSellLimit(PhysicalOrder order, Tick tick)
        {
            long orderPrice = order.Price.ToLong();
            long price      = tick.IsQuote ? tick.lBid : tick.lPrice;
            bool isFilled   = false;

            if (price >= orderPrice)
            {
                isFilled = true;
            }
            else if (tick.IsTrade && tick.lPrice > orderPrice)
            {
                price    = orderPrice;
                isFilled = true;
            }
            if (isFilled)
            {
                CreatePhysicalFillHelper(-order.Size, price.ToDouble(), tick.Time, tick.UtcTime, order);
            }
            return(isFilled);
        }
Пример #2
0
        private void UpdateInstalments(PhysicalOrder order)
        {
            decimal instalmentAmount = order.PhysicalOriginValueBalance - Math.Abs(order.PaidPledgeBalance);

            if (instalmentAmount > 0m)
            {
                order.DeleteAllInstalmentDetail();
                order.GenerateInstalmentDetails(DateTime.Now.Date);
            }
            else
            {
                foreach (var eachInstalment in order.Instalment.InstalmentDetails)
                {
                    if (eachInstalment.IsDeleted)
                    {
                        continue;
                    }
                    eachInstalment.Update(0, 0, 0, DateTime.Now, DateTime.Now, order.LotBalance);
                }
            }
        }
Пример #3
0
        public void OnCancelBrokerOrder(PhysicalOrder physicalOrder)
        {
            if (trace)
            {
                log.Trace("OnCancelBrokerOrder " + physicalOrder);
            }
            Order order = physicalOrder.BrokerOrder as Order;

            if (order != null)
            {
                client.CancelOrder(order.OrderId);
                if (debug)
                {
                    log.Debug("Cancel Order: " + physicalOrder.Symbol.Symbol + " " + OrderToString(order));
                }
            }
            else
            {
                throw new ApplicationException("BrokerOrder property want's an Order object.");
            }
        }
Пример #4
0
        private InstalmentConstructParams CreateInstalmentConstructParams(PhysicalOrder order)
        {
            if (order.Instalment == null)
            {
                return(null);
            }
            InstalmentConstructParams result = new InstalmentConstructParams
            {
                InstalmentPolicyId   = order.Instalment.InstalmentPolicyId,
                DownPayment          = order.Instalment.DownPayment,
                DownPaymentBasis     = order.Instalment.DownPaymentBasis,
                InstalmentOverdueDay = order.Instalment.InstalmentOverdueDay,
                Period              = order.Period,
                Frequence           = order.Frequence,
                InstalmentType      = order.Instalment.InstalmentType,
                IsInstalmentOverdue = order.Instalment.IsInstalmentOverdue,
                RecalculateRateType = order.Instalment.RecalculateRateType
            };

            return(result);
        }
Пример #5
0
        private void ProcessMatchPhysicalExit(LogicalOrder logical, PhysicalOrder physical)
        {
            var strategyPosition = logical.StrategyPosition;

            if (strategyPosition == 0)
            {
                TryCancelBrokerOrder(physical);
            }
            else if (Math.Abs(strategyPosition) != physical.Size || logical.Price.ToLong() != physical.Price.ToLong())
            {
                var origBrokerOrder = physical.BrokerOrder;
                physicalOrders.Remove(physical);
                var side = GetOrderSide(logical.Type);
                physical = new PhysicalOrderDefault(OrderState.Active, symbol, logical, side, Math.Abs(strategyPosition));
                TryChangeBrokerOrder(physical, origBrokerOrder);
            }
            else
            {
                VerifySide(logical, physical);
            }
        }
Пример #6
0
        private void ProcessMatch(LogicalOrder logical, PhysicalOrder physical)
        {
            if (trace)
            {
                log.Trace("Process Match()");
            }
            if (physical.OrderState == OrderState.Suspended)
            {
                if (debug)
                {
                    log.Trace("Cannot change a suspended order: " + physical);
                }
                return;
            }
            switch (logical.TradeDirection)
            {
            case TradeDirection.Entry:
                ProcessMatchPhysicalEntry(logical, physical);
                break;

            case TradeDirection.Exit:
                ProcessMatchPhysicalExit(logical, physical);
                break;

            case TradeDirection.ExitStrategy:
                ProcessMatchPhysicalExitStrategy(logical, physical);
                break;

            case TradeDirection.Reverse:
                ProcessMatchPhysicalReverse(logical, physical);
                break;

            case TradeDirection.Change:
                ProcessMatchPhysicalChange(logical, physical);
                break;

            default:
                throw new ApplicationException("Unknown TradeDirection: " + logical.TradeDirection);
            }
        }
Пример #7
0
        internal static decimal CalculateMarketValue(PhysicalOrder order, Price price, DateTime?tradeDay, out decimal valueAsMargin)
        {
            valueAsMargin = 0;
            decimal result = 0m;

            if (!order.IsPhysical)
            {
                return(result);
            }
            var physicalOpenOrder = order as PhysicalOrder;

            if ((physicalOpenOrder.PhysicalTradeSide == PhysicalTradeSide.Buy && physicalOpenOrder.IsPayoff) || physicalOpenOrder.PhysicalTradeSide == PhysicalTradeSide.Deposit)
            {
                TradePLFormula tradePLFormula = order.Owner.SettingInstrument(tradeDay).TradePLFormula;
                decimal        lot = order.LotBalance, contractSize = order.Owner.ContractSize(tradeDay);
                decimal        discountOfOdd = order.Owner.TradePolicyDetail(tradeDay).DiscountOfOdd;
                decimal        marketValue   = CalculateValue(tradePLFormula, lot, price, discountOfOdd, contractSize);
                valueAsMargin = order.Owner.CurrencyRate(tradeDay).Exchange(marketValue * order.Owner.TradePolicyDetail(tradeDay).ValueDiscountAsMargin);
                return(order.Owner.CurrencyRate(tradeDay).Exchange(marketValue));
            }
            return(result);
        }
Пример #8
0
        public void OnChangeBrokerOrder(PhysicalOrder physicalOrder)
        {
            if (trace)
            {
                log.Trace("OnChangeBrokerOrder " + physicalOrder);
            }
            Order order = physicalOrder.BrokerOrder as Order;

            if (order != null)
            {
                if (debug)
                {
                    log.Debug("Change Order (Cancel/Replace): " + physicalOrder.Symbol.Symbol + " " + OrderToString(order));
                }
                OnCancelBrokerOrder(physicalOrder);
                OnCreateBrokerOrder(physicalOrder);
            }
            else
            {
                throw new ApplicationException("BrokerOrder property want's an Order object.");
            }
        }
Пример #9
0
        private bool ProcessBuyLimitQuoteThrough(PhysicalOrder order, Tick tick)
        {
            long orderPrice = order.Price.ToLong();
            long price      = tick.IsQuote ? tick.lBid : tick.lPrice;
            bool isFilled   = false;

            if (price <= orderPrice)
            {
                isFilled = true;
                price    = Math.Min(orderPrice, tick.lBid - minimumTick * 4);
            }
            else if (tick.IsTrade && tick.lPrice < orderPrice)
            {
                price    = orderPrice;
                isFilled = true;
            }
            if (isFilled)
            {
                CreatePhysicalFillHelper(order.Size, price.ToDouble(), tick.Time, tick.UtcTime, order);
            }
            return(isFilled);
        }
Пример #10
0
        private void OrderSideWrongReject(PhysicalOrder order)
        {
            var message = "Sorry, improper setting of a " + order.Side + " order when position is " + actualPosition;

            lock ( orderMapLocker) {
                orderMap.Remove((string)order.BrokerOrder);
            }
            var node = (LinkedListNode <PhysicalOrder>)order.Reference;

            if (node.List != null)
            {
                node.List.Remove(node);
            }
            if (onRejectOrder != null)
            {
                onRejectOrder(order, message);
            }
            else
            {
                throw new ApplicationException(message + " while handling order: " + order);
            }
        }
Пример #11
0
        private void SortAdjust(ActiveList <PhysicalOrder> list, PhysicalOrder order, Func <PhysicalOrder, PhysicalOrder, double> compare)
        {
            AssureNode(order);
            var orderNode = (LinkedListNode <PhysicalOrder>)order.Reference;

            if (orderNode.List == null || !orderNode.List.Equals(list))
            {
                if (orderNode.List != null)
                {
                    orderNode.List.Remove(orderNode);
                }
                bool found = false;
                var  next  = list.First;
                for (var node = next; node != null; node = next)
                {
                    next = node.Next;
                    var other = node.Value;
                    if (object.ReferenceEquals(order, other))
                    {
                        found = true;
                        break;
                    }
                    else
                    {
                        var result = compare(order, other);
                        if (result < 0)
                        {
                            list.AddBefore(node, orderNode);
                            found = true;
                            break;
                        }
                    }
                }
                if (!found)
                {
                    list.AddLast(orderNode);
                }
            }
        }
Пример #12
0
 private static void CalculateNotValuedOrderRelationPL(TradeDayInfo tradeDayInfo, Exchanger exchanger, Dictionary <Guid, OrderResetResult> resetOrderDict, List <Guid> affectedOrders)
 {
     foreach (var eachOrderRelation in tradeDayInfo.OrderRelations)
     {
         Order closeOrder = eachOrderRelation.CloseOrder;
         if (!closeOrder.ShouldCalculate(affectedOrders))
         {
             continue;
         }
         PhysicalOrder         physicalCloseOrder    = closeOrder as PhysicalOrder;
         PhysicalOrderRelation physicalOrderRelation = eachOrderRelation as PhysicalOrderRelation;
         if (closeOrder.Phase == OrderPhase.Executed && !closeOrder.IsOpen && closeOrder.ExecuteTime <= tradeDayInfo.Settings.ResetTime && eachOrderRelation.ValueTime == null)
         {
             OrderResetResult resetResult = CreateOrderResetResult(closeOrder, tradeDayInfo, resetOrderDict);
             resetResult.NotValuedPL      += new InterestStorage(exchanger.ExchangeByCommonDecimals(eachOrderRelation.InterestPL), exchanger.ExchangeByCommonDecimals(eachOrderRelation.StoragePL));
             resetResult.TradePLNotValued += exchanger.ExchangeByCommonDecimals(eachOrderRelation.TradePL);
             if (physicalOrderRelation != null)
             {
                 resetResult.PhysicalTradePLNotValued += CalculatePhysicalTradePL(physicalOrderRelation, exchanger);
             }
         }
     }
 }
Пример #13
0
        private static bool ExistNotMaturePhysicalValueForCloseOrder(this Order order, IEnumerable <OrderRelation> orderRelations)
        {
            PhysicalOrder physicalOrder = order as PhysicalOrder;

            if (physicalOrder == null)
            {
                return(false);
            }
            foreach (var eachOrderRelation in orderRelations)
            {
                if (eachOrderRelation.CloseOrder.Id != order.Id)
                {
                    continue;
                }
                PhysicalOrderRelation physicalOrderRelation = (PhysicalOrderRelation)eachOrderRelation;
                if (eachOrderRelation.ValueTime == null ||
                    (physicalOrderRelation != null && physicalOrderRelation.PhysicalValueMatureDay != null && physicalOrderRelation.RealPhysicalValueMatureDate == null))
                {
                    return(true);
                }
            }
            return(false);
        }
Пример #14
0
        private void SortAdjust(PhysicalOrder order)
        {
            switch (order.Type)
            {
            case OrderType.BuyLimit:
            case OrderType.SellStop:
                SortAdjust(decreaseOrders, order, (x, y) => y.Price - x.Price);
                break;

            case OrderType.SellLimit:
            case OrderType.BuyStop:
                SortAdjust(increaseOrders, order, (x, y) => x.Price - y.Price);
                break;

            case OrderType.BuyMarket:
            case OrderType.SellMarket:
                Adjust(marketOrders, order);
                break;

            default:
                throw new ApplicationException("Unexpected order type: " + order.Type);
            }
        }
Пример #15
0
        public void OnCreateBrokerOrder(PhysicalOrder physicalOrder)
        {
            if (trace)
            {
                log.Trace("OnCreateBrokerOrder " + physicalOrder);
            }
            SymbolInfo symbol   = physicalOrder.Symbol;
            Contract   contract = SymbolToContract(symbol);
//			Contract contract = new Contract(symbol.Symbol,"SMART",SecurityType.Stock,"USD");
//			Contract contract = new Contract(symbol.Symbol,"GLOBEX",SecurityType.Future,"USD","201006");
            Order brokerOrder = ToBrokerOrder(physicalOrder);

            while (nextValidId == 0)
            {
                Thread.Sleep(10);
            }
            nextValidId++;
            client.PlaceOrder(nextValidId, contract, brokerOrder);
            physicalToLogicalOrderMap.Add(nextValidId, physicalOrder.LogicalOrderId);
            if (debug)
            {
                log.Debug("Place Order: " + contract.Symbol + " " + OrderToString(brokerOrder));
            }
        }
Пример #16
0
 internal InstalmentDetail(PhysicalOrder owner, OrderInstalmentData data)
     : base("InstalmentDetail", 10)
 {
     this.CreateBusinessItems(owner.Id, data.Sequence, data.Principal, data.Interest, data.DebitInterest, data.PaymentDateTimeOnPlan, data.InterestRate, data.PaidDateTime, data.UpdateTime, data.LotBalance, data.UpdatePersonId);
     this.Initialize(owner.AccountId, owner.Instrument().Id);
 }
Пример #17
0
 internal InstalmentDetail(PhysicalOrder owner, int period, decimal principal, decimal interest, decimal debitInterest, DateTime?paymentDateTimeOnPlan, DateTime?paidDateTime)
     : base("InstalmentDetail", 10)
 {
     this.CreateBusinessItems(owner.Id, period, principal, interest, debitInterest, paymentDateTimeOnPlan, owner.Instalment.InstalmentPolicyDetail(null).InterestRate, paidDateTime, null, owner.LotBalance, null);
     this.Initialize(owner.AccountId, owner.Instrument().Id);
 }
Пример #18
0
            private static List <Physical.InstalmentBusiness.InstalmentDetail> GetNotPayoffInstalmentDetails(PhysicalOrder order, DateTime closeTime)
            {
                var result = new List <Physical.InstalmentBusiness.InstalmentDetail>();

                foreach (var eachInstalmentDetail in order.Instalment.InstalmentDetails)
                {
                    if (eachInstalmentDetail.PaidDateTime == null || eachInstalmentDetail.PaidDateTime >= closeTime)
                    {
                        result.Add(eachInstalmentDetail);
                    }
                }
                return(result);
            }
Пример #19
0
 private static void RecovePaidPledgeBalanceAndOriginValueBalance(PhysicalOrder order, decimal paybackPledge, decimal closedPhysicalValue)
 {
     order.PaidPledgeBalance          += paybackPledge;
     order.PhysicalOriginValueBalance += closedPhysicalValue;
 }
Пример #20
0
 internal PhysicalCloseOrderFeeCalculator(PhysicalOrder order, OrderSettings settings)
     : base(order, settings)
 {
 }
Пример #21
0
 internal PhysicalCloseOrderFeeBookCalculator(PhysicalOrder order, Physical.OrderBusiness.PhysicalOrderSettings settings)
     : base(order, settings)
 {
 }
Пример #22
0
 private bool ShouldFrozen(PhysicalOrder openOrder)
 {
     return(_physicalOrder.PhysicalTradeSide != PhysicalTradeSide.Delivery && openOrder.PhysicalTradeSide == PhysicalTradeSide.Deposit && openOrder.PhysicalValueMatureDay > 0);
 }
Пример #23
0
 private void UpdateForOpenOrder(PhysicalOrderRelation orderRelation, PhysicalOrder openOrder)
 {
     openOrder.PhysicalOriginValueBalance += -orderRelation.ClosedPhysicalValue;
     openOrder.PaidPledgeBalance          += orderRelation.PayBackPledgeOfOpenOrder;
     openOrder.UpdateLotBalance(orderRelation.ClosedLot, _physicalOrder.PhysicalTradeSide == PhysicalTradeSide.Delivery);
 }
Пример #24
0
 internal PhysicalCloseOrderCalculator(PhysicalOrder order, PhysicalOrderSettings physicalSettings)
     : base(order, physicalSettings)
 {
     _physicalSettings = physicalSettings;
     _physicalOrder    = order;
 }
Пример #25
0
 internal PhysicalValuedPLCalculator(PhysicalOrder order)
     : base(order)
 {
 }
Пример #26
0
 internal PhysicalOpenOrderCalculator(PhysicalOrder order, PhysicalOrderSettings physicalSettings, OpenOrderServiceFactoryBase openOrderServiceFactory)
     : base(order, physicalSettings, openOrderServiceFactory)
 {
     _physicalOrder    = order;
     _physicalSettings = physicalSettings;
 }
Пример #27
0
        private int FindPendingAdjustments()
        {
            var positionDelta      = desiredPosition - actualPosition;
            var pendingAdjustments = 0;
            var next = originalPhysicals.First;

            for (var node = next; node != null; node = next)
            {
                next = node.Next;
                PhysicalOrder order = node.Value;
                if (order.Type != OrderType.BuyMarket &&
                    order.Type != OrderType.SellMarket)
                {
                    continue;
                }
                if (order.LogicalOrderId == 0)
                {
                    if (order.Type == OrderType.BuyMarket)
                    {
                        pendingAdjustments += order.Size;
                    }
                    if (order.Type == OrderType.SellMarket)
                    {
                        pendingAdjustments -= order.Size;
                    }
                    if (positionDelta > 0)
                    {
                        if (pendingAdjustments > positionDelta)
                        {
                            TryCancelBrokerOrder(order);
                            pendingAdjustments -= order.Size;
                        }
                        else if (pendingAdjustments < 0)
                        {
                            TryCancelBrokerOrder(order);
                            pendingAdjustments += order.Size;
                        }
                    }
                    if (positionDelta < 0)
                    {
                        if (pendingAdjustments < positionDelta)
                        {
                            TryCancelBrokerOrder(order);
                            pendingAdjustments += order.Size;
                        }
                        else if (pendingAdjustments > 0)
                        {
                            TryCancelBrokerOrder(order);
                            pendingAdjustments -= order.Size;
                        }
                    }
                    if (positionDelta == 0)
                    {
                        TryCancelBrokerOrder(order);
                        pendingAdjustments += order.Type == OrderType.SellMarket ? order.Size : -order.Size;
                    }
                    physicalOrders.Remove(order);
                }
            }
            return(pendingAdjustments);
        }
Пример #28
0
 private bool ProcessExtraPhysical(PhysicalOrder physical)
 {
     return(TryCancelBrokerOrder(physical));
 }
Пример #29
0
        private void ProcessMatchPhysicalEntry(LogicalOrder logical, PhysicalOrder physical)
        {
            log.Trace("ProcessMatchPhysicalEntry()");
            var strategyPosition = logical.StrategyPosition;
            var difference       = logical.Position - Math.Abs(strategyPosition);

            log.Trace("position difference = " + difference);
            if (difference == 0)
            {
                TryCancelBrokerOrder(physical);
            }
            else if (difference != physical.Size)
            {
                var origBrokerOrder = physical.BrokerOrder;
                if (strategyPosition == 0)
                {
                    physicalOrders.Remove(physical);
                    var side = GetOrderSide(logical.Type);
                    physical = new PhysicalOrderDefault(OrderState.Active, symbol, logical, side, difference);
                    TryChangeBrokerOrder(physical, origBrokerOrder);
                }
                else
                {
                    if (strategyPosition > 0)
                    {
                        if (logical.Type == OrderType.BuyStop || logical.Type == OrderType.BuyLimit)
                        {
                            physicalOrders.Remove(physical);
                            var side = GetOrderSide(logical.Type);
                            physical = new PhysicalOrderDefault(OrderState.Active, symbol, logical, side, difference);
                            TryChangeBrokerOrder(physical, origBrokerOrder);
                        }
                        else
                        {
                            TryCancelBrokerOrder(physical);
                        }
                    }
                    if (strategyPosition < 0)
                    {
                        if (logical.Type == OrderType.SellStop || logical.Type == OrderType.SellLimit)
                        {
                            physicalOrders.Remove(physical);
                            var side = GetOrderSide(logical.Type);
                            physical = new PhysicalOrderDefault(OrderState.Active, symbol, logical, side, difference);
                            TryChangeBrokerOrder(physical, origBrokerOrder);
                        }
                        else
                        {
                            TryCancelBrokerOrder(physical);
                        }
                    }
                }
            }
            else if (logical.Price.ToLong() != physical.Price.ToLong())
            {
                var origBrokerOrder = physical.BrokerOrder;
                physicalOrders.Remove(physical);
                var side = GetOrderSide(logical.Type);
                physical = new PhysicalOrderDefault(OrderState.Active, symbol, logical, side, difference);
                TryChangeBrokerOrder(physical, origBrokerOrder);
            }
            else
            {
                VerifySide(logical, physical);
            }
        }
Пример #30
0
        private void ProcessMatchPhysicalChange(LogicalOrder logical, PhysicalOrder physical)
        {
            var strategyPosition = logical.StrategyPosition;
            var logicalPosition  =
                logical.Type == OrderType.BuyLimit ||
                logical.Type == OrderType.BuyMarket ||
                logical.Type == OrderType.BuyStop ?
                logical.Position : -logical.Position;

            logicalPosition += strategyPosition;
            var physicalPosition =
                physical.Side == OrderSide.Buy ?
                physical.Size : -physical.Size;
            var delta      = logicalPosition - strategyPosition;
            var difference = delta - physicalPosition;

            if (debug)
            {
                log.Debug("PhysicalChange(" + logical.SerialNumber + ") delta=" + delta + ", strategyPosition=" + strategyPosition + ", difference=" + difference);
            }
            if (delta == 0 || strategyPosition == 0)
            {
                if (debug)
                {
                    log.Debug("(Flat) Canceling: " + physical);
                }
                TryCancelBrokerOrder(physical);
            }
            else if (difference != 0)
            {
                var origBrokerOrder = physical.BrokerOrder;
                if (delta > 0)
                {
                    physical = new PhysicalOrderDefault(OrderState.Active, symbol, logical, OrderSide.Buy, Math.Abs(delta));
                    if (debug)
                    {
                        log.Debug("(Delta) Changing " + origBrokerOrder + " to " + physical);
                    }
                    TryChangeBrokerOrder(physical, origBrokerOrder);
                }
                else
                {
                    OrderSide side;
                    if (strategyPosition > 0 && logicalPosition < 0)
                    {
                        side  = OrderSide.Sell;
                        delta = strategyPosition;
                        if (delta == physical.Size)
                        {
                            if (debug)
                            {
                                log.Debug("Delta same as size: Check Price and Side.");
                            }
                            ProcessMatchPhysicalChangePriceAndSide(logical, physical, delta);
                            return;
                        }
                    }
                    else
                    {
                        side = OrderSide.SellShort;
                    }
                    side = (long)strategyPosition >= (long)Math.Abs(delta) ? OrderSide.Sell : OrderSide.SellShort;
                    if (side == physical.Side)
                    {
                        physical = new PhysicalOrderDefault(OrderState.Active, symbol, logical, side, Math.Abs(delta));
                        if (debug)
                        {
                            log.Debug("(Size) Changing " + origBrokerOrder + " to " + physical);
                        }
                        TryChangeBrokerOrder(physical, origBrokerOrder);
                    }
                    else
                    {
                        if (debug)
                        {
                            log.Debug("(Side) Canceling " + physical);
                        }
                        TryCancelBrokerOrder(physical);
                    }
                }
            }
            else
            {
                ProcessMatchPhysicalChangePriceAndSide(logical, physical, delta);
            }
        }