Overall Statistics |
Total Trades 2 Average Win 0% Average Loss -1.99% Compounding Annual Return -10.852% Drawdown 6.400% Expectancy -1 Net Profit -3.943% Sharpe Ratio -1.303 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.113 Beta -0.031 Annual Standard Deviation 0.086 Annual Variance 0.007 Information Ratio -0.501 Tracking Error 0.143 Treynor Ratio 3.593 Total Fees $0.00 |
using System; using System.Collections; using System.Collections.Generic; using QuantConnect.Algorithm; using QuantConnect.Data; using QuantConnect.Indicators; using QuantConnect.Securities; namespace QuantConnect { public class PedroNucci20150706 : QCAlgorithm { private const string _symbol = "ITUB4F.SA"; //MyEMA emaFast = new MyEMA(15); //MyEMA emaSlow = new MyEMA(50); ExponentialMovingAverage emaFast; ExponentialMovingAverage emaSlow; public override void Initialize() { SetStartDate(2015, 3, 1); SetEndDate(DateTime.Now); SetCash(5000); //Quandl Indexes AddData<YahooCsv>(_symbol, Resolution.Minute); emaFast = new ExponentialMovingAverage(15); emaSlow = new ExponentialMovingAverage(50); var consolidator = ResolveConsolidator(_symbol, Resolution.Hour); consolidator.DataConsolidated += (s, e) => OnConsolidatedData(e); RegisterIndicator(_symbol, emaFast, consolidator, x => x.Value); RegisterIndicator(_symbol, emaSlow, consolidator, x => x.Value); //AddSecurity(SecurityType.Equity, _symbol, Resolution.Minute); //SetRunMode... } private DateTime previous; /// <summary> /// This will be data parsed from url, no consolidation applied /// </summary> public void OnData(YahooCsv data) { } /// <summary> /// Trade on consolidated data /// </summary> /// <param name="data"></param> public void OnConsolidatedData(BaseData data) { if (!emaSlow.IsReady || !emaFast.IsReady) return; //emaFast.AddSample(data.Value); //emaSlow.AddSample(data.Value); int holdings = Portfolio[_symbol].Quantity; const decimal tolerance = 0.00015m; // we only want to go long if we're currently short or flat if (holdings <= 0) { // if the fast is greater than the slow, we'll go long if (emaFast > emaSlow * (1 + tolerance)) { Log("BUY >> " + Securities[_symbol].Price); SetHoldings(_symbol, 1.0); } } // we only want to liquidate if we're currently long // if the fast is less than the slow we'll liquidate our long if (holdings > 0 && emaFast < emaSlow) { Log("SELL >> " + Securities[_symbol].Price); Liquidate(_symbol); } /*if (holdings <= 0){ if (emaFast.EMA > emaSlow.EMA){ Order(_symbol, Math.Abs(holdings)+70); } } else if (holdings >= 0){ if (emaFast.EMA < emaSlow.EMA){ Order(_symbol,-(holdings+70)); } }*/ /* // a couple things to notice in this method: // 1. We never need to 'update' our indicators with the data, the engine takes care of this for us // 2. We can use indicators directly in math expressions // 3. We can easily plot many indicators at the same time // only once per day if (previous.Date == data.Time.Date) return; // define a small tolerance on our checks to avoid bouncing const decimal tolerance = 0.00015m; var holdings = Portfolio[_symbol].Quantity; // we only want to go long if we're currently short or flat if (holdings <= 0) { // if the fast is greater than the slow, we'll go long if (fast > slow * (1 + tolerance)) { Log("BUY >> " + Securities[_symbol].Price); SetHoldings(_symbol, 1.0); } } // we only want to liquidate if we're currently long // if the fast is less than the slow we'll liquidate our long if (holdings > 0 && fast < slow) { Log("SELL >> " + Securities[_symbol].Price); Liquidate(_symbol); } Plot(_symbol, "Price", data.Value); Plot("Ribbon", "Price", data.Value); // easily plot indicators, the series name will be the name of the indicator Plot(_symbol, fast, slow); Plot("Ribbon", ribbon); previous = data.Time; */ } } public class YahooCsv : BaseData { public decimal Open = 0; public decimal High = 0; public decimal Low = 0; public decimal Close = 0; // public decimal AdjustedClose = 0; public decimal Volume = 0; public YahooCsv() { this.Symbol = ""; } /// <summary> /// Return the URL external source for the data: QuantConnect will download it an read it line by line automatically: /// </summary> public override SubscriptionDataSource GetSource(SubscriptionDataConfig config, DateTime date, bool isLive) { //QUANDL WRAPPER ON YAHOO FINANCE API TO SORT DATA: //https://www.quandl.com/api/v1/datasets/YAHOO/INDEX_SPY.csv?trim_start=2000-01-01&trim_end=2014-12-03&sort_order=asc //return new SubscriptionDataSource("https://www.quandl.com/api/v1/datasets/YAHOO/" + config.Symbol + ".csv?trim_start=" + startDate + "&trim_end=" + endDate + "&sort_order=asc&exclude_headers=true", SubscriptionTransportMedium.RemoteFile); //var startDate = "1433769540"; //var endDate = "1433781240"; var startDate = (int)(new DateTime(2015, 3, 1).Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds / 1000); var endDate = (int)(DateTime.Now.Date.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds / 1000); var url = "http://newnode-pnucci.rhcloud.com/stock/yahoocsv?s=" + config.Symbol + "&d1=" + startDate + "&d2=" + endDate; //Console.WriteLine(url); System.Diagnostics.Debug.WriteLine("------------------ url: " + url); return new SubscriptionDataSource(url, SubscriptionTransportMedium.RemoteFile); } /// <summary> /// Convert each line of the file above into an object. /// </summary> public override BaseData Reader(SubscriptionDataConfig config, string line, DateTime date, bool isLive) { YahooCsv yBar = new YahooCsv(); try { string[] data = line.Split(','); //Required. yBar.Symbol = config.Symbol; //yBar.Time = DateTime.ParseExact(data[0], "yyyy-MM-dd", CultureInfo.InvariantCulture); yBar.Time = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddMilliseconds(ulong.Parse(data[0]) * 1000); //User configured / optional data on each bar: yBar.Open = Convert.ToDecimal(data[1]); yBar.Close = Convert.ToDecimal(data[2]); yBar.High = Convert.ToDecimal(data[3]); yBar.Low = Convert.ToDecimal(data[4]); yBar.Volume = Convert.ToDecimal(data[5]); //yBar.AdjustedClose = Convert.ToDecimal(data[6]); //This is the value the engine uses for portfolio calculations yBar.Value = yBar.Close; } catch { } return yBar; } } }