| Overall Statistics |
|
Total Trades 3995 Average Win 1.89% Average Loss -1.86% Compounding Annual Return 40.920% Drawdown 53.600% Expectancy 0.115 Net Profit 2996.997% Sharpe Ratio 0.958 Loss Rate 45% Win Rate 55% Profit-Loss Ratio 1.02 Alpha 0.649 Beta -11.143 Annual Standard Deviation 0.453 Annual Variance 0.205 Information Ratio 0.916 Tracking Error 0.453 Treynor Ratio -0.039 Total Fees $435477.97 |
//Copyright HardingSoftware.com, 2018.
//Granted to the public domain.
//Use entirely at your own risk.
namespace QuantConnect
{
public class EquityQueue : QCAlgorithm
{
string tickersString ="SPY,EEM,IWM,EFA,XLF,XLE,HYG,EWZ,FXI,TLT,XOP,DIA,XLK,XLI,TQQQ,IVV,XLV,GLD,GDX,XLU,XLP,IYR,IEMG,SMH,LQD,VWO,XLY,VOO,JNK,EWJ,EMB,IEF,KRE,XBI,IEFA,VNQ,XLB,VEA,GDXJ,MDY";
int maPeriod=2; //The length of the indicator.
decimal leverage=0.99m;
Resolution resolution=Resolution.Daily;
List<StockData> stockDatas = new List<StockData>();
string stockHeld="";
public override void Initialize()
{
SetStartDate(2008, 6, 1);
SetEndDate(2018, 6, 1);
SetCash(50000);
Transactions.MarketOrderFillTimeout = TimeSpan.FromSeconds(30);
string[] tickers = tickersString.Split(new string[1] { "," }, StringSplitOptions.RemoveEmptyEntries);
foreach (string ticker in tickers)
{
Symbol symbol = QuantConnect.Symbol.Create(ticker, SecurityType.Equity, Market.USA);
AddEquity(symbol, resolution);
StockData stockData=new StockData();
stockData.Ticker=ticker;
stockData.MovingAverage = new ExponentialMovingAverage(maPeriod);
stockDatas.Add(stockData);
var history = History(ticker, maPeriod+1, resolution);
foreach (var tradeBar in history)
{
stockData.history.Enqueue(tradeBar.Close);
if (stockData.history.Count>1)
{
decimal firstHistory=stockData.history.Dequeue();
decimal change=(stockData.history.Last()-firstHistory)/firstHistory;
stockData.MovingAverage.Update(Time,change);
}
}
}
}
public override void OnData(Slice data)
{
foreach (StockData stockData in stockDatas)
{
if (data.Bars.ContainsKey(stockData.Ticker)==false)
{
continue;
}
stockData.history.Enqueue(data.Bars[stockData.Ticker].Close);
if (stockData.history.Count>1)
{
decimal firstHistory=stockData.history.Dequeue();
decimal change=(stockData.history.Last()-firstHistory)/firstHistory;
stockData.MovingAverage.Update(Time,change);
}
stockData.Fitness=stockData.MovingAverage;
}
var sortedStockDatasEnumerable = from x in stockDatas
//where x.Fitness > 0
orderby x.Fitness
select x;
List<StockData> sortedStockDatas=sortedStockDatasEnumerable.ToList();
if (sortedStockDatas.Count>0)
{
StockData selectedStockData=sortedStockDatas.First();
if (selectedStockData.Ticker != stockHeld)
{
Liquidate();
SetHoldings(selectedStockData.Ticker, leverage);
stockHeld=selectedStockData.Ticker;
}
}
else if (stockDatas.Any(x=>Portfolio[x.Ticker].Quantity>0))
{
Liquidate();
}
}
class StockData
{
public string Ticker;
public Queue<decimal> history=new Queue<decimal>();
public ExponentialMovingAverage MovingAverage;
public decimal Fitness;
}
}
}