Overall Statistics |
Total Trades 1140 Average Win 1.29% Average Loss -1.24% Compounding Annual Return 1.988% Drawdown 49.400% Expectancy 0.026 Net Profit 15.711% Sharpe Ratio 0.203 Loss Rate 50% Win Rate 50% Profit-Loss Ratio 1.04 Alpha 0.001 Beta 0.504 Annual Standard Deviation 0.246 Annual Variance 0.06 Information Ratio -0.19 Tracking Error 0.245 Treynor Ratio 0.099 Total Fees $3820.58 |
namespace QuantConnect { public class BasicTemplateAlgorithm : QCAlgorithm { string Dow30 = "MMM,APX,AAPL,BA,CAT,CVX,CSCO,KO,DIS,DD,XOM,GE,GS,HD,IBM,INTC,JNJ,JPM,MCD,MRK,MSFT,NKE,PFE,PG,TRV,UTX,UNH,VZ,V,WMT"; string symbols; List<IndicatorBase<IndicatorDataPoint>> Daily_Close; List<string> symbolList; public override void Initialize() { SetStartDate(2008, 1, 1); SetEndDate(DateTime.Now.Date.AddDays(-1)); //SetEndDate(2008, 4, 1); SetCash(10000); symbols = Dow30; symbolList = new List<string>(symbols.Split(new char[] { ',' })); Daily_Close = new List<IndicatorBase<IndicatorDataPoint>>(); Daily_Close.Clear(); for (int n = 0; n < symbolList.Count; n++) { AddSecurity(SecurityType.Equity, symbolList[n], Resolution.Minute); Securities[symbolList[n]].DataFilter = new IncludeOnlyBeginningAndEndOfDayFilter(); Daily_Close.Add(SMA(symbolList[n], 1, Resolution.Daily)); } } public void OnData(TradeBars data) { for (int n=0; n< symbolList.Count; n++) { string symbol = symbolList[n]; if (!data.ContainsKey(symbol)) { continue; } if ((!Portfolio.HoldStock) && (Time.TimeOfDay.TotalHours >= 9.54) && (Time.TimeOfDay.TotalHours < 15.75)) { decimal buyLimit = Daily_Close[n] * 0.98m; decimal price = data[symbol].Price; if ( price < buyLimit) { int quantity = (int)Math.Floor(Portfolio.Cash * 0.99m / price); var id = Order(symbol, quantity); Log("Order: " + Transactions.GetOrderById(id)); break; } } } if (Portfolio.HoldStock) { if ((Time.Minute == 59) && (Time.Hour == 15)) { Liquidate(); } } } // since this strategy really only needs to make actions at specific times // we can limit he amount of data that runs through the system using a data // filtere. here I define a filter which only includes data from the first // and last 30 minutes of equities trading class IncludeOnlyBeginningAndEndOfDayFilter : SecurityDataFilter { public override bool Filter(Security security, BaseData data) { if (data.Time.Hour < 10 || data.Time.TimeOfDay > new TimeSpan(15, 30, 0)) { // only forward data before 10am or after 3:30pm return true; } return false; } } } }