| Overall Statistics |
|
Total Trades 180 Average Win 1.42% Average Loss -0.97% Compounding Annual Return 59.169% Drawdown 11.100% Expectancy 0.558 Net Profit 59.372% Sharpe Ratio 2.52 Loss Rate 37% Win Rate 63% Profit-Loss Ratio 1.46 Alpha 0.264 Beta 1.138 Annual Standard Deviation 0.155 Annual Variance 0.024 Information Ratio 2.169 Tracking Error 0.129 Treynor Ratio 0.344 Total Fees $863.41 |
//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.
//Custom algorithm development: warrencharding@yahoo.com.
//Do not remove this copyright notice.
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
orderby stock.DollarVolume descending
select stock.Symbol).Take(totalHighDollarVolumeStocks);
});
}
public void OnData(TradeBars data)
{
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 = RSI(stockData.Ticker, rsiPeriod, MovingAverageType.Exponential, resolution);
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;
Trade(data);
}
public void Trade(TradeBars data)
{
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 (sortedStocks.Exists(x=>x.Ticker==security.Symbol)==false)
{
Liquidate(security.Symbol);
}
}
foreach (var security in sortedStocks)
{
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)
{
this.securityChanges = changes;
}
}
}