| Overall Statistics |
|
Total Trades 229 Average Win 8.34% Average Loss -3.54% Compounding Annual Return 694.935% Drawdown 51.600% Expectancy 0.311 Net Profit 572.698% Sharpe Ratio 2.179 Loss Rate 61% Win Rate 39% Profit-Loss Ratio 2.36 Alpha 2.291 Beta -1.172 Annual Standard Deviation 1.01 Annual Variance 1.02 Information Ratio 2.055 Tracking Error 1.034 Treynor Ratio -1.878 Total Fees $1027.85 |
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 = "DWTI";
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 of data.
SetWarmup(TimeSpan.FromMinutes(900));
//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.001m;
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 < 75)
{
// 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)
{
}
}
}