func (s *SimLogger) BeforeBookUpdate(book sim.Book, operation sim.SimOperation) { tobOld := book.GetTop(operation.GetOptionId(), operation.GetSide(), s.supernodeLevels) s.tobOld = make([]sim.PriceLevel, len(tobOld)) for i, pl := range tobOld { s.tobOld[i] = pl.Clone() } s.efhLogger.BeforeBookUpdate(book, operation) }
func (hlc *HwLimChecker) AfterBookUpdate(book sim.Book, operation sim.SimOperation) { opa, ok := operation.(*sim.OperationAdd) if !ok || operation.GetOptionId().Invalid() { return } if opa.Independent() { if book.NumOptions() == supernodes { log.Fatalf("reached hw supernodes limit (%d)\n", supernodes) } } tob := book.GetTop(operation.GetOptionId(), operation.GetSide(), 0) if len(tob) > supernodeLevels { log.Fatalf("book (oid %d, side %s) has %d levels (>%d)", operation.GetOptionId(), operation.GetSide(), len(tob), supernodeLevels) } }
func (l *TobLogger) BeforeBookUpdate(book sim.Book, operation sim.SimOperation) { errs.Check(l.consumeOps != 0) if l.hasOldTob { return } l.lastOptionId = operation.GetOptionId() if l.lastOptionId.Invalid() { return } switch operation.GetSide() { case packet.MarketSideBid: l.bid.Check = true case packet.MarketSideAsk: l.ask.Check = true default: log.Fatalln("wrong operation side") } l.bid.update(book, l.lastOptionId, false) l.ask.update(book, l.lastOptionId, false) l.hasOldTob = true }
func (s *SimLogger) accessedLevels(operation sim.SimOperation) (levels int) { levels = SimLoggerUpperSupernodeLevels if s.supernodeLevels <= levels { return s.supernodeLevels } if operation.GetPrice() == 0 { // TODO hw can skip SN access at all return } lenOld, lenNew := len(s.tobOld), len(s.tobNew) if lenOld < levels { return } if lenOld == lenNew { for i := 0; i < levels; i++ { if !s.tobOld[i].Equals(s.tobNew[i]) { return } } } return s.supernodeLevels }
func (s *SimLogger) AfterBookUpdate(book sim.Book, operation sim.SimOperation) { if operation.GetOptionId().Valid() && s.supernodeLevels > 1 { var emptyPrice uint32 if operation.GetSide() == packet.MarketSideAsk { emptyPrice -= 1 } printablePriceLevel := func(pls []sim.PriceLevel, pos int) (price uint32, size int) { if pos < len(pls) { price = uint32(pls[pos].Price()) size = pls[pos].Size(sim.SizeKindDefault) } else if operation.GetSide() == packet.MarketSideAsk { price = emptyPrice } return } s.tobNew = book.GetTop(operation.GetOptionId(), operation.GetSide(), s.supernodeLevels) for i := 0; i < s.accessedLevels(operation); i++ { priceOld, sizeOld := printablePriceLevel(s.tobOld, i) priceNew, sizeNew := printablePriceLevel(s.tobNew, i) s.printfln("SN_OLD_NEW %02d %08x %08x %08x %08x", i, sizeOld, priceOld, sizeNew, priceNew) } } s.efhLogger.AfterBookUpdate(book, operation) }
func (o *observer) OperationAppliedToOrders(op sim.SimOperation) { sess := op.GetMessage().Session.Index() //errs.Check(sess < 4, sess) //errs.Check(sess < 32, sess) var key uint64 var delta int switch o := op.(type) { case *sim.OperationAdd: key = uint64(sess)<<32 | uint64(o.OrderId.ToUint32()) delta = 1 case *sim.OperationRemove: key = uint64(sess)<<32 | uint64(o.GetOrigOrderId().ToUint32()) delta = -1 } for _, ohs := range o.analyzer.orderHashStat { keyHash := ohs.f(key) ohs.bucketSize[keyHash] += delta if ohs.bucketSize[keyHash] > ohs.maxBucketSize[keyHash] { ohs.maxBucketSize[keyHash] = ohs.bucketSize[keyHash] } else if ohs.bucketSize[keyHash] == 0 { delete(ohs.bucketSize, keyHash) } } }
func (o *observer) AfterBookUpdate(book sim.Book, op sim.SimOperation) { oid := op.GetOptionId() if oid.Invalid() { return } o.analyzer.optionIds[oid.ToUint64()] = struct{}{} bs := o.analyzer.book(oid, op.GetSide()) //bookSize := len(book.GetTop(oid, op.GetSide(), 0)) b := book.GetTop(oid, op.GetSide(), 0) bookSize := len(b) if bs.maxLevels < bookSize { //log.Printf("%d %s %d: %v\n", oid, op.GetSide(), bookSize, b) bs.maxLevels = bookSize } }
func (s *SimLogger) OperationAppliedToOrders(operation sim.SimOperation) { type ordrespLogInfo struct { notFound, addOp int orderId packet.OrderId optionId packet.OptionId side, price, size int ordlSuffix string } type orduLogInfo struct { orderId packet.OrderId optionId packet.OptionId side, price, size int } var or ordrespLogInfo var ou orduLogInfo switch op := operation.(type) { case *sim.OperationAdd: var oid packet.OptionId if op.Independent() { oid = op.GetOptionId() } or = ordrespLogInfo{ addOp: 1, orderId: op.OrderId, optionId: oid, ordlSuffix: fmt.Sprintf(" %012x", oid.ToUint64()), } ou = orduLogInfo{ orderId: or.orderId, optionId: op.GetOptionId(), price: op.GetPrice(), size: op.GetNewSize(sim.SizeKindDefault), } if op.GetSide() == packet.MarketSideAsk { ou.side = 1 } case *sim.OperationRemove, *sim.OperationUpdate: if operation.GetOptionId().Invalid() { or = ordrespLogInfo{notFound: 1} } else { newSize := operation.GetNewSize(sim.SizeKindDefault) or = ordrespLogInfo{ optionId: operation.GetOptionId(), price: operation.GetPrice(), size: newSize - operation.GetDefaultSizeDelta(), } if operation.GetSide() == packet.MarketSideAsk { or.side = 1 } if newSize != 0 { ou = orduLogInfo{ optionId: or.optionId, side: or.side, price: or.price, size: newSize, } } } or.orderId = operation.GetOrigOrderId() ou.orderId = or.orderId default: errs.Check(false) } s.printfln("ORDL %d %016x%s", or.addOp, or.orderId.ToUint64(), or.ordlSuffix) s.printfln("ORDRESP %d %d %d %08x %08x %012x %016x", or.notFound, or.addOp, or.side, or.size, or.price, or.optionId.ToUint64(), or.orderId.ToUint64()) if operation.GetOptionId().Valid() { s.printfln("ORDU %016x %012x %d %08x %08x", ou.orderId.ToUint64(), ou.optionId.ToUint64(), ou.side, ou.price, ou.size) } }