| Overall Statistics |
|
Total Trades 4 Average Win 0% Average Loss 0% Compounding Annual Return 77.818% Drawdown 0.100% Expectancy 0 Net Profit 0% Sharpe Ratio 11.62 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.133 Beta 0.293 Annual Standard Deviation 0.043 Annual Variance 0.002 Information Ratio -8.014 Tracking Error 0.093 Treynor Ratio 1.701 Total Fees $4.00 |
using System;
using System.Text.RegularExpressions;
namespace QuantConnect
{
/// <summary>
/// QC University algorithm to demonstrate split and dividend events
/// </summary>
public class QCUTotalReturnsAlgorithm : QCAlgorithm
{
private int sliceCount;
private int barCount;
private int displayBarCount;
private int tickCount;
private int displayTicks;
private int securitiesToPurchase;
private class SecurityParam {
public string symbol = "";
public decimal percentInvestment = 0;
public bool purchased = false;
public bool displayBadQuantity = true;
}
private List<SecurityParam> my_securities = new List<SecurityParam>();
/// <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()
{
Debug("Initialize:+");
sliceCount = 0;
barCount = 0;
displayBarCount = 10;
tickCount = 0;
displayTicks = 2;
securitiesToPurchase = 0;
string securitiesParamStrg = GetParameter("securities");
Debug("Initialzie: securitiesParamStrg=" + securitiesParamStrg);
if (securitiesParamStrg != null)
{
Debug("Initialzie: securitiesParamStrg=" + securitiesParamStrg);
string[] securityInfo = Regex.Split(securitiesParamStrg, ",");
foreach (var securityStrg in securityInfo)
{
// Debug("Initialize: securityStrg=" + securityStrg);
Match match = Regex.Match(securityStrg, @"(\w+):(\d+)%");
//Debug("Initialize: match=" + match + " match.Groups.Count=" + match.Groups.Count);
if (match.Groups.Count >= 2)
{
SecurityParam param = new SecurityParam();
param.symbol = match.Groups[1].Captures[0].Value;
if (match.Groups.Count >= 3)
{
param.percentInvestment = Decimal.Parse(match.Groups[2].Captures[0].Value) / 100m;
securitiesToPurchase += 1;
}
else
{
param.percentInvestment = 0;
}
Debug(string.Format("Initialize: symbol={0} percentInvestment={1}",
param.symbol, param.percentInvestment));
my_securities.Add(param);
}
}
}
if (securitiesToPurchase == 0)
{ // Defaults
SecurityParam param = new SecurityParam();
param.symbol = "SPY";
param.percentInvestment = 0.25m;
my_securities.Add(param);
Debug(string.Format("Initialize: {0} {1}", param.symbol, param.percentInvestment));
param = new SecurityParam();
param.symbol = "VCLT";
param.percentInvestment = 0.25m;
my_securities.Add(param);
securitiesToPurchase = 2;
Debug(string.Format("Initialize: {0} {1}", param.symbol, param.percentInvestment));
}
SetStartDate(2010, 1, 1); //Set Start Date
//SetStartDate(1999, 01, 01); //Set Start Date
//SetStartDate(DateTime.Now.Date.AddDays(-10)); //Set Start Date
SetEndDate(2010, 1, 5); //Set End Date
//SetEndDate(DateTime.Now.Date.AddDays(-1)); //Set End Date
SetCash(10000); //Set Strategy Cash
// Add the securities half Tick and half Minute Resolution
Resolution resolution = Resolution.Tick;
foreach (var security in my_securities)
{
AddSecurity(SecurityType.Equity, security.symbol, resolution);
Securities[security.symbol].SetDataNormalizationMode(DataNormalizationMode.TotalReturn);
}
Debug("Initialize:-");
}
public override void OnData(Slice data)
{
//Debug("OnData(Slice)");
sliceCount += 1;
if (securitiesToPurchase > 0)
{
foreach (SecurityParam security in my_securities
.Where(x => !x.purchased
&& (x.percentInvestment > 0)
&& (data.Bars.ContainsKey(x.symbol) || data.Ticks.ContainsKey(x.symbol))))
{
Debug(string.Format("OnData-Slice: {0} Price={1} securitiesToPurchase={2} security.purchased={3} security.percentInvestment={4}",
security.symbol, Securities[security.symbol].Price,
securitiesToPurchase, security.purchased, security.percentInvestment));
#if true
SetHoldings(security.symbol, security.percentInvestment);
var quantity = Securities[security.symbol].Holdings.Quantity;
Debug(string.Format("OnData-Slice: Purchased Stock {0} {1}% quantity={2}",
security.symbol, security.percentInvestment, quantity));
#else
var quantity = CalculateOrderQuantity(security.symbol, (double)security.percentInvestment);
OrderTicket ticket = MarketOrder(security.symbol, quantity, false, "");
Debug(string.Format("OnData-Slice: Purchased Stock {0} {1}% ticket={2}",
security.symbol, security.percentInvestment, ticket));
#endif
security.purchased = true;
securitiesToPurchase -= 1;
}
}
// When !Resolution.Tick such as Resolution.Minute data.Bars
// passed in the Slice
foreach (var kvp in data.Bars)
{
Symbol symbol = kvp.Key;
TradeBar bar = kvp.Value;
barCount += 1;
if (displayBarCount > 0)
{
displayBarCount -= 1;
Debug(string.Format("OnData-Slice: {0} time={1} open={2} high={3} low={4} close={5} volume={6} Value={7}",
bar.Symbol, bar.Time, bar.Open, bar.High, bar.Low, bar.Close, bar.Volume, bar.Value));
}
}
// Resolution.Tick the data will procided in data.Ticks
foreach (var kvp in data.Ticks)
{ // Only occurs if Resolution.Tick
tickCount += 1;
if (displayTicks > 0)
{
Debug("OnData-Slice: ticks count=" + data.Ticks.Count);
displayTicks -= 1;
int innerDisplay = 5;
Symbol symbol = kvp.Key;
List<Tick> ticks = kvp.Value;
foreach (var tick in ticks)
{
if (innerDisplay > 0) {
innerDisplay -= 1;
Debug(string.Format("OnData-Slice: symbol={0} s={1} lp={2} q={3} bp={4} ap={5} t={6}", symbol, tick.Symbol,
tick.LastPrice, tick.Quantity, tick.BidPrice, tick.AskPrice, tick.Time));
} else {
break;
}
}
}
}
}
public void OnData(Dividends data) // update this to Dividends dictionary
{
foreach(var key in data.Keys)
{
#if false
var dividend = data[key];
Debug(string.Format("OnData-Dividends: {0} {1} - {2} - {3} - {4}",
dividend.Symbol, dividend.Time.ToString("o"), dividend.Distribution.ToString("C"),
Portfolio.Cash, Portfolio[key].Price.ToString("C")));
#endif
}
}
public void OnData(Splits data)
{
foreach(var key in data.Keys)
{
var split = data[key];
Debug(string.Format("OnData-Splits: {0} {1} - {2} - {3} - {4} - {5}",
split.Symbol, split.Time.ToString("o"), split.SplitFactor, Portfolio.Cash,
Portfolio[key].Quantity, Portfolio[key].Price.ToString("C")));
}
}
public override void OnEndOfAlgorithm()
{
Debug(string.Format("OnEndOfAlgorithm: sliceCount={0} tickCount={1} barCount={2}",
sliceCount, tickCount, barCount));
}
}
}