/// <summary> /// </summary> /// <param name="interval">Interval to sync with public quote server</param> /// <param name="tushare"></param> public RealtimeQuotesManager(TimeSpan interval, TushareManager tushare) { Tushare = tushare; void Elapsed(object sender, ElapsedEventArgs e) { if (TradeOff) { Synchronizer.Stop(); } if (!_lastElapsedFinished) { return; } var tasks = new List <Task>(Quotes.Count); foreach (var stock in Quotes) { string id = stock.Key; var(playBack, recent) = stock.Value; tasks.Add( GetRealTimeQuote(id) .ContinueWith( task => { var result = task.Result; if (result.Count > 0 && result[0] .TradingTime > playBack[^ 1] .TradingTime) { playBack.AddRange(result); } recent.Clear(); } ) ); } _lastElapsedFinished = false; Task.WhenAll(tasks) .ContinueWith( _ => _lastElapsedFinished = true ); } Synchronizer = new Timer(interval.TotalMilliseconds) { Immediate = true }; Synchronizer.Elapsed += Elapsed; }
public void Setup() { TuShare = new TushareManager("ecffe13bdfb4ccb617b344f276b4827d3614e0a736a5fe7c0c6767ce"); }
/// <summary> /// Default interval is 1 minutes /// </summary> public RealtimeQuotesManager(TushareManager tushare) : this(TimeSpan.FromMinutes(1), tushare) { }
/// <summary> /// </summary> /// <param name="baoStock"></param> /// <param name="tushare"></param> public StockApiController(BaoStockManager baoStock, TushareManager tushare) { BaoStock = baoStock; Tushare = tushare; }