| Overall Statistics |
|
Total Trades 683 Average Win 0.10% Average Loss -0.13% Annual Return 17.191% Drawdown 0.400% Expectancy 0.674 Net Profit 78.497% Sharpe Ratio 4.297 Loss Rate 6% Win Rate 94% Profit-Loss Ratio 0.78 Alpha 0.129 Beta -0.008 Annual Standard Deviation 0.03 Annual Variance 0.001 Information Ratio -0.19 Tracking Error 0.166 Treynor Ratio -16.922 |
using System;
using System.Collections;
using System.Collections.Generic;
using QuantConnect.Securities;
using QuantConnect.Models;
namespace QuantConnect {
public class SymbolData
{
private Hawkes i = new Hawkes(1, 1.2, 1.8);
private Hawkes b = new Hawkes(1, 1.2, 1.8);
private Hawkes s = new Hawkes(1, 1.2, 1.8);
public double LastTradePrice { get; set; }
public DateTime LastTradeTime { get; set; }
public Hawkes Intensity { get { return i; } }
public Hawkes BuyIntensity { get { return b; } }
public Hawkes SellIntensity { get { return s; } }
public double TickSize { get; set; }
public double PrevPrice { get; set; }
public bool upTick { get; set; }
public bool downTick { get; set; }
public DateTime LastTick { get; set; }
public int Qty { get; set; }
}
}using System;
using System.Collections;
using System.Collections.Generic;
namespace QuantConnect
{
using QuantConnect.Securities;
using QuantConnect.Models;
public partial class BasicTemplateAlgorithm : QCAlgorithm, IAlgorithm
{
string SPY = "SPY";
Dictionary<string, SymbolData> symbols = new Dictionary<string, SymbolData>();
//int sizeToTake = 5;
//Initialize the data and resolution you require for your strategy:
public override void Initialize()
{
//Initialize the start, end dates for simulation; cash and data required.
SetStartDate(new DateTime(2010,01,01));
SetEndDate(new DateTime(2014, 07,25));
SetCash(25000); //Starting Cash in USD.
symbols.Add(SPY, new SymbolData());
symbols[SPY].TickSize = 0.01;
AddSecurity(SecurityType.Equity, SPY, Resolution.Second); //Minute, Second or Tick
Securities[SPY].Model = new CustomTransactionModel();
}
//Handle TradeBar Events: a TradeBar occurs on a time-interval (second or minute bars)
public override void OnTradeBar(Dictionary<string, TradeBar> data)
{
foreach(var symbol in symbols.Keys)
{
if (data.ContainsKey(symbol))
{
Process(symbol, symbols[symbol], data[symbol]);
}
}
}
//Handle Tick Events - Only when you're requesting tick data
public override void OnTick(Dictionary<string, List<Tick>> ticks)
{
foreach(var symbol in symbols.Keys)
{
if (ticks.ContainsKey(symbol) && ticks[symbol].Count > 0)
{
//Process(symbol, symbols[symbol], ticks[symbol][ticks[symbol].Count - 1]);
}
}
}
public void Process(string symbol, SymbolData d, TradeBar t)
{
double mid = (double)t.Close;//(t.Price);
if (d.PrevPrice == 0)
{
d.PrevPrice = mid;
d.LastTick = t.Time;
return;
}
if (t.Time.Date != d.LastTick.Date)
{
d.PrevPrice = mid;
d.LastTick = t.Time;
return;
}
//if (t.AskPrice - t.BidPrice > (decimal)(3 * d.TickSize)) return;
double pips = Math.Abs(d.PrevPrice - mid)/d.TickSize;
if (pips > 100) return;
double buyintensity = 0;
double sellintensity = 0;
if (d.PrevPrice > mid)
{
buyintensity = d.BuyIntensity.Process(0, true);
sellintensity = d.SellIntensity.Process(pips, !d.downTick);
}
else if (mid > d.PrevPrice)
{
buyintensity = d.BuyIntensity.Process(pips, !d.upTick);
sellintensity = d.SellIntensity.Process(0, true);
}
else
{
buyintensity = d.BuyIntensity.Process(0, true);
sellintensity = d.SellIntensity.Process(0, true);
}
if (Portfolio[symbol].HoldStock)
{
if ((t.Time - d.LastTradeTime).TotalSeconds > 60)
{
d.LastTradePrice = 0;
Liquidate(symbol);
}
}
{
if (buyintensity > 10 && buyintensity > sellintensity && !Portfolio[symbol].HoldStock)
{
Order(symbol, -100);
d.Qty = 1;
d.LastTradePrice = mid;
d.LastTradeTime = t.Time;
//Debug(t.Time.ToString("yyyyMMdd HH:mm:ss.fff"));
}
else if (sellintensity > 10 && sellintensity > buyintensity && !Portfolio[symbol].HoldStock)
{
Order(symbol, 100);
d.Qty = -1;
d.LastTradePrice = mid;
d.LastTradeTime = t.Time;
//Debug(t.Time.ToString("yyyyMMdd HH:mm:ss.fff"));
}
}
d.upTick = mid > d.PrevPrice;
d.downTick = d.PrevPrice > mid;
d.PrevPrice = mid;
d.LastTick = t.Time;
}
}
}// QuantConnect Simulator C# File, Created on 3-6-2014 by Satyapravin Bezwada
using System;
using System.Collections;
using System.Collections.Generic;
namespace QuantConnect {
public class Hawkes
{
double mu_ = 0, alpha_ = 0, beta_ = 0, bfactor_ = 0;
public Hawkes(double mu, double alpha, double beta)
{
mu_ = mu;
alpha_ = alpha;
beta_ = beta;
}
public double Process( double count, bool decay)
{
double exp = Math.Exp(-beta_);
if (decay) bfactor_ *= exp;
bfactor_ += exp * count;
return mu_ + alpha_ * bfactor_;
}
}
}/*
* QUANTCONNECT.COM - Equity Transaction Model
* Default Equities Transaction Model
*/
/**********************************************************
* USING NAMESPACES
**********************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace QuantConnect.Securities {
/********************************************************
* QUANTCONNECT PROJECT LIBRARIES
*********************************************************/
using QuantConnect.Models;
/********************************************************
* CLASS DEFINITIONS
*********************************************************/
/// <summary>
/// Default Transaction Model for Equity Security Orders
/// </summary>
public class CustomTransactionModel : SecurityTransactionModel {
/********************************************************
* CLASS PRIVATE VARIABLES
*********************************************************/
/********************************************************
* CLASS PUBLIC VARIABLES
*********************************************************/
/********************************************************
* CLASS CONSTRUCTOR
*********************************************************/
/// <summary>
/// Initialise the Algorithm Transaction Class
/// </summary>
public CustomTransactionModel() {
}
/********************************************************
* CLASS PROPERTIES
*********************************************************/
/// <summary>
/// Get the Slippage approximation for this order:
/// </summary>
public override decimal GetSlippageApproximation(Security security, Order order) {
return 0.15m;
}
} // End Algorithm Transaction Filling Classes
} // End QC Namespace