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);
        }
示例#4
0
        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);
        }
示例#6
0
 public CusipResult CalculateStats(CUSIP cusipBlock)
 {
     Console.WriteLine($"Processing cusip - {cusipBlock.Id}");
     return(_statsCalculator.Calculate(cusipBlock));
 }