Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using QuantConnect.Data; using QuantConnect.Data.Market; using System.Diagnostics; using System.Collections.Concurrent; using QuantConnect.Indicators; using QuantConnect.Data.UniverseSelection; namespace QuantConnect.Algorithm.CSharp { class TopGainers : QCAlgorithm { private int _universeSize = 500, _trackerCount = 5; private readonly ConcurrentDictionary<Symbol, UniverseSelectionData> universeSelectionData = new ConcurrentDictionary<Symbol, UniverseSelectionData>(); /// <summary> /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized. /// </summary> public override void Initialize() { SetCash(100000); SetStartDate(2017, 08, 01); UniverseSettings.Resolution = Resolution.Minute; AddUniverse(coarse => { // define universe of top N stocks by dollar volume // while doing this, update our selection data to track // our rate of change per security var topDollarVolume = from c in coarse let data = universeSelectionData.GetOrAdd(c.Symbol, sym => new UniverseSelectionData(this, sym)) where data.Update(c) orderby c.DollarVolume descending select data; // now that we're ordered by dollar volume and have updated // our data for each security, take the top N by dollar volume // and then take the top M by rate of change return topDollarVolume.Take(_universeSize) .OrderByDescending(d => d.RateOfChange) .Take(_trackerCount) .Select(d => d.Symbol); }); Schedule.On(DateRules.EveryDay(), TimeRules.At(9, 31), SelectStocks); } private void SelectStocks() { var members = UniverseManager.SingleOrDefault(u => u.Key.Value == "QC-UNIVERSE-COARSE-USA").Value.Members; Debug(Time.ToShortDateString() + ": " + String.Join(", ", members.Select(x => x.Key))); foreach (var s in Securities) { if (members.Count(x => x.Key == s.Key) > 0 && s.Key.Value != "SPY") Securities.Remove(s.Key); } } /// <summary> /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. /// </summary> /// <param name="data">Slice object keyed by symbol containing the stock data</param> public override void OnData(Slice data) { if (!Portfolio.Invested) { } } class UniverseSelectionData { public readonly Symbol Symbol; public readonly RateOfChange RateOfChange; public UniverseSelectionData(QCAlgorithm algorithm, Symbol symbol) { Symbol = symbol; RateOfChange = new RateOfChange("ROC-" + symbol, 2); } public bool Update(CoarseFundamental coarse) { return RateOfChange.Update(coarse.EndTime, coarse.Value); } } } }