Overall Statistics |
Total Trades 140 Average Win 10.82% Average Loss -6.01% Compounding Annual Return 86.818% Drawdown 65.700% Expectancy 0.144 Net Profit 77.464% Sharpe Ratio 1.01 Loss Rate 59% Win Rate 41% Profit-Loss Ratio 1.80 Alpha 1.093 Beta -0.651 Annual Standard Deviation 1.032 Annual Variance 1.066 Information Ratio 0.921 Tracking Error 1.049 Treynor Ratio -1.603 Total Fees $1023.86 |
namespace QuantConnect { /* * 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 RollingWindowAlgorithm : QCAlgorithm { public const string Symbol = "UWTI"; public ExponentialMovingAverage Fast; public ExponentialMovingAverage Slow; public MovingAverageConvergenceDivergence DailyMacd; public Momentum DailyMomentum; public RelativeStrengthIndex DailyRSI; //Initialize the data and resolution you require for your strategy: public override void Initialize() { // Code Automatically Generated //AddSecurity(SecurityType.Equity, "NVDA", Resolution.Second); // Code Automatically Generated //AddSecurity(SecurityType.Forex, "EURUSD", Resolution.Second); //Start and End Date range for the backtest: SetStartDate(2016, 1, 1); SetEndDate(2016, 11, 30); // In Initialize // Warm up 30 days of data. //SetWarmup(TimeSpan.FromDays(30)); //Cash allocation SetCash(10000); //Add as many securities as you like. All the data will be passed into the event handler: AddSecurity(SecurityType.Equity, Symbol, Resolution.Minute); // define our 15 minute consolidator, this makes 15min bars from 1min bars var fifteenMinute = new TradeBarConsolidator(TimeSpan.FromMinutes(15)); // register the consolidator to receive data for our 'Symbol' SubscriptionManager.AddConsolidator(Symbol, fifteenMinute); // attach our 15 minute event handler, the 'OnFifteenMinuteData' will be called // at 9:45, 10:00, 10:15, ect... until 4:00pm fifteenMinute.DataConsolidated += OnFifteenMinuteData; // define our 15 minute fast EMA Fast = new ExponentialMovingAverage(5); // define our 15 minute slow EMA Slow = new ExponentialMovingAverage(20); // we can also define some daily indicators DailyMomentum = MOM(Symbol, 10); DailyMacd = MACD(Symbol, 12, 26, 9, MovingAverageType.Wilders, Resolution.Daily); DailyRSI = RSI(Symbol, 14, MovingAverageType.Simple, Resolution.Minute); } const decimal tolerance = 0.01m; public void OnFifteenMinuteData(object sender, TradeBar bar) { // update our indicators Fast.Update(Time, bar.Close); Slow.Update(Time, bar.Close); var quantity = Portfolio[Symbol].Quantity; // short or flat and longer term up //if (quantity <= 0 && DailyRSI > 25 && DailyMomentum > 0) if (quantity <= 0 && DailyRSI > 25) { // check for short term up if (Fast > Slow*(1+tolerance)) { // move everything into a long position SetHoldings(Symbol, 1.0); } } // long or flat and longer term down //else if (quantity >= 0 && DailyRSI < 75 && DailyMomentum < 0) else if (quantity >= 0 && DailyRSI < 80) { // check for short term down if (Fast < Slow*(1-tolerance)) { // move everything into a short position SetHoldings(Symbol, -1.0); } } // check for exit conditions else if (quantity != 0) { // check for long exit if (quantity > 0 && Fast < Slow*(1-tolerance)) { Liquidate(Symbol); } // check for short exit else if (quantity < 0 && Fast > Slow*(1+tolerance)) { Liquidate(Symbol); } } } //Data Event Handler: New data arrives here. "TradeBars" type is a dictionary of strings so you can access it by symbol. public void OnData(TradeBars data) { } } }