Overall Statistics |
Total Trades 209 Average Win 1.53% Average Loss -0.90% Compounding Annual Return 45.198% Drawdown 10.700% Expectancy 0.423 Net Profit 45.346% Sharpe Ratio 1.956 Loss Rate 47% Win Rate 53% Profit-Loss Ratio 1.69 Alpha 0.183 Beta 1.151 Annual Standard Deviation 0.162 Annual Variance 0.026 Information Ratio 1.471 Tracking Error 0.136 Treynor Ratio 0.276 Total Fees $1025.63 |
//Copyright HardingSoftware.com, granted to the public domain. //Use entirely at your own risk. //This algorithm contains open source code from other sources, //no claim is being made to such code. using System; using System.Collections.Generic; using System.Linq; using QuantConnect.Data.Market; using QuantConnect.Data.UniverseSelection; namespace QuantConnect.Algorithm.CSharp { public class UniverseTemplate : QCAlgorithm { SecurityChanges securityChanges = SecurityChanges.None; List<StockData> highDollarVolumeStocks=new List<StockData>(); int totalHighDollarVolumeStocks=5; int totalSortedStocks=1; int rsiPeriod=5; Resolution resolution=Resolution.Daily; public override void Initialize() { UniverseSettings.Resolution = resolution; SetStartDate(2016, 8, 30); SetEndDate(2017, 8, 30); SetCash(100000); AddUniverse(coarse => { return (from stock in coarse //where stock.HasFundamentalData == false orderby stock.DollarVolume descending select stock.Symbol).Take(totalHighDollarVolumeStocks); }); } public void OnData(TradeBars data) { foreach (StockData stockData in highDollarVolumeStocks) { if (data.ContainsKey(stockData.Ticker)) { stockData.RsiIndicator.Update(Time, data[stockData.Ticker].Close); } } var sortedStocksEnumerable = from x in highDollarVolumeStocks where x.RsiIndicator.IsReady orderby x.RsiIndicator descending select x; List<StockData> sortedStocks=sortedStocksEnumerable.Take(totalSortedStocks).ToList(); foreach (var security in Portfolio.Values) { if (Securities.ContainsKey(security.Symbol)) { if (sortedStocks.Exists(x=>x.Ticker==security.Symbol)==false) { Liquidate(security.Symbol); } } } foreach (var security in sortedStocks) { if (Securities.ContainsKey(security.Ticker)) { if (Portfolio[security.Ticker].Invested==false) { SetHoldings(security.Ticker,1m/(decimal)sortedStocks.Count); } } } } public class StockData { public string Ticker; public RelativeStrengthIndex RsiIndicator; } public override void OnSecuritiesChanged(SecurityChanges changes) { securityChanges = changes; foreach (var security in securityChanges.RemovedSecurities) { List<StockData> stockDatas=highDollarVolumeStocks.Where(x=>x.Ticker==security.Symbol).ToList(); if (stockDatas.Count>=1) { highDollarVolumeStocks.Remove(stockDatas.First()); } } foreach (var security in securityChanges.AddedSecurities) { StockData stockData=new StockData(); stockData.Ticker=security.Symbol; stockData.RsiIndicator = new RelativeStrengthIndex(rsiPeriod, MovingAverageType.Exponential); var history = History(stockData.Ticker, rsiPeriod, resolution); foreach (var tradeBar in history) { stockData.RsiIndicator.Update(tradeBar.EndTime, tradeBar.Close); } highDollarVolumeStocks.Add(stockData); } securityChanges = SecurityChanges.None; } } }