Ejemplo n.º 1
0
 private CommonStockDataManager()
 {
     _url                = "http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?cb=jQuery11240010094446092091314_1536245516320&type=CT&token=4f1862fc3b5e77c150a2b985b12db0fd&sty=FCOIATC&js=(%7Bdata%3A%5B(x)%5D%2CrecordsFiltered%3A(tot)%7D)&cmd=C._A&st=(ChangePercent)&sr=-1&p=1&ps=3700&_=1536245516321";
     _configModel        = ConfigJsonHelper.GetConfigModel();
     _storageSectionPath = LocalDataPath.TopicStockLinkDataPath;
     _stockBasicPath     = LocalDataPath.LocalStockBasicDataPath;
 }
Ejemplo n.º 2
0
        public SyncDataViewModel()
        {
            StartSyncDataCommand = new RelayCommand(OnStartSyncData);
            _configModel         = ConfigJsonHelper.GetConfigModel();

            InitData();
        }
Ejemplo n.º 3
0
        private void InitData()
        {
            CanStart = true;
            CanStop  = false;

            //获取配置信息
            _configModel = ConfigJsonHelper.GetConfigModel();
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 开始监控
        /// </summary>
        private async void OnStart()
        {
            this.CanStart = false;
            StockModels.Clear();
            PageStockModels.Clear();
            _count = 0;
            this.TotalCrawledCount  = 0;
            this.BigDealRemainCount = 0;
            this.QuickRemainCount   = 0;
            StockModel.StaticIndex  = 1;
            try
            {
                _configModel = ConfigJsonHelper.GetConfigModel();
                Messenger.Default.Send(new StatusBarArgs(true, ResourceHelper.FindKey("StatusBar_Message_CheckingConfig")), StatusBarToken.UpdateStatus);
                bool isConfigUseful = await Task.Run(() => CheckConfig());

                if (!isConfigUseful)
                {
                    this.CanStart = true;
                    return;
                }

                Messenger.Default.Send(new StatusBarArgs(true, ResourceHelper.FindKey("StatusBar_Message_FilteringStock")), StatusBarToken.UpdateStatus);
                List <string> monitorStocks = GetMonitorStocks();

                if (monitorStocks == null)
                {
                    this.CanStart = true;
                    return;
                }

                if (!monitorStocks.Any())
                {
                    Messenger.Default.Send(new StatusBarArgs(true, ResourceHelper.FindKey("StatusBar_ConfigError_FilterNone")), StatusBarToken.UpdateStatus);
                    this.CanStart = true;
                    return;
                }

                CanStart = false;
                CanStop  = true;

                WebProxy proxy = null;
                if (_configModel.IsUseProxy)
                {
                    proxy = new WebProxy(_configModel.ProxyData.IP, _configModel.ProxyData.Port);
                }

                try
                {
                    _iStockRealTimeDealCrawler?.StartCrawler(proxy, _configModel.ClawlerConfigData.QueryInterval, monitorStocks);
                }
                catch (ClawlerConfigException clawlerConfigException)
                {
                    Messenger.Default.Send(new StatusBarArgs(true, clawlerConfigException.Message), StatusBarToken.UpdateStatus);
                    await Task.Run(() => _iStockRealTimeDealCrawler?.StopCrawler());

                    this.CanStart = true;
                    this.CanStop  = false;
                    return;
                }
                catch (Exception ex)
                {
                    LogBuilder.Logger.Error("start crawler error.", ex);
                }

                if (false)
                {
                    try
                    {
                        var stockAnalysisService = ServiceManager <StockTransactionModel> .Instance.GetStockAnalysisService();

                        _stockAnalysisService = stockAnalysisService;
                        _stockAnalysisService.StockAnalysisResultUpdatedEvent += StockAnalysisService_StockAnalysisResultUpdatedEvent;
                        _stockAnalysisService.RemainderCountUpdatedEvent      += _stockAnalysisService_RemainderCountUpdatedEvent;
                        _stockAnalysisService.StartAnalysis(new BigDealAnalysisStrategy(), _cacheBigDealAnalysisStrategy);
                    }
                    catch (StrategyConfigException strategyConfigException)
                    {
                        _stockAnalysisService.StockAnalysisResultUpdatedEvent -= StockAnalysisService_StockAnalysisResultUpdatedEvent;
                        _stockAnalysisService.RemainderCountUpdatedEvent      -= _stockAnalysisService_RemainderCountUpdatedEvent;
                        _stockAnalysisService.StopAnalysis();
                        Messenger.Default.Send(new StatusBarArgs(true, strategyConfigException.Message), StatusBarToken.UpdateStatus);
                        await Task.Run(() => _iStockRealTimeDealCrawler?.StopCrawler());

                        this.CanStart = true;
                        this.CanStop  = false;
                        return;
                    }
                    catch (Exception ex)
                    {
                        LogBuilder.Logger.Error("start moniter BigOrderStrategy error.", ex);
                    }
                }

                if (true)
                {
                    try
                    {
                        var quickAnalysisService = ServiceManager <StockTransactionModelExtern> .Instance.GetStockAnalysisService();

                        _quickAnalysisService = quickAnalysisService;
                        _quickAnalysisService.StockAnalysisResultUpdatedEvent += _quickAnalysisService_StockAnalysisResultUpdatedEvent;
                        _quickAnalysisService.RemainderCountUpdatedEvent      += _quickAnalysisService_RemainderCountUpdatedEvent;
                        _quickAnalysisService.StartAnalysis(new QuickUpAnalysisStrategy(), _cacheQuickUpAnalysisStrategy);
                    }
                    catch (StrategyConfigException strategyConfigException)
                    {
                        _quickAnalysisService.StockAnalysisResultUpdatedEvent -= _quickAnalysisService_StockAnalysisResultUpdatedEvent;
                        _quickAnalysisService.RemainderCountUpdatedEvent      -= _quickAnalysisService_RemainderCountUpdatedEvent;
                        _quickAnalysisService.StopAnalysis();
                        Messenger.Default.Send(new StatusBarArgs(true, strategyConfigException.Message), StatusBarToken.UpdateStatus);
                        await Task.Run(() => _iStockRealTimeDealCrawler?.StopCrawler());

                        this.CanStart = true;
                        this.CanStop  = false;
                        return;
                    }
                    catch (Exception ex)
                    {
                        LogBuilder.Logger.Error("start moniter RapidRiseStrategy error.", ex);
                    }
                }
                MonitoringStockCount = monitorStocks.Count;
                Messenger.Default.Send(new StatusBarArgs(true, ResourceHelper.FindKey("StatusBar_Message_Monitoring")), StatusBarToken.UpdateStatus);
            }
            catch (Exception ex)
            {
                CanStart = true;
                CanStop  = false;
                Messenger.Default.Send(new StatusBarArgs(true, string.Format(ResourceHelper.FindKey("StatusBar_Message_StartMonitorFailed"), ex.Message)), StatusBarToken.UpdateStatus);
                LogBuilder.Logger.Error("开始监控 - 失败", ex);
            }
        }
        /// <summary>
        /// 开始爬取数据
        /// </summary>
        /// <param name="interval">单位:毫秒</param>
        public void StartCrawler(WebProxy webProxy, int interval, IEnumerable <string> stockCodes)
        {
            if (_isStarted)
            {
                return;
            }
            _isStarted = true;
            _isStoped  = false;
            _interval  = interval;
            _webProxy  = webProxy;

            _configModel = ConfigJsonHelper.GetConfigModel();

            CheckConfig();

            _pageSize = GetPageSize();

            _taskWorkCodeCount = _configModel.ClawlerConfigData.CodeCountPerThread;
            _monitorStocks     = new List <string>(stockCodes);

            //分配一个线程专门从缓存中取出数据及数据转换并通过事件通知订阅者
            Task.Factory.StartNew(() =>
            {
                while (!_isStoped)
                {
                    try
                    {
                        Tuple <string, string> tuple;
                        var dequeueSuccesful = _responseJsonQueue.TryDequeue(out tuple);
                        if (dequeueSuccesful)
                        {
                            var queryStockTransactionResponseModel = JsonHelper.DeserializeJsonToObject <QueryStockTransactionResponseModel>(tuple.Item2);
                            var addedStr = new List <string>();
                            if (_datasDic.ContainsKey(tuple.Item1))
                            {
                                addedStr = queryStockTransactionResponseModel.Value.Datas.Except(_datasDic[tuple.Item1]).ToList();
                                _datasDic[tuple.Item1].AddRange(addedStr);
                            }
                            else
                            {
                                addedStr = new List <string>(queryStockTransactionResponseModel.Value.Datas);
                                _datasDic.Add(tuple.Item1, addedStr);
                            }

                            if (addedStr.Any())
                            {
                                List <StockTransactionModel> addedModels = DtoHelper.GetStockTransactionModels(addedStr);
                                addedModels.ForEach(x => x.Code          = tuple.Item1);
                                StockRealTimeDealUpdatedEven?.Invoke(new StockRealTimeDealUpdatedEventArgs(addedModels));
                            }
                        }
                    }
                    catch (Exception)
                    {
                    }
                    Thread.Sleep(1);
                }
            }, TaskCreationOptions.LongRunning);


            var count = _monitorStocks.Count % _taskWorkCodeCount == 0 ? _monitorStocks.Count / _taskWorkCodeCount : _monitorStocks.Count / _taskWorkCodeCount + 1;

            for (int i = 1; i <= count; i++)
            {
                var           codes = _monitorStocks.Take(i * _taskWorkCodeCount).Skip((i - 1) * _taskWorkCodeCount);
                WorkTaskModel model = new WorkTaskModel();
                model.StockCodes = new List <string>(codes);
                model.Cts        = new CancellationTokenSource();

                //System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)0X007F;
                //指定线程在哪个cpu上运行,由于此程序的cpu占用率过高,想通过这种方式降低cpu
                //此方式确实可以降低cpu,但是数据处理速度慢了很多,所以还是放弃这种方式
                int userCount = 4;
                int core      = i % userCount == 0 ? 1 + i % userCount : i % userCount;

                model.WorkTask = new Task(() => { DoCrawler(model.StockCodes, model.Cts.Token, core); }, model.Cts.Token, TaskCreationOptions.LongRunning);
                _workTasks.Add(model);
            }

            _workTasks.ForEach(work =>
            {
                work.WorkTask.Start();
            });
        }
Ejemplo n.º 6
0
        public void Start(IEnumerable <StockTransactionModelExtern> stockBases)
        {
            if (_isStarted)
            {
                return;
            }
            _isStarted = true;
            _isStoped  = false;
            _cacheStockTransactionModelExterns = stockBases as ConcurrentQueue <StockTransactionModelExtern>;
            if (_cacheStockTransactionModelExterns == null)
            {
                throw new ArgumentException($"'stockBases' type must be ConcurrentQueue<StockTransactionModelExtern>.");
            }

            _configModel = ConfigJsonHelper.GetConfigModel();

            CheckConfig();

            _itemWorkCount = _configModel.QuickUpStrategyConfigData.StockMaxCountEachGroup;
            int threadCount = _configModel.QuickUpStrategyConfigData.ThreadCount;

            this._forwardSeconds      = _configModel.QuickUpStrategyConfigData.ForwardSeconds;
            this._afterSeconds        = _configModel.QuickUpStrategyConfigData.AfterSeconds;
            this._dealAmountThreshold = (int)_configModel.QuickUpStrategyConfigData.DealAmountThreshold;
            this._quickUpThreshold    = _configModel.QuickUpStrategyConfigData.QuickUpThreshold / 100;

            for (int ntask = 1; ntask <= threadCount; ntask++)
            {
                Task.Factory.StartNew(() =>
                {
                    //System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)ntask;
                    var remainCount = 0;
                    while (!_isStoped)
                    {
                        try
                        {
                            //剩余待处理的数量
                            int count = _cacheStockTransactionModelExterns.Count;
                            if (remainCount != count)
                            {
                                remainCount = count;
                                RemainderCountUpdatedEvent.Invoke(this, count);
                            }

                            bool isDequeueSuccess = _cacheStockTransactionModelExterns.TryDequeue(out var model);
                            if (isDequeueSuccess)
                            {
                                if (!_modelsCaches.Any())
                                {
                                    _modelsCaches.TryAdd(0, new ConcurrentDictionary <string, ConcurrentQueue <StockTransactionModelExtern> >());
                                    StockGroupWork(_modelsCaches[0], _modelsCaches.Count);
                                }

                                for (int i = 0; ; i++)
                                {
                                    //如果字典已有此个股
                                    if (_modelsCaches[i].ContainsKey(model.Code))
                                    {
                                        _modelsCaches[i][model.Code].Enqueue(model);
                                        break;
                                    }

                                    //如果未包含此个股,且字典容量小于所设定的容量限制
                                    if (_modelsCaches[i].Count < _itemWorkCount)
                                    {
                                        _modelsCaches[i].TryAdd(model.Code, new ConcurrentQueue <StockTransactionModelExtern>(new List <StockTransactionModelExtern> {
                                            model
                                        }));
                                        break;
                                    }

                                    //如果字典容量超过所设定的容量限制
                                    if (!_modelsCaches.ContainsKey(i + 1))
                                    {
                                        _modelsCaches.TryAdd(i + 1, new ConcurrentDictionary <string, ConcurrentQueue <StockTransactionModelExtern> >());
                                        StockGroupWork(_modelsCaches[i + 1], _modelsCaches.Count);
                                    }
                                    continue;
                                }
                            }
                            Thread.Sleep(1);
                        }
                        catch
                        {
                        }
                    }
                }, TaskCreationOptions.LongRunning);
            }
        }