Пример #1
0
        public void SetClosedHedgeOf(IOrderInfo order)
        {
            _closedHedgeOf = order.Ticket();
            var orderImpl = order as OrderImpl;

            Debug.Assert(orderImpl != null, "orderImpl != null");
            orderImpl._closedBy = Ticket();
            _str = null;
        }
Пример #2
0
        public void SetNext(IOrderInfo nextP)
        {
            _next = nextP.Ticket();
            nextP.SetWasEverLiveOrder(_wasLiveOrder);
            //
            var orderImpl = nextP as OrderImpl;

            Debug.Assert(orderImpl != null, "orderImpl != null");
            orderImpl._prev = Ticket();
            _str            = null;
        }
Пример #3
0
        public void SetPrev(IOrderInfo prev)
        {
            _prev         = prev.Ticket();
            _wasLiveOrder = prev.WasEverLiveOrder();
            //
            var orderImpl = prev as OrderImpl;

            Debug.Assert(orderImpl != null, "orderImpl != null");
            orderImpl._next = Ticket();
            _str            = null;
        }
Пример #4
0
            private bool CheckHedges(Stack <IOrderInfo> bStack)
            {
                Stack <IOrderInfo> cbStack  = null;
                Stack <IOrderInfo> hdgStack = null;
                long tmpTicket;

                if (_closedBy.TryGetValue(bStack.Peek().Ticket(), out tmpTicket))
                {
                    cbStack = bStack;
                    if (_sellAtTop.ContainsKey(tmpTicket))
                    {
                        hdgStack = _sellSide.FirstOrDefault(sellStack => sellStack.Peek().Ticket() == tmpTicket);
                    }
                }
                if (_hedgedBy.TryGetValue(bStack.Peek().Ticket(), out tmpTicket))
                {
                    hdgStack = bStack;
                    if (_sellAtTop.ContainsKey(tmpTicket))
                    {
                        cbStack = _sellSide.FirstOrDefault(sellStack => sellStack.Peek().Ticket() == tmpTicket);
                    }
                }
                if (cbStack != null && hdgStack != null)
                {
                    var cbOrder  = cbStack.Pop();
                    var hdgOrder = hdgStack.Pop();
                    //
                    _history.Add(hdgOrder);
                    _history.Add(cbOrder);
                    //
                    IOrderInfo cbNext  = null;
                    IOrderInfo hdgNext = null;
                    //
                    Dictionary <long, bool> cbTop  = cbOrder.GetTradeOperation() == TradeOperation.OP_BUY ? _buyAtTop : _sellAtTop;
                    Dictionary <long, bool> hdgTop = hdgOrder.GetTradeOperation() == TradeOperation.OP_BUY ? _buyAtTop : _sellAtTop;
                    cbTop.Remove(cbOrder.Ticket());
                    hdgTop.Remove(hdgOrder.Ticket());
                    if (cbStack.Count > 0)
                    {
                        cbTop[(cbNext = cbStack.Peek()).Ticket()] = true;
                    }
                    if (hdgStack.Count > 0)
                    {
                        hdgTop[(hdgNext = hdgStack.Peek()).Ticket()] = true;
                    }
                    //
                    cbOrder.SetClosedBy(hdgOrder);
                    if (cbNext == null && hdgNext == null)
                    {
                        //check live orders for next
                        var cbC  = new OComparator(cbOrder);
                        var hdgC = new OComparator(hdgOrder);
                        cbNext =
                            _live.FirstOrDefault(
                                order => order.Ticket() > cbOrder.Ticket() && cbC.IsSameLiveOrder(order));
                        hdgNext =
                            _live.FirstOrDefault(
                                order => order.Ticket() > hdgOrder.Ticket() && hdgC.IsSameLiveOrder(order));
                    }
                    var next = cbNext == null
                        ? hdgNext
                        : (hdgNext == null
                            ? cbNext
                            : (cbNext.Ticket() > hdgNext.Ticket() ? hdgNext : cbNext)); // use minimal ticket number for next order
                    if (next != null)
                    {
                        if (ReferenceEquals(next, cbNext))
                        {
                            cbOrder.SetNext(next);
                        }
                        if (ReferenceEquals(next, hdgNext))
                        {
                            hdgOrder.SetNext(next);
                        }
                    }
                    //
                    // remove empty stack from a side
                    if (cbStack.Count == 0)
                    {
                        (cbOrder.GetTradeOperation() == TradeOperation.OP_BUY ? _buySide : _sellSide).Remove(cbStack);
                    }
                    if (hdgStack.Count == 0)
                    {
                        (hdgOrder.GetTradeOperation() == TradeOperation.OP_BUY ? _buySide : _sellSide).Remove(hdgStack);
                    }
                    //
                    return(true);
                }
                return(false);
            }