Overall Statistics |
Total Trades 239 Average Win 1.16% Average Loss -0.7% Compounding Annual Return -69.666% Drawdown 31.300% Expectancy -0.168 Net Profit -26.034% Sharpe Ratio -2.497 Loss Rate 69% Win Rate 31% Profit-Loss Ratio 1.65 Alpha -0.857 Beta 0.806 Annual Standard Deviation 0.424 Annual Variance 0.18 Information Ratio -2.463 Tracking Error 0.328 Treynor Ratio -1.314 |
using System; using QuantConnect.Data.Market; using QuantConnect.Indicators; using QuantConnect.Algorithm; using System.Collections.Generic; namespace QuantConnect { /// <summary> /// Demonstration of QuantConnect Intraday Charting on an Overlay Chart. Based on "QCU Custom Charting Example". /// </summary> public class IntradayChartExample : QCAlgorithm { // Intraday Chart bool idTradedToday = false; string idTriggerChart = "firstTrade"; // Show the first day the algo traded. DateTime? idChartTradeDate = null; Resolution idChartResolution = Resolution.Minute; string idChartSymbol = "IBM"; // "EURUSD" SecurityType idChartSymbolType = SecurityType.Equity; // SecurityType.Forex // Indicators ExponentialMovingAverage emaShort; ExponentialMovingAverage emaLong; // Trading decimal tolerance = 0.00015m; //0.02% safety margin in prices to avoid bouncing. public override void Initialize() { SetStartDate(2011, 7, 20); SetEndDate(2011, 10, 20); AddSecurity(idChartSymbolType, idChartSymbol, resolution: idChartResolution); // Intraday Charting Chart intradayChart = new Chart(idChartSymbol + " 1d", ChartType.Overlay); intradayChart.AddSeries(new Series(idChartSymbol, SeriesType.Line)); // FAIL: Only 1 SeriesType.Candle is drawn even though we plot every minute. intradayChart.AddSeries(new Series("Buy", SeriesType.Scatter)); intradayChart.AddSeries(new Series("Sell", SeriesType.Scatter)); // Poor Man's Candlesticks. Disable price/close Line when using. // intradayChart.AddSeries(new Series("High", SeriesType.Line)); // intradayChart.AddSeries(new Series("Low", SeriesType.Line)); AddChart(intradayChart); // Indicators emaShort = EMA(idChartSymbol, 15, idChartResolution); emaLong = EMA(idChartSymbol, 50, idChartResolution); } public void OnData(TradeBars data) { try { if (Securities[idChartSymbol].Exchange.ExchangeOpen == false) return; // Wait for equities market to open to trade if (!emaShort.IsReady || !emaLong.IsReady) return; // Trading var holding = Portfolio[idChartSymbol]; if (holding.Quantity <= 0 && Math.Round(emaShort * (1.0m - tolerance),2) > Math.Round(emaLong,2)) { SetHoldings(idChartSymbol, 1.0); idTradedToday = true; if (this.idChartingEnabled(data.Time)) { Plot(idChartSymbol + " 1d", "Buy", data[idChartSymbol].Price); // Log("***** " + data.Time.ToString("T") + " BUY EMA crossover, price: " + Math.Round(data[idChartSymbol].Price,2) + " short: " + Math.Round(emaShort,3) + " short With Tol: " + Math.Round(emaShort * (1.0m - tolerance),3) + " long: " + Math.Round(emaLong,3) + " tolerance: " + tolerance.ToString() + " qty: " + holding.Quantity); } } else if (holding.Quantity > 0 && emaShort <= emaLong) { Liquidate(idChartSymbol); idTradedToday = true; if (this.idChartingEnabled(data.Time)) { Plot(idChartSymbol + " 1d", "Sell", data[idChartSymbol].Price); // Log("***** " + data.Time.ToString("T") + " SELL EMA crossover, price: " + Math.Round(data[idChartSymbol].Price,2) + " fast: " + Math.Round(emaShort,2) + " EMA slow: " + Math.Round(emaLong,2) + " qty: " + holding.Quantity); } } // Plot Intraday Price and Indicators if (this.idChartingEnabled(data.Time)) { Plot(idChartSymbol + " 1d", idChartSymbol, data[idChartSymbol].Price); Plot(idChartSymbol + " 1d", emaShort); Plot(idChartSymbol + " 1d", emaLong); // Poor Man's Candlesticks - Disable price/close Line when using. // Plot(idChartSymbol + " 1d", "High", data[idChartSymbol].High); // Plot(idChartSymbol + " 1d", "Low", data[idChartSymbol].Low); } } catch (Exception err) { Error("OnData Err: " + err.Message); } } public override void OnEndOfDay() { try { idTradedToday = false; } catch (Exception err) { Error("OnEndOfDay Err:" + err.Message); } } private bool idChartingEnabled(DateTime marketDateTime) { switch (idTriggerChart) { case "firstTrade": if (idTradedToday == true && idChartTradeDate.HasValue == false) { idChartTradeDate = marketDateTime; return true; } else if (idChartTradeDate.HasValue && marketDateTime.Date <= idChartTradeDate.Value.Date) { return true; } break; } return false; } } }