Overall Statistics |
Total Trades 142 Average Win 7.66% Average Loss -2.01% Compounding Annual Return 1.903% Drawdown 57.900% Expectancy 0.193 Net Profit 37.806% Sharpe Ratio 0.195 Loss Rate 75% Win Rate 25% Profit-Loss Ratio 3.81 Alpha 0.032 Beta 0.018 Annual Standard Deviation 0.169 Annual Variance 0.029 Information Ratio -0.188 Tracking Error 0.258 Treynor Ratio 1.855 Total Fees $1223.39 |
/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using QuantConnect.Data; using QuantConnect.Data.Consolidators; using QuantConnect.Indicators; namespace QuantConnect.Algorithm.CSharp { /// <summary> /// Shows some ways to keep track of an indicator's history /// </summary> public class HistoricalIndicatorAlgorithm : QCAlgorithm { private const string Symbol = "SPY"; public RollingWindow<IndicatorDataPoint> EmaHistory; /// <summary> /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized. /// </summary> public override void Initialize() { SetStartDate(1998, 01, 02); //Set Start Date SetEndDate(2015, 01, 01); //Set End Date SetCash(100000); //Set Strategy Cash // Find more symbols here: http://quantconnect.com/data AddSecurity(SecurityType.Equity, Symbol, Resolution.Daily); // create a new EMA and track it's history, you can access // the current value of the EMA using EmaHistory[0], // the previous value using EmaHistory[1], ect... EmaHistory = HistoryTrackerImpl.Track(EMA(Symbol, 100), 3); } /// <summary> /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. /// </summary> /// <param name="data">Slice object keyed by symbol containing the stock data</param> public override void OnData(Slice data) { if (!EmaHistory.IsReady) return; var current = EmaHistory[0]; // all historical values are less than the current, uptrend if (Portfolio[Symbol].Quantity <= 0 && EmaHistory.All(x => current >= x)) { SetHoldings(Symbol, 1); } // all historical values are greater than the current, downtrend else if (Portfolio[Symbol].Quantity >= 0 && EmaHistory.All(x => current <= x)) { SetHoldings(Symbol, -1); } } } /// <summary> /// Provides helper methods to track the history of indicators and consolidators /// </summary> public static class HistoryTrackerImpl { /// <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 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; } } }