Overall Statistics |
Total Trades 549 Average Win 5.83% Average Loss -9.71% Compounding Annual Return 5.987% Drawdown 89.900% Expectancy 0.075 Net Profit 13.621% Sharpe Ratio 0.691 Loss Rate 33% Win Rate 67% Profit-Loss Ratio 0.60 Alpha 1.053 Beta -0.265 Annual Standard Deviation 1.499 Annual Variance 2.247 Information Ratio 0.646 Tracking Error 1.506 Treynor Ratio -3.913 Total Fees $0.00 |
namespace QuantConnect { public class BasicTemplateAlgorithm : QCAlgorithm { //public string pair1 = "EURAUD"; //2015 200window public string pair1 = "NZDJPY"; RollingWindow<double> window; RollingWindow<double> diffWindow; const int WL = 50; bool IsLong = false; BollingerBands bb; List<OrderTicket> pendingOrders; public override void Initialize() { SetStartDate(2015,01,01); SetEndDate(2016, 12, 30); //SetBrokerageModel(BrokerageName.FxcmBrokerage); SetBrokerageModel(BrokerageName.OandaBrokerage); SetCash(10000); var res = Resolution.Hour; AddForex(pair1, res, Market.Oanda); //AddForex(pair1, res, Market.FXCM); bb = BB(pair1, WL, 1.0M, MovingAverageType.Simple, res); window = new RollingWindow<double>(WL); diffWindow = new RollingWindow<double>(WL); pendingOrders = new List<OrderTicket>(); SetWarmup(WL); } private double getAverage(RollingWindow<double> window){ var doubleList = new List<double>(); for (int i = 0; i < WL; i++) doubleList.Add(window[i]); return doubleList.Average(); } private double getStandardDeviation(RollingWindow<double> window) { var doubleList = new List<double>(); for (int i = 0; i < WL; i++) doubleList.Add(window[i]); double average = doubleList.Average(); double sumOfDerivation = 0; foreach (double value in doubleList) { sumOfDerivation += (value) * (value); } double sumOfDerivationAverage = sumOfDerivation / (doubleList.Count - 1); return Math.Sqrt(sumOfDerivationAverage - (average*average)); } public void OnData(TradeBars data) { window.Add((double)(decimal)data[pair1].Close); if(!window.IsReady) return; if(!bb.IsReady) return; var sm = getAverage(window); var diff = (double)(data[pair1].Close) - sm; diffWindow.Add(diff); if(!diffWindow.IsReady) return; if (IsWarmingUp) return; var std = getStandardDeviation(diffWindow); Log("diff: " + diff.ToString()); Log("std: " + std.ToString()); var close = (double)data[pair1].Close; if(!Portfolio.Invested){ if(close < bb.LowerBand){ SetHoldings(pair1, 10); IsLong = true; } else if (close > bb.UpperBand ){ SetHoldings(pair1, -10); IsLong = false; } } else{ // Average criss cross if(IsLong && close > sm + 0.5* std) Liquidate(); else if (!IsLong && close < sm - 0.5*std) Liquidate(); } } } }