| Overall Statistics |
|
Total Trades 56 Average Win 1.86% Average Loss -3.51% Compounding Annual Return -6.462% Drawdown 34.300% Expectancy -0.071 Net Profit -15.01% Sharpe Ratio -0.307 Loss Rate 39% Win Rate 61% Profit-Loss Ratio 0.53 Alpha -0.031 Beta -0.119 Annual Standard Deviation 0.171 Annual Variance 0.029 Information Ratio -1.101 Tracking Error 0.212 Treynor Ratio 0.441 Total Fees $105.26 |
namespace QuantConnect
{
/*
* QuantConnect University: Full Basic Template:
*
* The underlying QCAlgorithm class is full of helper methods which enable you to use QuantConnect.
* We have explained some of these here, but the full algorithm can be found at:
* https://github.com/QuantConnect/QCAlgorithm/blob/master/QuantConnect.Algorithm/QCAlgorithm.cs
*/
public class BasicTemplateAlgorithm : QCAlgorithm
{
SimpleMovingAverage sma;
ExponentialMovingAverage ema;
SecurityHolding SPY;
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
//Start and End Date range for the backtest:
SetStartDate(2013, 1, 1);
SetEndDate(DateTime.Now.Date.AddDays(-1));
//Cash allocation
SetCash(25000);
// register for hourly SPY data
AddSecurity(SecurityType.Equity, "SPY", Resolution.Hour);
// define our 6 period SMA, we'll pump 4-hour data into this guy
sma = new SimpleMovingAverage("SMA6", 6);
// define out 9 period EMA, we'll pump 4-hour data into this guy as well
ema = new ExponentialMovingAverage("EMA19", 19);
// define a 4 hour consolidator, each consolidator can only be bound to
// a single symbol, so if we wanted to also do AAPL data, we would need
// another consolidator for AAPL
var fourHourSpy = ResolveConsolidator("SPY", TimeSpan.FromHours(4));
// register our sma to receive data from our fourHourSpy consolidator, making our
// sma a 6 period 4-hour SMA
RegisterIndicator("SPY", sma, fourHourSpy);
// register our ema to receive data from our fourHourSpy consolidator, making our
// ema a 6 period 4-hour SMA
RegisterIndicator("SPY", ema, fourHourSpy);
// Plot our indicators on each new update
PlotIndicator("SPY", sma, ema);
SPY = Portfolio["SPY"];
}
//Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol.
public void OnData(TradeBars data)
{
if (!sma.IsReady || !ema.IsReady) return;
const decimal threshold = 0.000075m;
if (SPY.Quantity <= 0 && ema > sma*(1+threshold))
{
SetHoldings("SPY", .75m);
}
else if (SPY.Quantity >= 0 && ema < sma*(1-threshold))
{
SetHoldings("SPY", -.75m);
}
}
}
}