コード例 #1
0
        private void BrAccViewerSendSnapshotAndHist()
        {
            if (m_braccSelectedNavAsset == null)
            {
                return;
            }
            byte[]? encodedMsg = null;
            var brAcc = GetBrAccViewerAccountSnapshot();

            if (brAcc != null)
            {
                encodedMsg = Encoding.UTF8.GetBytes("BrAccViewer.BrAccSnapshot:" + Utils.CamelCaseSerialize(brAcc));
                if (WsWebSocket !.State == WebSocketState.Open)
                {
                    WsWebSocket.SendAsync(new ArraySegment <Byte>(encodedMsg, 0, encodedMsg.Length), WebSocketMessageType.Text, true, CancellationToken.None);
                }
            }

            IEnumerable <AssetHistJs>?brAccViewerHist = GetBrAccViewerHist("YTD");

            if (brAccViewerHist != null)
            {
                encodedMsg = Encoding.UTF8.GetBytes("BrAccViewer.Hist:" + Utils.CamelCaseSerialize(brAccViewerHist));
                if (WsWebSocket !.State == WebSocketState.Open)
                {
                    WsWebSocket.SendAsync(new ArraySegment <Byte>(encodedMsg, 0, encodedMsg.Length), WebSocketMessageType.Text, true, CancellationToken.None);
                }
            }
        }
コード例 #2
0
        private void SendRealtimeWs()
        {
            IEnumerable <AssetRtJs> rtMktSummaryToClient = GetRtStat();

            byte[] encodedMsg = Encoding.UTF8.GetBytes("MktHlth.RtStat:" + Utils.CamelCaseSerialize(rtMktSummaryToClient));
            if (WsWebSocket !.State == WebSocketState.Open)
            {
                WsWebSocket.SendAsync(new ArraySegment <Byte>(encodedMsg, 0, encodedMsg.Length), WebSocketMessageType.Text, true, CancellationToken.None);    //  takes 0.635ms
            }
        }
コード例 #3
0
        private void SendHistoricalWs()
        {
            IEnumerable <AssetHistStatJs> periodStatToClient = GetLookbackStat(m_lastLookbackPeriodStr);

            byte[] encodedMsg = Encoding.UTF8.GetBytes("MktHlth.NonRtStat:" + Utils.CamelCaseSerialize(periodStatToClient));
            if (WsWebSocket !.State == WebSocketState.Open)
            {
                WsWebSocket.SendAsync(new ArraySegment <Byte>(encodedMsg, 0, encodedMsg.Length), WebSocketMessageType.Text, true, CancellationToken.None);    //  takes 0.635ms
            }
        }
コード例 #4
0
        // Return from this function very quickly. Do not call any Clients.Caller.SendAsync(), because client will not notice that connection is Connected, and therefore cannot send extra messages until we return here
        public void OnConnectedWsAsync_BrAccViewer(bool p_isThisActiveToolAtConnectionInit, User p_user)
        {
            Task.Run(() =>                                // running parallel on a ThreadPool thread
            {
                Thread.CurrentThread.IsBackground = true; //  thread will be killed when all foreground threads have died, the thread will not keep the application alive.

                // Assuming this tool is not the main Tab page on the client, we delay sending all the data, to avoid making the network and client too busy an unresponsive
                if (!p_isThisActiveToolAtConnectionInit)
                {
                    Thread.Sleep(TimeSpan.FromMilliseconds(5000));
                }

                List <BrokerNav> selectableNavs = p_user.GetAllVisibleBrokerNavsOrdered();
                m_braccSelectedNavAsset         = selectableNavs.FirstOrDefault();

                List <string> marketBarSqTickers = (p_user.Username == "drcharmat") ? c_marketBarSqTickersDc : c_marketBarSqTickersDefault;
                m_marketBarAssets = marketBarSqTickers.Select(r => MemDb.gMemDb.AssetsCache.GetAsset(r)).ToList();

                HandshakeBrAccViewer handshake = GetHandshakeBrAccViewer(selectableNavs);
                byte[] encodedMsg = Encoding.UTF8.GetBytes("BrAccViewer.Handshake:" + Utils.CamelCaseSerialize(handshake));
                if (WsWebSocket !.State == WebSocketState.Open)
                {
                    WsWebSocket.SendAsync(new ArraySegment <Byte>(encodedMsg, 0, encodedMsg.Length), WebSocketMessageType.Text, true, CancellationToken.None);
                }

                BrAccViewerSendMarketBarLastCloses();

                BrAccViewerSendSnapshotAndHist();

                // for both the first and the second client, we get RT prices from MemDb immediately and send it back to this Client only.

                // // 1. Send the Historical data first. SendAsync() is non-blocking. GetLastRtPrice() can be blocking
                // SendHistoricalWs();
                // // 2. Send RT price later, because GetLastRtPrice() might block the thread, if it is the first client.
                // SendRealtimeWs();

                // lock (m_rtMktSummaryTimerLock)
                // {
                //     if (!m_rtMktSummaryTimerRunning)
                //     {
                //         Utils.Logger.Info("OnConnectedAsync_MktHealth(). Starting m_rtMktSummaryTimer.");
                //         m_rtMktSummaryTimerRunning = true;
                //         m_rtMktSummaryTimer.Change(TimeSpan.FromMilliseconds(m_rtMktSummaryTimerFrequencyMs), TimeSpan.FromMilliseconds(-1.0));    // runs only once. To avoid that it runs parallel, if first one doesn't finish
                //     }
                // }
            });
        }
