public async Task <(DateTime StartTime, DateTime EndTime)> GetTimeRange()
        {
            var script = $@"
return TradingVueObj.getRange();
";
            var arr    = await XWV.ExJs <double[]>(script);

            var startDT = TimeExtensions.FromUniversalDateTime(arr[0]);
            var endDT   = TimeExtensions.FromUniversalDateTime(arr[1]);

            return(startDT, endDT);
        }
        public TradingView(IXWebView xwv)
        {
            UnpackResources();
            XWV            = xwv ?? throw new ArgumentNullException(nameof(xwv));
            XWV.Visibility = XWebViewVisibility.Visible;

            var thread = new Thread(async(obj) =>
            {
                while (!IsDisposed)
                {
                    try
                    {
                        await Task.Delay(LoopRefreshTimeout);
                        if (LoopRefreshEnabled)
                        {
                            var ctx = XWV.ThreadSync.Invoke(() => TypedContext);
                            await RefreshAsync();
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                }
            });

            thread.Priority = ThreadPriority.BelowNormal;
            thread.Start();
            Action <double, double> timeRangeChangedHandler = (double startTime, double endTime) =>
            {
                var startDateTime = TimeExtensions.FromUniversalDateTime(startTime);
                var endDateTime   = TimeExtensions.FromUniversalDateTime(endTime);
                var args          = new TimeRangeChangedEventArgs()
                {
                    StartTime = startDateTime,
                    EndTime   = endDateTime
                };
                XWV.ThreadSync.Invoker.Invoke(() =>
                {
                    TimeRangeChanged?.Invoke(this, args);
                });
            };

            xwv.BindToJs(timeRangeChangedHandler, "timeRangeUpdated", "window");
        }