public static OHLCBar HistoricalDataEventArgsToOHLCBar(Krs.Ats.IBNet.HistoricalDataEventArgs e) { var bar = new OHLCBar { DTOpen = e.Date, Open = e.Open, High = e.High, Low = e.Low, Close = e.Close, Volume = e.Volume, }; return bar; }
private OHLCBar ParseLine(string[] items, string[] columns, decimal priceMultiplier, int volumeMultiplier) { var bar = new OHLCBar(); TimeSpan? closingTime = null; bool success; for (int i = 0; i < items.Length; i++) { switch (columns[i]) { case "Date": DateTime tmpDate; success = DateTime.TryParseExact( items[i], DateFormatTextBox.Text, CultureInfo.InvariantCulture, DateTimeStyles.None, out tmpDate); if (!success) { throw new Exception("Incorrect date format."); } else { bar.DT = new DateTime(tmpDate.Ticks); } break; case "DateTime": DateTime tmpDT; success = DateTime.TryParseExact( items[i], DateTimeFormatTextBox.Text, CultureInfo.InvariantCulture, DateTimeStyles.None, out tmpDT); if (!success) { throw new Exception("Incorrect datetime format."); } else { bar.DT = new DateTime(tmpDT.Ticks); } break; case "Time": DateTime tmpTS; success = DateTime.TryParseExact( items[i], TimeFormatTextBox.Text, CultureInfo.InvariantCulture, DateTimeStyles.None, out tmpTS); if (!success) { throw new Exception("Incorrect time format."); } else { closingTime = TimeSpan.FromSeconds(tmpTS.TimeOfDay.TotalSeconds); } break; case "Open": bar.Open = priceMultiplier * decimal.Parse(items[i]); break; case "High": bar.High = priceMultiplier * decimal.Parse(items[i]); break; case "Low": bar.Low = priceMultiplier * decimal.Parse(items[i]); break; case "Close": bar.Close = priceMultiplier * decimal.Parse(items[i]); break; case "AdjClose": bar.AdjClose = priceMultiplier * decimal.Parse(items[i]); break; case "Volume": bar.Volume = volumeMultiplier * int.Parse(items[i]); break; case "OpenInterest": bar.OpenInterest = int.Parse(items[i]); break; case "Dividends": bar.Dividend = decimal.Parse(items[i]); break; case "Splits": bar.Split = decimal.Parse(items[i]); break; } } //do the time addition if (closingTime != null) { bar.DT += closingTime.Value; } return bar; }
private static TimeSeries TimeSeriesFromFXRates(IEnumerable<FXRate> rates) { var bars = new List<OHLCBar>(); foreach (var rate in rates) { var bar = new OHLCBar { Open = rate.Rate, High = rate.Rate, Low = rate.Rate, Close = rate.Rate, AdjOpen = rate.Rate, AdjHigh = rate.Rate, AdjLow = rate.Rate, AdjClose = rate.Rate, DT = rate.Date }; bars.Add(bar); } return new TimeSeries(bars); }
/// <summary> /// Takes XML formated data from Quandl and turns it into a List of OHLCBars. /// </summary> public static List<OHLCBar> ParseXML(string data) { var doc = XDocument.Parse(data); var bars = new List<OHLCBar>(); //standard checks that the XML is what it should be if (doc.Root == null) { throw new Exception("XML Parse error: no root."); } if (doc.Root.Element("column-names") == null) { throw new Exception("Quandl: Column names element not found."); } //this simply gives us a list of column names, needed to parse the data correctly later on List<string> columns = doc.Root.Element("column-names").Elements("column-name").Select(x => x.Value).ToList(); //some columns are required.. if (!columns.Contains("Date")) { throw new Exception("Quandl: no date column, cannot parse data."); } var dataElement = doc.Root.Element("data"); if (dataElement == null) { throw new Exception("Quandl: No data present in XML file."); } bool skipBar, dateSet; //finally loop through each bar and try to parse it foreach (var barElements in dataElement.Elements("datum")) { skipBar = false; dateSet = false; decimal parsedValue; var bar = new OHLCBar(); int counter = 0; foreach (var price in barElements.Elements("datum")) { bool isNull = price.Attribute("nil") != null; //if the attribute "nil" exists, then the value of this field is null switch (columns[counter]) { case "Date": if (isNull) { skipBar = true; break; } bar.DT = DateTime.ParseExact(price.Value, "yyyy-MM-dd", CultureInfo.InvariantCulture); dateSet = true; break; case "Open": if (decimal.TryParse(price.Value, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out parsedValue)) bar.Open = parsedValue; break; case "High": if (decimal.TryParse(price.Value, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out parsedValue)) bar.High = parsedValue; break; case "Low": if (decimal.TryParse(price.Value, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out parsedValue)) bar.Low = parsedValue; break; case "Close": if (decimal.TryParse(price.Value, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out parsedValue)) bar.Close = parsedValue; break; case "Settle": //some futures data series have "settle" field instead of "close" if (!isNull && decimal.TryParse(price.Value, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out parsedValue)) bar.Close = parsedValue; break; //volume and OI are not represented as ints for some reason case "Volume": double volume; if (!isNull && double.TryParse(price.Value, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out volume)) bar.Volume = (long)volume; break; case "Open Interest": double openInterest; if (!isNull && double.TryParse(price.Value, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out openInterest)) bar.OpenInterest = (int)openInterest; break; case "Adjusted Close": if (decimal.TryParse(price.Value, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out parsedValue)) bar.AdjClose = parsedValue; break; } counter++; } //if the adjusted close is set, generate adjusted OHL if (bar.AdjClose.HasValue) { decimal adjFactor = bar.AdjClose.Value / bar.Close; bar.AdjOpen = bar.Open * adjFactor; bar.AdjHigh = bar.High * adjFactor; bar.AdjLow = bar.Low * adjFactor; } //make sure that the date has been set if (!dateSet) skipBar = true; if (!skipBar) bars.Add(bar); } return bars; }
public void AddDataAsync(OHLCBar data, Instrument instrument, BarSize frequency, bool overwrite = false) { throw new NotImplementedException(); }