Overall Statistics |
Total Trades 37 Average Win 0.03% Average Loss -0.02% Annual Return 5.162% Drawdown 0.100% Expectancy 0.772 Net Profit 0.594% Sharpe Ratio 4.6 Loss Rate 32% Win Rate 68% Profit-Loss Ratio 1.62 Trade Frequency Daily trades |
using System; using System.Collections; using System.Collections.Generic; namespace QuantConnect { using QuantConnect.Securities; using QuantConnect.Models; public partial class BasicTemplateAlgorithm : QCAlgorithm, IAlgorithm { string symbol = "EURUSD"; //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(2013,05,01)); SetEndDate(new DateTime(2013, 05, 30)); SetCash(20000); //Starting Cash in USD. AddSecurity(SecurityType.Forex, symbol, Resolution.Tick); //Minute, Second or Tick Securities[symbol].Model = new ForexTransactionModel(); // Forex transaction model SetRunMode(RunMode.Parallel); //Series or Parallel for intraday strategies. } //Handle TradeBar Events: a TradeBar occurs on a time-interval (second or minute bars) public override void OnTradeBar(Dictionary<string, TradeBar> data) { } Hawkes buybuy = new Hawkes(0.5, 1.2, 1.8 );//(0.005, 0.028949, 0.050889); Hawkes sellbuy = new Hawkes(0.5, 1.2, 1.8); Hawkes sellsell = new Hawkes(0.5, 1.2, 1.8); Hawkes buysell = new Hawkes(0.5, 1.2, 1.8); Tick prevTick = null; int prevsign = -1; int buys = 0; int sells = 0; static Tick lastTick = null; //private int prevSign = 0; //Handle Tick Events - Only when you're requesting tick data public override void OnTick(Dictionary<string, List<Tick>> ticks) { if (!ticks.ContainsKey(symbol) || ticks.Values.Count == 0) { Log("Invalid Tick"); return; } Tick t = ticks[symbol][ticks.Values.Count -1]; { if (prevTick == null) { prevTick = t; buybuy.Process(0, prevTick.Time); buysell.Process(0, prevTick.Time); sellbuy.Process(0, prevTick.Time); sellsell.Process(0, prevTick.Time); } else { decimal bdiff = t.BidPrice - prevTick.BidPrice; decimal adiff = t.AskPrice - prevTick.AskPrice; if (Math.Sign(bdiff) != Math.Sign(adiff)) return; decimal pdiff = bdiff + adiff; pdiff *= 0.5m; double buy = 0; double sell = 0; double bb, sb, ss, bs; double count = (double)Math.Abs(pdiff / 0.00001m); if (pdiff > 0 && prevsign == -1) { bb = buybuy.Process(0, t.Time); sb = sellbuy.Process(count, t.Time); ss = sellsell.Process(0, t.Time); bs = buysell.Process(0, t.Time); buy = bb + sb; sell = ss + bs; prevsign = 1; prevTick = t; buys = 0; sells = 0; } else if (pdiff > 0 && prevsign == 1) { ++buys; sells = 0; count = count * 2; bb = buybuy.Process(count, t.Time); sb = sellbuy.Process(0, t.Time); ss = sellsell.Process(0, t.Time); bs = buysell.Process(0, t.Time); buy = bb + sb; sell = ss + bs; prevsign = 1; prevTick = t; } else if (pdiff < -0 && prevsign == 1) { bb = buybuy.Process(0, t.Time); sb = sellbuy.Process(0, t.Time); ss = sellsell.Process(0, t.Time); bs = buysell.Process(count, t.Time); buy = bb + sb; sell = ss + bs; prevsign = -1; prevTick = t; buys = 0; sells = 0; } else if (pdiff < -0 && prevsign == -1) { buys = 0; ++sells; count = count * 2; bb = buybuy.Process(0, t.Time); sb = sellbuy.Process(0, t.Time); ss = sellsell.Process(count, t.Time); bs = buysell.Process(0, t.Time); buy = bb + sb; sell = ss + bs; prevsign = -1; prevTick = t; } if (Securities[symbol].Holdings.Quantity > 0 && ( sell / buy > 3 || (t.Time - lastTick.Time).TotalSeconds > 240)) { Liquidate(symbol); } if (Securities[symbol].Holdings.Quantity < 0 && (buy / sell > 3 || (t.Time - lastTick.Time).TotalSeconds > 240)) { Liquidate(symbol); } if (Securities[symbol].Holdings.Quantity <= 0 && prevTick == t && buy / sell > 60) { if (Securities[symbol].Holdings.Quantity < 0) Liquidate(symbol); Order(symbol, 10000); lastTick = t; } if (Securities[symbol].Holdings.Quantity >= 0 && prevTick == t && sell / buy > 60) { if (Securities[symbol].Holdings.Quantity > 0) Liquidate(symbol); Order(symbol, -10000); lastTick = t; } } } } } }
// 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; DateTime prevTime; bool first = true; public Hawkes(double mu, double alpha, double beta) { mu_ = mu; alpha_ = alpha; beta_ = beta; } public double Process( double count, DateTime dt) { if (first) { first = false; prevTime = dt; return mu_; } double seconds = (dt - prevTime).TotalSeconds; double exp = Math.Exp(-beta_ * seconds); bfactor_ *= exp; bfactor_ += exp * count; prevTime = dt; return mu_ + alpha_ * bfactor_; } } }