| Overall Statistics |
|
Total Trades 11 Average Win 0% Average Loss 0% Compounding Annual Return 24.574% Drawdown 32.600% Expectancy 0 Net Profit 0% Sharpe Ratio 0.791 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.227 Beta -0.09 Annual Standard Deviation 0.275 Annual Variance 0.076 Information Ratio 0.38 Tracking Error 0.317 Treynor Ratio -2.409 Total Fees $11.99 |
namespace QuantConnect
{
public class DonchianBreakout : QCAlgorithm
{
//Variables
// You never use this quantity because you declare it as an int in OnData
//int quantity = 0;
decimal close = 0;
string symbol = "SPY";
RollingWindow<decimal> _top = new RollingWindow<decimal>(2);
RollingWindow<decimal> _bottom = new RollingWindow<decimal>(2);
decimal top = 0;
decimal bottom = 0;
Maximum max;
Minimum min;
private Symbol _symbol;
public override void Initialize()
{
SetCash(25000);
SetStartDate(2010, 1, 1);
SetEndDate(DateTime.Now.Date.AddDays(-1));
int period = 5;
// You want to refer to symbols as a Symbol type.
var sec = AddSecurity(SecurityType.Equity, symbol, Resolution.Daily);
_symbol = sec.Symbol;
max = MAX(symbol, period, Resolution.Daily);
min = MIN(symbol, period, Resolution.Daily);
}
// previous is never used. Also putting a global declaration
// between methods like this will eventually give you trouble
// The declaration should be at the top of the class.
//private DateTime previous;
public void OnData(TradeBars data)
{
if (!max.IsReady)
return;
// data.Time is not obsolete you may want to use algorithm.Time instead
// or if you want the time coming in on data use the EndTime for the Symbol
// However, in general this statement will never cause a return because
// you do not set previous anywhere
//if (previous.Date == data.Time.Date)
// return;
// The trade bar will give you the Close
//close = Securities[symbol].Close;
close = data[_symbol].Close;
int quantity = Convert.ToInt32(Portfolio.Cash / close);
int holdings = Portfolio[symbol].Quantity;
// by declaring top as a var here, you are hiding the global variable
//var top = max; //NEED TO FIGURE OUT HOW TO LAG THIS
//var bottom = min; //NEED TO FIGURE OUT HOW TO LAG THIS
// since you want a decimal value you need to pull out the Current.Value
// Current is the latest IndicatorDataPoint
top = max.Current.Value;
bottom = min.Current.Value;
Console.WriteLine("close " + close);
Console.WriteLine("top " + top);
Console.WriteLine("bottom " + bottom);
Console.WriteLine("quantity " + quantity);
// Since max.Current is already an IDP, you can just use it.
//_top.Add(new IndicatorDataPoint(Time, top));
_top.Add(max.Current);
if (!_top.IsReady) return;
var historicMax = _top[1];
Console.WriteLine("max lagged " + historicMax);
_bottom.Add(min.Current);
if (!_bottom.IsReady) return;
var historicMin = _bottom[1];
Console.WriteLine("min lagged " + historicMin);
try
{
if (close > historicMax && holdings < 1)
{
Order(symbol, quantity);
Debug("Long");
}
if (close < historicMin && holdings > 0)
{
Order(symbol, -quantity);
Debug("Short");
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
Plot("High", historicMax);
Plot("Low", historicMin);
Plot("Close", close);
}
}
}