public CusipResult Calculate(CUSIP cusipData) { if (cusipData == null || cusipData.PriceTicks == null || cusipData.PriceTicks.Count == 0) { return(new CusipResult(cusipData.Id)); } double lowest = Double.MaxValue; double highest = Double.MinValue; double opening = cusipData.PriceTicks[0]; double closing = cusipData.PriceTicks[cusipData.PriceTicks.Count - 1]; foreach (var priceTick in cusipData.PriceTicks) { if (priceTick < lowest) { lowest = priceTick; } if (priceTick > highest) { highest = priceTick; } } return(new CusipResult() { CUSIP = cusipData.Id, Lowest = lowest, Highest = highest, Opening = opening, Closing = closing }); }
public void Should_Calculate_Stats_For_A_Valid_CusipData() { //Arrange var cusipObject = new CUSIP() { Id = "cusip-1", PriceTicks = new List <double>() { 11.11, 10.05, 20.10, 10.05, 30.15, 10.05, 40.20, 33.33 } }; var objStatsCalculator = new CusipStatsCalculator(); //Act CusipResult result = objStatsCalculator.Calculate(cusipObject); //Assert result.CUSIP.Should().Be("cusip-1"); result.Lowest.Should().Be(10.05); result.Highest.Should().Be(40.20); result.Opening.Should().Be(11.11); result.Closing.Should().Be(33.33); }
public CUSIP Parse(IList <string> rawCusipBlock) { /* * Sample Input: * - First line will alwyas be CUSIP ID * - Subsequents lines represent price ticks. * * CUSIP-1 * 11.11 * 10.05 * 20.10 * 10.05 * 30.15 * 10.05 * 40.20 * 33.33 */ var cusipObj = new CUSIP(); if (rawCusipBlock.Count > 0) { Console.WriteLine($"Parsing cusip - {rawCusipBlock[0]}"); cusipObj.Id = rawCusipBlock[0]; cusipObj.PriceTicks = new List <Double>(); for (int i = 1; i < rawCusipBlock.Count; i++) { cusipObj.PriceTicks.Add(Double.Parse(rawCusipBlock[i])); } return(cusipObj); } return(null); }
public IList <CusipResult> ExtractStats(string inputFilePath) { IList <CUSIP> cusipData = new List <CUSIP>(); IList <CusipResult> cusipResult = new List <CusipResult>(); IList <double> priceTicks = new List <double>(); string previousCusip = string.Empty; string currentCusip = string.Empty; using (var file1Reader = _fileManager.Read(inputFilePath)) //stream content without reading entire file into memory { while (!file1Reader.EndOfStream) { var currentRow = file1Reader.ReadLine(); //Type typeOfCurrentRow = _fileManager.DiscoverTypeOfData(currentRow); if (!isDouble(currentRow)) { currentCusip = currentRow; //save cusip block that we read so far. if (!string.IsNullOrEmpty(previousCusip) && priceTicks.Count > 0) { var extractedCusip = new CUSIP() { Id = previousCusip, PriceTicks = priceTicks }; cusipData.Add(extractedCusip); cusipResult.Add(_statsCalculator.Calculate(extractedCusip)); } priceTicks = new List <double>();//re-intialize previousCusip = currentCusip; } else { priceTicks.Add(Double.Parse(currentRow)); } } if (priceTicks.Count > 0) { var extractedCusip = new CUSIP() { Id = currentCusip, PriceTicks = priceTicks }; cusipData.Add(extractedCusip); cusipResult.Add(_statsCalculator.Calculate(extractedCusip)); } } return(cusipResult); }
public void Should_Handle_Empty_CusipData() { //Arrange var cusipObject = new CUSIP() { Id = "cusip-1", PriceTicks = null }; var objStatsCalculator = new CusipStatsCalculator(); //Act CusipResult result = objStatsCalculator.Calculate(cusipObject); //Assert result.CUSIP.Should().Be("cusip-1"); result.Lowest.Should().Be(-1); result.Highest.Should().Be(-1); result.Opening.Should().Be(-1); result.Closing.Should().Be(-1); }
public CusipResult CalculateStats(CUSIP cusipBlock) { Console.WriteLine($"Processing cusip - {cusipBlock.Id}"); return(_statsCalculator.Calculate(cusipBlock)); }