Example #1
0
        void updateNode(Topic topic, MsivPv liveMarket, LiveMarketNode node)
        {
            var averager = ticksReceived.get(liveMarket);

            if (!topic.has("ticksReceived"))
            {
                return;
            }
            node.ticksReceived = topic.get <int>("ticksReceived");
            node.runningOn     = topic.get <string>("hostname");
            averager.add(node.ticksReceived);
            node.tickRate = (float)averager.movingAverage();
            node.size     = isEqualSizes_ ? 1 : Math.Max(1F, node.tickRate);
            node.tickLag  = ticks.get(liveMarket).tickLag;
            node.color    = node.tickLag - 5000;
            node.isDown   = now().Subtract(date(topic.get <string>("timestamp"))).TotalSeconds < 10;
            var downText = node.isDown ? "" : "DOWN ";

            node.lastTickProcessed = ticks.get(liveMarket).lastTickProcessed();
            node.text =
                downText + liveMarket.market() + "\n" +
                node.tickRate.ToString("n0") + "/min, " + node.tickLag + "ms\n" +
                node.ticksReceived.ToString("n0") + "\n" +
                node.lastTickProcessed.ToString("HH:mm:ss") + "\n" +
                node.runningOn;
        }
Example #2
0
        public List <QNode> nodes()
        {
            var bySystem = new LazyDictionary <string, List <LiveSystem> > (system => new List <LiveSystem>());

            each(systems, liveSystem => bySystem.get(liveSystem.siv().system()).Add(liveSystem));
            var result = list(convert(bySystem.keys(), system => {
                var liveSystems = bySystem.get(system);
                var systemNode  = new QNode(system, liveSystems.Count, 0);
                each(liveSystems, liveSystem => {
                    var liveSystemNode = systemNode.add(new LiveSystemNode(liveSystem, 1, 0));
                    var liveMarkets    = list <MsivPv>(liveSystem.liveMarkets());
                    each(liveMarkets, liveMarket => {
                        try {
                            var symbol         = new Symbol(liveMarket.market());
                            var liveMarketNode = new LiveMarketNode(symbol, 1, 0);
                            liveSystemNode.add(liveMarketNode);
                            var topic = new Topic(liveSystem.topicName(OrderTable.prefix, symbol.name + "." + SystemHeartbeat.SUFFIX));
                            topic.subscribeIfNeeded();
                            updateModelNodes += () => updateNode(topic, liveMarket, liveMarketNode);
                            symbol.subscribe(bar => recordMarketDataTickReceived(liveMarket, bar.time));
                            topic.subscribe(fields => {
                                var tickTime = fields.time("lastTickProcessed");
                                ticks.get(liveMarket).systemProcessed(date(tickTime));
                            });
                        } catch (Exception ex) {
                            LogC.err("exception caught subscribing to tick data for " + liveMarket + ", " + system, ex);
                            gui.alertUser("exception caught susbcribing to data for " + liveMarket + ", " + system + ".\nSkipping... see log for details.");
                        }
                    });
                    updateModelNodes += () => updateNode(liveSystem, liveSystemNode);
                });
                updateModelNodes += () => updateNode(systemNode);
                return(systemNode);
            }));

            timerManager().everyMillis(1000, updateModelNodes, out timer);
            LiveLauncher.subscribeHeartbeat(gui.launcherAvailable);
            LogC.ignore(timer);
            return(result);
        }