Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
using QuantConnect.Data.Consolidators; 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 { //Initialize the data and resolution you require for your strategy: private TradeBarConsolidator _tradeBarConsolidator; private int _tradeBarResolution = 60; private int _historyPeriods = 60; private RollingWindow<IndicatorDataPoint> _rsiHistory; private RelativeStrengthIndex _rsi; private int _rsiPeriod = 14; private RollingWindow<IndicatorDataPoint> _atrHistory; private AverageTrueRange _atr; private int _atrPeriod = 14; private RollingWindow<IndicatorDataPoint> _stochHistory; private Stochastic _stoch; private Symbol _symbol; private RollingWindow<TradeBar> _barHistory; public override void Initialize() { //Start and End Date range for the backtest: SetStartDate(DateTime.Now.Date.AddDays(-4)); SetEndDate(DateTime.Now.Date.AddDays(-2)); //Cash allocation SetCash(25000); //Add as many securities as you like. All the data will be passed into the event handler: _symbol = QuantConnect.Symbol.Create("EURUSD", SecurityType.Forex, Market.Oanda); AddSecurity(SecurityType.Forex, _symbol, Resolution.Minute); _tradeBarConsolidator = new TradeBarConsolidator(TimeSpan.FromMinutes(_tradeBarResolution)); _stoch = new Stochastic(11, 3, 3); RegisterIndicator(_symbol, _stoch, _tradeBarConsolidator); _stochHistory = HistoryTracker.TrackBar(_stoch, _historyPeriods + 1); //_stochHistory = new RollingWindow<Stochastic>(_historyPeriods + 1); _rsi = new RelativeStrengthIndex(_rsiPeriod); RegisterIndicator(_symbol, _rsi, _tradeBarConsolidator); _rsiHistory = HistoryTracker.Track(_rsi, _historyPeriods + 1); //_rsiHistory = new RollingWindow<RelativeStrengthIndex>(_historyPeriods + 1); _atr = new AverageTrueRange(_atrPeriod); RegisterIndicator(_symbol, _atr, _tradeBarConsolidator); _atrHistory = HistoryTracker.TrackBar(_atr, _historyPeriods + 1); //_atrHistory = new RollingWindow<AverageTrueRange>(_historyPeriods + 1); _tradeBarConsolidator.DataConsolidated += _tradeBarConsolidator_DataConsolidated; SubscriptionManager.AddConsolidator(_symbol, _tradeBarConsolidator); } private void _tradeBarConsolidator_DataConsolidated(object sender, TradeBar data) { if (!_stoch.IsReady) return; //_stochHistory.Add(_stoch); //_atrHistory.Add(_atr); //_rsiHistory.Add(_rsi); if (_stochHistory.IsReady && _rsiHistory.IsReady && _atrHistory.IsReady) { for (int i = 0; i < _historyPeriods; i++) { if (_rsiHistory[i + 1].EndTime != _atrHistory[i + 1].EndTime && _atrHistory[i + 1].EndTime != _stochHistory[i + 1].EndTime) { Log("Times Do Not Align - Pre Sample Assignment"); } double[] sample = new double[3]; //Stoch sample[0] = Convert.ToDouble(_stochHistory[i+1]); //RSI sample[1] = Convert.ToDouble(_rsiHistory[i+1]); //ATR sample[2] = Convert.ToDouble(_atrHistory[i+1]); DateTime stochTime = _stochHistory[i+1].EndTime; DateTime rsiTime = _rsiHistory[i+1].EndTime; DateTime atrTime = _atrHistory[i+1].EndTime; if (stochTime != rsiTime && rsiTime != atrTime) { Log("Times Do Not Align - Post Sample Assignment"); } } } } } }
namespace QuantConnect { /// <summary> /// Provides helper methods to track the history of indicators and consolidators /// </summary> public static class HistoryTracker { /// <summary> /// Track an indicator's history /// </summary> /// <typeparam name="T">The indicator's input type</typeparam> /// <param name="indicator">The indicator to track</param> /// <param name="historyLength">The length of history to keep, defaults to 8</param> /// <returns>A rolling window of the requested length that will automatically update as the indicator does</returns> public static RollingWindow<IndicatorDataPoint> Track<T>(IndicatorBase<T> indicator, int historyLength = 8) where T : BaseData { // create a rolling window of the requested length var window = new RollingWindow<IndicatorDataPoint>(historyLength); // wire up an event so that each time the indicator gets updated, we add the new value to our window indicator.Updated += (sender, args) => window.Add(indicator.Current); // return the window now that it's wired up to the indicator return window; } /// <summary> /// Track an indicator's history /// </summary> /// <typeparam name="T">The indicator's input type</typeparam> /// <param name="indicator">The indicator to track</param> /// <param name="historyLength">The length of history to keep, defaults to 8</param> /// <returns>A rolling window of the requested length that will automatically update as the indicator does</returns> //TODO - This should be cleaned up to make the Track method more generic so we don't have to accept the strong type BarIndicator public static RollingWindow<IndicatorDataPoint> TrackBar(BarIndicator indicator, int historyLength = 8) { // create a rolling window of the requested length var window = new RollingWindow<IndicatorDataPoint>(historyLength); // wire up an event so that each time the indicator gets updated, we add the new value to our window indicator.Updated += (sender, args) => window.Add(indicator.Current); // return the window now that it's wired up to the indicator return window; } /// <summary> /// Track an consolidator's history /// </summary> /// <typeparam name="T">The consolidator's output type</typeparam> /// <param name="consolidator">The consolidator to track</param> /// <param name="historyLength">The length of history to keep, defaults to 8</param> /// <returns>A rolling window of the requested length that will automatically update as the consolidator does</returns> public static RollingWindow<T> Track<T>(DataConsolidator<T> consolidator, int historyLength = 8) where T : BaseData { // create a rolling window of the requested length var window = new RollingWindow<T>(historyLength); // wire up and event so that each time the consolidator gets updated, we add the new value to our window consolidator.DataConsolidated += (sendar, args) => window.Add((T)args); // return the window now that it's ired up to the indicator return window; } /// <summary> /// Track an consolidator's history /// </summary> /// <typeparam name="T">The consolidator's output type</typeparam> /// <param name="consolidator">The consolidator to track</param> /// <param name="historyLength">The length of history to keep, defaults to 8</param> /// <returns>A rolling window of the requested length that will automatically update as the consolidator does</returns> public static RollingWindow<T> Track<T>(IDataConsolidator consolidator, int historyLength = 8) where T : class { // create a rolling window of the requested length var window = new RollingWindow<T>(historyLength); // wire up and event so that each time the consolidator gets updated, we add the new value to our window consolidator.DataConsolidated += (sendar, args) => window.Add(args as T); // return the window now that it's ired up to the indicator return window; } } }