コード例 #5
0
        private void BrAccViewerSendMarketBarLastCloses()
        {
            var lastCloses      = MemDb.gMemDb.GetSdaLastCloses(m_marketBarAssets, Utils.ConvertTimeFromUtcToEt(DateTime.UtcNow));
            var mktBrLastCloses = lastCloses.Select(r =>
            {
                return(new AssetLastCloseJs()
                {
                    AssetId = r.Asset.AssetId, LastClose = r.SdaLastClose, Date = r.Date
                });
            });

            byte[] encodedMsg = Encoding.UTF8.GetBytes("BrAccViewer.MktBrLstCls:" + Utils.CamelCaseSerialize(mktBrLastCloses));
            if (WsWebSocket !.State == WebSocketState.Open)
            {
                WsWebSocket.SendAsync(new ArraySegment <Byte>(encodedMsg, 0, encodedMsg.Length), WebSocketMessageType.Text, true, CancellationToken.None);
            }
        }
コード例 #6
0
        void EvMemDbHistoricalDataReloaded_MktHealth()
        {
            Utils.Logger.Info("EvMemDbHistoricalDataReloaded_mktHealth() START");

            IEnumerable <AssetHistStatJs> periodStatToClient = GetLookbackStat(m_lastLookbackPeriodStr);     // reset lookback to to YTD. Because of BrokerNAV, lookback period stat is user specific.

            Utils.Logger.Info("EvMemDbHistoricalDataReloaded_mktHealth(). Processing client:" + UserEmail);
            byte[] encodedMsg = Encoding.UTF8.GetBytes("MktHlth.NonRtStat:" + Utils.CamelCaseSerialize(periodStatToClient));
            if (WsWebSocket == null)
            {
                Utils.Logger.Info("Warning (TODO)!: Mystery how client.WsWebSocket can be null? Investigate!) ");
            }
            if (WsWebSocket !.State == WebSocketState.Open)
            {
                WsWebSocket.SendAsync(new ArraySegment <Byte>(encodedMsg, 0, encodedMsg.Length), WebSocketMessageType.Text, true, CancellationToken.None);    //  takes 0.635ms
            }
        }
コード例 #7
0
        public void OnConnectedWsAsync_QckflNews(bool p_isThisActiveToolAtConnectionInit)
        {
            Task.Run(() => // running parallel on a ThreadPool thread
            {
                Thread.CurrentThread.IsBackground = true;  //  thread will be killed when all foreground threads have died, the thread will not keep the application alive.

                // Assuming this tool is not the main Tab page on the client, we delay sending all the data, to avoid making the network and client too busy an unresponsive
                if (!p_isThisActiveToolAtConnectionInit)
                    Thread.Sleep(DashboardClient.c_initialSleepIfNotActiveToolQn); // 10 sec is quite a long waiting, but we rarely use this tool.

                m_newsDownloader.UpdateStockTickers();
                byte[] encodedMsg = Encoding.UTF8.GetBytes("QckfNews.Tickers:" + Utils.CamelCaseSerialize(m_newsDownloader.GetStockTickers()));
                if (WsWebSocket!.State == WebSocketState.Open)
                    WsWebSocket.SendAsync(new ArraySegment<Byte>(encodedMsg, 0, encodedMsg.Length), WebSocketMessageType.Text, true, CancellationToken.None);

                TriggerQuickfolioNewsDownloader();
            });
        }