Overall Statistics |
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 61.179% Drawdown 1.000% Expectancy 0 Net Profit 0% Sharpe Ratio 7.646 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.131 Beta 0.493 Annual Standard Deviation 0.06 Annual Variance 0.004 Information Ratio -3.364 Tracking Error 0.061 Treynor Ratio 0.931 Total Fees $1.00 |
namespace QuantConnect { public class ConsolidatorAlgorithm : QCAlgorithm { public override void Initialize() { SetStartDate(2013, 1, 1); SetEndDate(2013, 2, 1); SetCash(25000); AddSecurity(SecurityType.Equity, "SPY", Resolution.Minute); // define our 15 minute consolidator var fifteenMinuteConsolidator = new TradeBarConsolidator(TimeSpan.FromMinutes(15)); // if we want to make decisions every 15 minutes as well, we can add an event handler // to the DataConsolidated event fifteenMinuteConsolidator.DataConsolidated += OnFiftenMinuteSPY; int fast = 15; int slow = 30; // EDIT:: If we want something other than the closing value of the bar to be pushed into our // indicators, then we can specify that in the RegisterIndicator method as shown b // define our EMA, we'll manually register this, so we aren't using the helper function 'EMA(...)' var fastEmaOnFifteenMinuteBars = new ExponentialMovingAverage("SPY_High_EMA15", fast); var slowEmaOnFifteenMinuteBars = new ExponentialMovingAverage("SPY_Low_EMA30", slow); // we can define complex indicator's using various extension methods. // here I use the 'Over' extension method which performs division // so this will be fast/slow. This returns a new indicator that represents // the division operation between the two var ratio = fastEmaOnFifteenMinuteBars.Over(slowEmaOnFifteenMinuteBars, "SPY_Ratio_EMA"); // now we can use the 'Of' extension method to define the ROC on the ratio // The 'Of' extension method allows combining multiple indicators together such // that the data from one gets sent into the other var rocpOfRatio = new RateOfChangePercent("SPY_ROCP_Ratio", fast).Of(ratio); // we an even define a smoothed version of this indicator var smoothedRocpOfRatio = new ExponentialMovingAverage("SPY_Smoothed_ROCP_Ratio", 5).Of(rocpOfRatio); // register our indicator and consolidator together. this will wire the consolidator up to receive // data for the specified symbol, and also set up the indicator to receive its data from the consolidator // EDIT:: If we want to register these indicators to receive something other than the close // bar value then we can define a 'selector' to pass in to the RegisterIndicator method // The selector has a type of Func<BaseData, close> which is a function that accepts a // BaseData as input and returns a decimal value, here I used the Field.High and Field.Low // helper propertis to return the selector RegisterIndicator("SPY", fastEmaOnFifteenMinuteBars, fifteenMinuteConsolidator, Field.High); RegisterIndicator("SPY", slowEmaOnFifteenMinuteBars, fifteenMinuteConsolidator, Field.Low); // register the indicator to be plotted along PlotIndicator("SPY", fastEmaOnFifteenMinuteBars); PlotIndicator("SPY", slowEmaOnFifteenMinuteBars); PlotIndicator("SPY_ROCP_Ratio", rocpOfRatio, smoothedRocpOfRatio); PlotIndicator("SPY_Ratio_EMA", ratio); } //15 minute events here: public void OnFiftenMinuteSPY(object sender, TradeBar data) { if (!Portfolio.Invested) { SetHoldings("SPY", 1.0); } } //Traditional 1 minute events here: public void OnData(TradeBars data) { } } }