| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace QuantConnect.Indicators
{
public class ExponentialMovingAverageDeriv : Indicator
{
private readonly decimal _k;
private readonly int _period;
private List<decimal> EMA_list;
public ExponentialMovingAverageDeriv(string name, int period)
: base(name)
{
_period = period;
_k = 2 / ((decimal)period + 1);
EMA_list = new List<decimal>();
}
public ExponentialMovingAverageDeriv(string name, int period, decimal smoothingFactor)
: base(name)
{
_period = period;
_k = smoothingFactor;
}
public ExponentialMovingAverageDeriv(int period)
: this("EMA" + period, period)
{
}
public ExponentialMovingAverageDeriv(int period, decimal smoothingFactor)
: this("EMA" + period, period, smoothingFactor)
{
}
public decimal ReturnChangeInEMA(int period) {
if (EMA_list.Count > period) {
return EMA_list[EMA_list.Count-1] - EMA_list[EMA_list.Count-1-period];
} else {
return 0;
}
}
public override bool IsReady
{
get { return Samples > _period; }
}
protected override decimal ComputeNextValue(IndicatorDataPoint input)
{
// our first data point just return identity
if (Samples == 1)
{
return input;
}
// Add to list
EMA_list.Add(input*_k + Current*(1 - _k));
return input*_k + Current*(1 - _k);
}
}
}namespace QuantConnect
{
/*
* Some tools
*/
public class Aggressive_HFT_Algo : QCAlgorithm
{
//Initialize the data and resolution
public override void Initialize()
{
// set up our analysis span
SetStartDate(2009, 01, 01);
SetEndDate(2009, 02, 01);
SetCash(100000);
// request SPY data with minute resolution
AddSecurity(SecurityType.Equity, "F", Resolution.Minute);
}
public void OnData(TradeBars data)
{
//
}
}
}namespace QuantConnect {
public class ExchangeDataFilter : ISecurityDataFilter
{
private IAlgorithm _algo;
//Save instance of algorithm namespace
public ExchangeDataFilter(IAlgorithm algo)
{
_algo = algo;
}
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> BannedExchanges = new List<string>() {
"W",
"u",
"U",
"D"
};
}
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.BannedExchanges.Contains(tick.Exchange) &&
!tick.Suspicious == true &&
!tick.SaleCondition.Equals("W"))
{
return true;
}
}
//Only allow those exchanges through.
return false;
}
}
}namespace QuantConnect {
public class RangeBars
{
private decimal TICK_SIZE = (decimal) 0.01;
private int barRange;
private List<RangeBar> BARS;
// Current last bar
private RangeBar lastBar;
public RangeBars(int barRange) {
this.barRange = barRange;
BARS = new List<RangeBar>();
}
public void AddTick(Tick tick) {
// Round to cents
decimal price = Math.Round(tick.Price, 2);
// For debugging purposes:
//Console.WriteLine("Price: "+price);
if (lastBar == null) {
// If this is the first bar of the series, create new last bar
lastBar = new RangeBar(tick.Time, TICK_SIZE, price, barRange);
} else {
// Logic for the creation and completion of range bars
decimal d_change = (decimal) (price - lastBar.startPrice) / (decimal) TICK_SIZE;
int change = 0;
if ((d_change % 1) == 0) {
change = (int) Math.Ceiling((price - lastBar.startPrice) / (decimal) TICK_SIZE);
} else {
Console.WriteLine("The TICK_SIZE is apparently wrong: "+d_change);
}
// If outside of possible bounds
if (change > lastBar.possDiffUp) {
lastBar.highDiff = lastBar.possDiffUp;
lastBar.CloseBar(lastBar.possDiffUp);
BARS.Add(lastBar);
BarClosedSender(lastBar); // Send to main thread
decimal nPrice = lastBar.startPrice + ((decimal)(lastBar.possDiffUp)+1)*TICK_SIZE;
lastBar = new RangeBar(tick.Time, TICK_SIZE, nPrice, barRange);
} else if (change < lastBar.possDiffDown) {
lastBar.lowDiff = lastBar.possDiffDown;
lastBar.CloseBar(lastBar.possDiffDown);
BARS.Add(lastBar);
BarClosedSender(lastBar); // Send to main thread
decimal nPrice = lastBar.startPrice + ((decimal)(lastBar.possDiffDown)-1)*TICK_SIZE;
lastBar = new RangeBar(tick.Time, TICK_SIZE, nPrice, barRange);
} else {
// Update current bar
if (change > lastBar.highDiff) {
lastBar.possDiffDown = lastBar.possDiffDown + (change - lastBar.highDiff);
lastBar.highDiff = change;
} else if (change < lastBar.lowDiff) {
lastBar.possDiffUp = lastBar.possDiffUp - (lastBar.lowDiff - change);
lastBar.lowDiff = change;
}
}
}
// Add current tick to last bar
lastBar.AddTick(tick);
}
public void BarClosedSender(RangeBar bar) {
// Notify function in Main.cs that a new RangeBar has been closed
// FUNCTION BELOW DOESN'T WORK ANYMORE (because RENKO is being used)
//parentShadow.TRIGGER_CHART_UPDATER(this, bar);
}
public void CleanMemory() {
if (BARS.Count > 50) {
int diff = BARS.Count - 50;
BARS.RemoveRange(0, diff);
}
}
}
}namespace QuantConnect {
public class RenkoBars
{
private decimal TICK_SIZE = (decimal) 0.01;
public int BRICK_SIZE;
public List<RenkoBar> BARS;
public RenkoBar CurrentBar;
public decimal FirstValue;
public RenkoBars(int BRICK_SIZE) {
this.BRICK_SIZE = BRICK_SIZE;
BARS = new List<RenkoBar>();
}
public void AddTick(Tick tick) {
if (CurrentBar != null) {
// Determine last bounds
decimal HIGH = 0;
decimal LOW = 0;
RenkoBar LastBar;
if (BARS.Count > 0) {
LastBar = BARS[BARS.Count - 1];
HIGH = LastBar.O > LastBar.C ? LastBar.O : LastBar.C;
LOW = LastBar.O < LastBar.C ? LastBar.O : LastBar.C;
} else {
HIGH = FirstValue;
LOW = FirstValue;
}
if (tick.Price > HIGH) {
int u_change = (int) Math.Ceiling((tick.Price - HIGH) / TICK_SIZE);
if (u_change > BRICK_SIZE) {
// If null bar
int nofNULL = (int) Math.Floor(((decimal)u_change) / ((decimal)BRICK_SIZE));
for (int i = 0; i < nofNULL; i++) {
CurrentBar.O = HIGH;
CurrentBar.C = HIGH + ((decimal)BRICK_SIZE) * TICK_SIZE;
CurrentBar.L = CurrentBar.O < CurrentBar.L ? CurrentBar.O : CurrentBar.L;
CurrentBar.H = CurrentBar.C > CurrentBar.H ? CurrentBar.C : CurrentBar.H;
if (i < nofNULL - 1) {
// Not tradable!
CurrentBar.Tradable = false;
} else {
CurrentBar.Tradable = true;
}
BARS.Add(CurrentBar);
BarClosedSender(CurrentBar);
CurrentBar = new RenkoBar(BRICK_SIZE, tick.Time, CurrentBar.C);
LastBar = BARS[BARS.Count - 1];
HIGH = LastBar.O > LastBar.C ? LastBar.O : LastBar.C;
LOW = LastBar.O < LastBar.C ? LastBar.O : LastBar.C;
}
// Add tick to current bar
CurrentBar.AddTick(tick);
} else {
CurrentBar.H = tick.Price > CurrentBar.H ? tick.Price : CurrentBar.H;
CurrentBar.AddTick(tick);
}
} else if (tick.Price < LOW) {
int d_change = (int) Math.Ceiling((LOW - tick.Price) / TICK_SIZE);
if (d_change > BRICK_SIZE) {
int nofNULL = (int) Math.Floor(((decimal)d_change) / ((decimal)BRICK_SIZE));
for (int i = 0; i < nofNULL; i++) {
// Close bar and make new bar
CurrentBar.O = LOW;
CurrentBar.C = LOW - ((decimal)BRICK_SIZE) * TICK_SIZE;
CurrentBar.L = CurrentBar.C < CurrentBar.L ? CurrentBar.C : CurrentBar.L;
CurrentBar.H = CurrentBar.O > CurrentBar.H ? CurrentBar.O : CurrentBar.H;
if (i < nofNULL - 1) {
// Not tradable!
CurrentBar.Tradable = false;
} else {
CurrentBar.Tradable = true;
}
BARS.Add(CurrentBar);
BarClosedSender(CurrentBar);
CurrentBar = new RenkoBar(BRICK_SIZE, tick.Time, CurrentBar.C);
LastBar = BARS[BARS.Count - 1];
HIGH = LastBar.O > LastBar.C ? LastBar.O : LastBar.C;
LOW = LastBar.O < LastBar.C ? LastBar.O : LastBar.C;
}
CurrentBar.AddTick(tick);
} else {
CurrentBar.L = tick.Price < CurrentBar.L ? tick.Price : CurrentBar.L;
CurrentBar.AddTick(tick);
}
}
} else {
// If first bar
CurrentBar = new RenkoBar(BRICK_SIZE, tick.Time, tick.Price);
CurrentBar.AddTick(tick);
FirstValue = tick.Price;
}
}
public void BarClosedSender(RenkoBar bar) {
// Notify function in Main.cs that a new RangeBar has been closed
// ...
}
public void CleanMemory() {
if (BARS.Count > 50) {
int diff = BARS.Count - 50;
BARS.RemoveRange(0, diff);
}
}
}
}namespace QuantConnect {
public class RenkoBar
{
private int BRICK_SIZE;
private List<Tick> TicksInBar;
public bool Tradable;
public DateTime Time;
public decimal O;
public decimal H;
public decimal L;
public decimal C;
public RenkoBar(int BRICK_SIZE, DateTime Time, decimal O) {
this.BRICK_SIZE = BRICK_SIZE;
this.Time = Time;
TicksInBar = new List<Tick>();
this.O = O;
this.H = O;
this.L = O;
this.C = O;
}
public void AddTick(Tick tick) {
TicksInBar.Add(tick);
}
public bool IsTradable() {
return this.Tradable;
}
}
}namespace QuantConnect {
public class RangeBar
{
private decimal TICK_SIZE;
public DateTime Time;
public decimal startPrice;
public int possDiffUp;
public int possDiffDown;
public int highDiff;
public int lowDiff;
public int endDiff;
public int direction;
private List<Tick> ticksInBar;
public decimal O;
public decimal H;
public decimal L;
public decimal C;
public RangeBar(DateTime Time, decimal TICK_SIZE, decimal startPrice, int range) {
this.Time = Time;
this.TICK_SIZE = TICK_SIZE;
this.startPrice = startPrice;
this.possDiffUp = range;
this.possDiffDown = -1*range;
this.highDiff = 0;
this.lowDiff = 0;
this.ticksInBar = new List<Tick>();
}
public void AddTick(Tick tick) {
ticksInBar.Add(tick);
}
public void CloseBar(int endDiff) {
this.endDiff = endDiff;
//Console.WriteLine(ticksInBar.Count);
this.O = startPrice;
this.H = startPrice + this.highDiff*TICK_SIZE;
this.L = startPrice + this.lowDiff*TICK_SIZE;
this.C = startPrice + endDiff*TICK_SIZE;
if (this.O < this.C) {
this.direction = 1;
} else if (this.C < this.O) {
this.direction = -1;
} else {
this.direction = 0;
}
}
}
}namespace QuantConnect {
public class NormalBar
{
public DateTime Time;
public decimal O;
public decimal H;
public decimal L;
public decimal C;
public NormalBar(DateTime T, decimal O, decimal H, decimal L, decimal C) {
this.Time = T;
this.O = O;
this.H = H;
this.L = L;
this.C = C;
}
}
}namespace QuantConnect {
public class HeikinAshiBars
{
private List<NormalBar> HA;
public HeikinAshiBars() {
HA = new List<NormalBar>();
}
public void ProcessNewBar(NormalBar bar) {
if (HA.Count > 0) {
// If not first bar
NormalBar lastBar = HA[HA.Count - 1];
decimal close = (bar.O + bar.H + bar.L + bar.C)/4;
decimal open = (lastBar.O + lastBar.C)/2;
decimal high = (new[] {bar.H, open, close}).Max();
decimal low = (new[] {bar.L, open, close}).Min();
NormalBar temp = new NormalBar(bar.Time, open, high, low, close);
HA.Add(temp);
} else {
// If first bar
decimal close = (bar.O + bar.H + bar.L + bar.C)/4;
decimal open = (bar.O);
decimal high = (new[] {bar.H, open, close}).Max();
decimal low = (new[] {bar.L, open, close}).Min();
NormalBar temp = new NormalBar(bar.Time, open, high, low, close);
HA.Add(temp);
}
}
public int GetLastColor() {
NormalBar lastBar = HA[HA.Count - 1];
if (lastBar.C > lastBar.O) {
return 1;
} else if (lastBar.C < lastBar.O) {
return -1;
} else {
return 0;
}
}
public int IsFirstColor() {
if (HA.Count == 1) {
NormalBar lastBar = HA[HA.Count - 1];
int lastColour = lastBar.C > lastBar.O ? 1 : -1;
return lastColour;
} else {
NormalBar secondLastBar = HA[HA.Count - 2];
NormalBar lastBar = HA[HA.Count - 1];
int secondLastColour = secondLastBar.C > secondLastBar.O ? 1 : -1;
int lastColour = lastBar.C > lastBar.O ? 1 : -1;
if (lastColour == 1 && lastColour != secondLastColour) {
return 1;
} else if (lastColour == -1 && lastColour != secondLastColour) {
return -1;
} else {
return 0;
}
}
}
public NormalBar GetLastBar() {
return HA[HA.Count - 1];
}
public void CleanMemory() {
if (HA.Count > 50) {
int diff = HA.Count - 50;
HA.RemoveRange(0, diff);
}
}
}
}