public void SetClosedHedgeOf(IOrderInfo order) { _closedHedgeOf = order.Ticket(); var orderImpl = order as OrderImpl; Debug.Assert(orderImpl != null, "orderImpl != null"); orderImpl._closedBy = Ticket(); _str = null; }
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; }
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; }
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); }