| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 43.759% Drawdown 2.300% Expectancy 0 Net Profit 0% Sharpe Ratio 2.131 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.265 Beta 0.249 Annual Standard Deviation 0.142 Annual Variance 0.02 Information Ratio 1.045 Tracking Error 0.148 Treynor Ratio 1.211 |
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect {
public partial class QCUDataFiltering : QCAlgorithm
{
//Create new bars from ticks list:
private Consolidator _barCreator = new Consolidator();
public override void Initialize()
{
SetCash(25000);
SetStartDate(2014, 6, 1);
SetEndDate(2014, 6, 15);
AddSecurity(SecurityType.Equity, "SPY", Resolution.Tick);
//Add our custom data filter.
Securities["SPY"].DataFilter = new ExchangeDataFilter();
}
//TradeBars event handler:
public void OnData (TradeBars data)
{
if (!data.ContainsKey("SPY")) return;
// Here:: >> data["SPY"] is a 1 second, filtered tradeBar.
var spy = data["SPY"];
//Log(spy.Time.ToShortTimeString() + "," + spy.Open.ToString("C") + "," + spy.High.ToString("C") + "," + spy.Low.ToString("C") + "," + spy.Close.ToString("C"));
}
// Data arriving here will now be filtered.
public void OnData( Ticks data )
{
//Generate the bars:
_barCreator.SetTicks(data);
var bars = _barCreator.GenerateBars();
//Fire the tradebars event handler during market hours
if (bars["SPY"].Time.TimeOfDay.TotalHours > 9.5 && bars["SPY"].Time.TimeOfDay.TotalHours < 16) {
OnData(bars);
}
//foreach (var tick in data["SPY"]) Log(tick.Exchange);
if (!Portfolio.Invested) SetHoldings("SPY", 1);
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect {
public class ExchangeDataFilter : ISecurityDataFilter
{
/// <summary>
/// Global Market Short Codes and their full versions: (used in tick objects)
/// https://github.com/QuantConnect/QCAlgorithm/blob/master/QuantConnect.Common/Global.cs
/// </summary>
public static class MarketCodesFilter
{
/// US Market Codes
public static Dictionary<string, string> US = new Dictionary<string, string>()
{
{"A", "American Stock Exchange"},
{"B", "Boston Stock Exchange"},
{"C", "National Stock Exchange"},
{"D", "FINRA ADF"},
{"I", "International Securities Exchange"},
{"J", "Direct Edge A"},
{"K", "Direct Edge X"},
{"M", "Chicago Stock Exchange"},
{"N", "New York Stock Exchange"},
{"P", "Nyse Arca Exchange"},
{"Q", "NASDAQ OMX"},
{"T", "NASDAQ OMX"},
{"U", "OTC Bulletin Board"},
{"u", "Over-the-Counter trade in Non-NASDAQ issue"},
{"W", "Chicago Board Options Exchange"},
{"X", "Philadelphia Stock Exchange"},
{"Y", "BATS Y-Exchange, Inc"},
{"Z", "BATS Exchange, Inc"}
};
/// Canada Market Short Codes:
public static Dictionary<string, string> Canada = new Dictionary<string, string>()
{
{"T", "Toronto"},
{"V", "Venture"}
};
// Allowed exchanges for this filter: top 4
public static List<string> AllowedExchanges = new List<string>() {
"P", //NYSE ARCA - SPY PRIMARY EXCHANGE
//https://www.google.com/finance?q=NYSEARCA%3ASPY&ei=XcA2VKCSLs228waMhYCIBg
/*
"N", //NYSE
"Z", //BATS
"Q", //NASDAQ
"T"*/ //NASDAQ
};
}
/// <summary>
/// Filter out a tick from this vehicle, with this new data:
/// </summary>
/// <param name="data">New data packet:</param>
/// <param name="vehicle">Vehicle of this filter.</param>
public bool Filter(Security asset, BaseData data)
{
// TRUE --> Accept Tick
// FALSE --> Reject Tick
var tick = data as Tick;
// This is a tick bar
if (tick != null)
{
if (MarketCodesFilter.AllowedExchanges.Contains(tick.Exchange))
{
return true;
}
}
//Only allow those exchanges through.
return false;
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect {
public class Consolidator {
private Ticks tickList;
//Initialize the Consolidator
public Consolidator() {
// Queue to store the ticks temporarily.
this.tickList = new Ticks(new DateTime());
}
// Add a bar to the list, when it totals X bars return a new tradebar.
public void SetTicks(Ticks tickList) {
this.tickList = tickList;
}
//Using the barQueue generate a new "consolidated bar" then return
// https://github.com/QuantConnect/QCAlgorithm/blob/master/QuantConnect.Common/Data/Market/TradeBars.cs
// https://github.com/QuantConnect/QCAlgorithm/blob/master/QuantConnect.Common/Data/Market/Ticks.cs
public TradeBars GenerateBars() {
//Return array of tradebars:
TradeBars bars = new TradeBars();
//Create the new bar for each symbol:
foreach (string tickSymbol in tickList.Keys)
{
string symbol = "";
long volume = 0;
DateTime barOpenTime = new DateTime();
decimal open = Decimal.Zero, high = Decimal.MinValue, low = Decimal.MaxValue, close = Decimal.Zero;
foreach(Tick tick in tickList[tickSymbol])
{
if (barOpenTime == new DateTime()) barOpenTime = tick.Time;
if (symbol == "") symbol = tick.Symbol;
if (open == Decimal.Zero) open = tick.Price;
if (high < tick.Price) high = tick.Price;
if (low > tick.Price) low = tick.Price;
close = tick.Price;
volume += tick.Quantity;
}
if (!bars.ContainsKey(tickSymbol)) {
bars.Add(tickSymbol, new TradeBar(barOpenTime, symbol, open, high, low, close, volume));
}
}
//Create the new trade bar.
return bars;
}
}
}