Overall Statistics |
Total Trades 72 Average Win 2.92% Average Loss -1.41% Compounding Annual Return 2.05% Drawdown 16.500% Expectancy 0.195 Net Profit 17.64% Sharpe Ratio 0.266 Loss Rate 61% Win Rate 39% Profit-Loss Ratio 2.07 Alpha 0.02 Beta 0.122 Annual Standard Deviation 0.093 Annual Variance 0.009 Information Ratio -0.074 Tracking Error 0.215 Treynor Ratio 0.202 |
/* * 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 System; using QuantConnect.Data.Consolidators; using QuantConnect.Data.Market; using QuantConnect.Indicators; namespace QuantConnect.Algorithm.Examples { /// <summary> /// Basic template algorithm simply initializes the date range and cash /// </summary> public class MultipleTimeFrameAlgorithm : QCAlgorithm { public ExponentialMovingAverage Weekly_EMA20; public ExponentialMovingAverage Weekly_EMA50; public SimpleMovingAverage Daily_SMA21; public SimpleMovingAverage Daily_Close; /// <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(2002, 01, 01); //Set Start Date SetEndDate(2010, 01, 01); //Set End Date SetCash(100000); //Set Strategy Cash // Find more symbols here: http://quantconnect.com/data AddSecurity(SecurityType.Equity, "SPY", Resolution.Minute); // we can easily create our daily indicator using the helper function 'SMA' // this is because we have defined the Resolution.Daily Daily_SMA21 = SMA("SPY", 21, Resolution.Daily); // a one day SMA is the same as the close! Daily_Close = SMA("SPY", 1, Resolution.Daily); // this will produce weekly bars from our minute SPY data stream var weeklyConsolidator = new TradeBarConsolidator(TimeSpan.FromDays(7)); // define our weekly EMAs Weekly_EMA20 = new ExponentialMovingAverage("W_EMA20", 20); Weekly_EMA50 = new ExponentialMovingAverage("W_EMA50", 50); // register the weekly EMAs to use our weekly consolidator, the x => x.Value is selecting what value gets sent // into the indicator, here we select the .Value property which is an alias for TradeBar.Close RegisterIndicator("SPY", Weekly_EMA20, weeklyConsolidator, x => x.Value); RegisterIndicator("SPY", Weekly_EMA50, weeklyConsolidator, x => x.Value); } /// <summary> /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. /// </summary> /// <param name="data">TradeBars IDictionary object with your stock data</param> public void OnData(TradeBars data) { // wait for our 20 week ema to ready up if (!Weekly_EMA20.IsReady) { return; } // we're in an uptrend and don't have a position if (!Portfolio["SPY"].Invested && Weekly_EMA20 > Weekly_EMA50) { // we closed above the SMA 21, buy! if (Daily_Close > Daily_SMA21) { MarketOrder("SPY", 1500); Debug("Purchased SPY@" + data["SPY"].Value); } } // we've crossed back below our SMA and have an open position, so liquidate our holdings if (Portfolio["SPY"].Invested && Daily_Close < Daily_SMA21) { Liquidate("SPY"); Debug("Liquidated SPY@" + data["SPY"].Value); } } } }