public void Should_Generate_ToString_Method_For_Partial_Fields()
        {
            // Arrange
            var updateSummaryMessageType = UpdateSummaryDynamicMessageTypesFactory.GenerateDynamicObjectType(PartialFields);

            // Act
            var emptyInstance  = Activator.CreateInstance(updateSummaryMessageType);
            var parseMethod    = updateSummaryMessageType.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static);
            var parsedInstance = parseMethod.Invoke(null, new object[] { "P,AAPL,188.3500,52500,03/30/2021,19:59:14.503633,2" });

            // generate the expected string values
            var expectedStringEmptyInstance = $"Symbol: <NULL>, MostRecentTrade: {default(double)}, MostRecentTradeSize: {default(int)}, " +
                                              $"MostRecentTradeDate: {default(DateTime)}, " +
                                              $"MostRecentTradeTime: {default(TimeSpan)}, " +
                                              $"MostRecentTradeAggressor: {default(int)}";
            var expectedStringParsedInstance = $"Symbol: AAPL, MostRecentTrade: 188.35, MostRecentTradeSize: 52500, " +
                                               $"MostRecentTradeDate: {FieldParser.ParseDate("03/30/2021", FundamentalMessage.FundamentalDateTimeFormat)}, " +
                                               $"MostRecentTradeTime: {FieldParser.ParseTime("19:59:14.503633", UpdateSummaryMessage.UpdateMessageTimeFormat)}, " +
                                               $"MostRecentTradeAggressor: 2";

            // Assert
            Assert.IsNotNull(emptyInstance);
            Assert.AreEqual(expectedStringEmptyInstance, emptyInstance.ToString());
            Assert.IsNotNull(parsedInstance);
            Assert.AreEqual(expectedStringParsedInstance, parsedInstance.ToString());
        }
        public void Should_Generate_GetHashCode_Method_For_Partial_Fields()
        {
            // Arrange
            var updateSummaryMessageType = UpdateSummaryDynamicMessageTypesFactory.GenerateDynamicObjectType(PartialFields);

            // Act
            var emptyInstance  = Activator.CreateInstance(updateSummaryMessageType);
            var parseMethod    = updateSummaryMessageType.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static);
            var parsedInstance = parseMethod.Invoke(null, new object[] { "P,AAPL,188.3500,52500,03/30/2021,19:59:14.503633,2" });

            // calculate the expected hashes
            var expectedHashCodeEmptyInstance = 17;

            expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + ((string)null).GetHashCodeOrDefault();
            expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(double).GetHashCode();
            expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(int).GetHashCode();
            expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(DateTime).GetHashCode();
            expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(TimeSpan).GetHashCode();
            expectedHashCodeEmptyInstance = expectedHashCodeEmptyInstance * 29 + default(int).GetHashCode();

            var expectedHashCodeParsedInstance = 17;

            expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + "AAPL".GetHashCode();
            expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + 188.35.GetHashCode();
            expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + 52500.GetHashCode();
            expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + FieldParser.ParseDate("03/30/2021", FundamentalMessage.FundamentalDateTimeFormat).GetHashCode();
            expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + FieldParser.ParseTime("19:59:14.503633", UpdateSummaryMessage.UpdateMessageTimeFormat).GetHashCode();
            expectedHashCodeParsedInstance = expectedHashCodeParsedInstance * 29 + 2.GetHashCode();

            // Assert
            Assert.IsNotNull(emptyInstance);
            Assert.AreEqual(expectedHashCodeEmptyInstance, emptyInstance.GetHashCode());
            Assert.IsNotNull(parsedInstance);
            Assert.AreEqual(expectedHashCodeParsedInstance, parsedInstance.GetHashCode());
        }
        public void Should_Generate_Parse_Method_For_Partial_Fields()
        {
            // Arrange
            var updateSummaryMessageType = UpdateSummaryDynamicMessageTypesFactory.GenerateDynamicObjectType(PartialFields);

            // Act
            var parseMethod         = updateSummaryMessageType.GetMethod("Parse", BindingFlags.Public | BindingFlags.Static);
            var parsedInstance      = parseMethod.Invoke(null, new object[] { "P,AAPL,188.3500,52500,03/30/2021,19:59:14.503633,3" });
            var typedParsedInstance = parsedInstance as IUpdateSummaryDynamicMessage;

            // Assert
            Assert.IsNotNull(parsedInstance);
            Assert.IsNotNull(typedParsedInstance);
            Assert.AreEqual("AAPL", typedParsedInstance.Symbol);
            Assert.AreEqual(188.35, typedParsedInstance.MostRecentTrade);
            Assert.AreEqual(52500, typedParsedInstance.MostRecentTradeSize);
            Assert.AreEqual(FieldParser.ParseDate("03/30/2021", FundamentalMessage.FundamentalDateTimeFormat), typedParsedInstance.MostRecentTradeDate);
            Assert.AreEqual(FieldParser.ParseTime("19:59:14.503633", UpdateSummaryMessage.UpdateMessageTimeFormat), typedParsedInstance.MostRecentTradeTime);
            Assert.AreEqual(3, typedParsedInstance.MostRecentTradeAggressor);
        }
Beispiel #4
0
        public static UpdateSummaryMessage Parse(string message)
        {
            var values                      = message.SplitFeedMessage();
            var symbol                      = values[1];                                                    // field 2
            var mostRecentTrade             = FieldParser.ParseDouble(values[2]);                           // field 71
            var mostRecentTradeSize         = FieldParser.ParseInt(values[3]);                              // field 72
            var mostRecentTradeTime         = FieldParser.ParseDate(values[4], UpdateMessageTimeFormat);
            var mostRecentTradeMarketCenter = FieldParser.ParseInt(values[5]);                              // field 75
            var totalVolume                 = FieldParser.ParseInt(values[6]);                              // field 7
            var bid                       = FieldParser.ParseDouble(values[7]);                             // field 11
            var bidSize                   = FieldParser.ParseInt(values[8]);                                // field 13
            var ask                       = FieldParser.ParseDouble(values[9]);                             // field 12
            var askSize                   = FieldParser.ParseInt(values[10]);                               // field 14
            var open                      = FieldParser.ParseDouble(values[11]);                            // field 20
            var high                      = FieldParser.ParseDouble(values[12]);                            // field 9
            var low                       = FieldParser.ParseDouble(values[13]);                            // field 10
            var close                     = FieldParser.ParseDouble(values[14]);                            // field 21
            var messageContents           = values[15];                                                     // field 80
            var mostRecentTradeConditions = values[16];                                                     // field 74

            return(new UpdateSummaryMessage(
                       symbol,
                       mostRecentTrade,
                       mostRecentTradeSize,
                       mostRecentTradeTime,
                       mostRecentTradeMarketCenter,
                       totalVolume,
                       bid,
                       bidSize,
                       ask,
                       askSize,
                       open,
                       high,
                       low,
                       close,
                       messageContents,
                       mostRecentTradeConditions
                       ));
        }
Beispiel #5
0
        public static Level1DynamicFields Parse(string message, DynamicFieldset[] fields)
        {
            var values = message.SplitFeedMessage();

            #region Variables

            double   sevenDayYield               = default;
            double   ask                         = default;
            double   askChange                   = default;
            int      askMarketCenter             = default;
            int      askSize                     = default;
            TimeSpan askTime                     = default;
            string   availableRegions            = default;
            double   averageMaturity             = default;
            double   bid                         = default;
            double   bidChange                   = default;
            int      bidMarketCenter             = default;
            int      bidSize                     = default;
            TimeSpan bidTime                     = default;
            double   change                      = default;
            double   changeFromOpen              = default;
            double   close                       = default;
            double   closeRange1                 = default;
            double   closeRange2                 = default;
            string   daysToExpiration            = default;
            string   decimalPrecision            = default;
            int      delay                       = default;
            string   exchangeID                  = default;
            double   extendedTrade               = default;
            DateTime extendedTradeDate           = default;
            int      extendedTradeMarketCenter   = default;
            int      extendedTradeSize           = default;
            TimeSpan extendedTradeTime           = default;
            double   extendedTradingChange       = default;
            double   extendedTradingDifference   = default;
            string   financialStatusIndicator    = default;
            string   fractionDisplayCode         = default;
            double   high                        = default;
            double   last                        = default;
            DateTime lastDate                    = default;
            int      lastMarketCenter            = default;
            int      lastSize                    = default;
            TimeSpan lastTime                    = default;
            double   low                         = default;
            double   marketCapitalization        = default;
            int      marketOpen                  = default;
            string   messageContents             = default;
            double   mostRecentTrade             = default;
            int      mostRecentTradeAggressor    = default;
            string   mostRecentTradeConditions   = default;
            DateTime mostRecentTradeDate         = default;
            int      mostRecentTradeDayCode      = default;
            int      mostRecentTradeMarketCenter = default;
            int      mostRecentTradeSize         = default;
            TimeSpan mostRecentTradeTime         = default;
            double   netAssetValue               = default;
            int      numberOfTradesToday         = default;
            double   open                        = default;
            int      openInterest                = default;
            double   openRange1                  = default;
            double   openRange2                  = default;
            double   percentChange               = default;
            double   percentOffAverageVolume     = default;
            int      previousDayVolume           = default;
            double   priceEarningsRatio          = default;
            double   range                       = default;
            string   restrictedCode              = default;
            double   settle                      = default;
            DateTime settlementDate              = default;
            double   spread                      = default;
            string   symbol                      = default;
            int      tick                        = default;
            int      tickID                      = default;
            int      totalVolume                 = default;
            double   volatility                  = default;
            double   vwap                        = default;

            #endregion

            string type = values[0];

            for (var i = 0; i < fields.Length; i++)
            {
                var field = fields[i];
                var value = values[i + 1];

                switch (field)
                {
                case DynamicFieldset.SevenDayYield:
                    sevenDayYield = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.Ask:
                    ask = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.AskChange:
                    askChange = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.AskMarketCenter:
                    askMarketCenter = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.AskSize:
                    askSize = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.AskTime:
                    askTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat);
                    break;

                case DynamicFieldset.AvailableRegions:
                    availableRegions = value;
                    break;

                case DynamicFieldset.AverageMaturity:
                    averageMaturity = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.Bid:
                    bid = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.BidChange:
                    bidChange = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.BidMarketCenter:
                    bidMarketCenter = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.BidSize:
                    bidSize = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.BidTime:
                    bidTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat);
                    break;

                case DynamicFieldset.Change:
                    change = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.ChangeFromOpen:
                    changeFromOpen = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.Close:
                    close = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.CloseRange1:
                    closeRange1 = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.CloseRange2:
                    closeRange2 = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.DaysToExpiration:
                    daysToExpiration = value;
                    break;

                case DynamicFieldset.DecimalPrecision:
                    decimalPrecision = value;
                    break;

                case DynamicFieldset.Delay:
                    delay = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.ExchangeID:
                    exchangeID = value;
                    break;

                case DynamicFieldset.ExtendedTrade:
                    extendedTrade = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.ExtendedTradeDate:
                    extendedTradeDate = FieldParser.ParseDate(value, UpdateMessageDateFormat);
                    break;

                case DynamicFieldset.ExtendedTradeMarketCenter:
                    extendedTradeMarketCenter = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.ExtendedTradeSize:
                    extendedTradeSize = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.ExtendedTradeTime:
                    extendedTradeTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat);
                    break;

                case DynamicFieldset.ExtendedTradingChange:
                    extendedTradingChange = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.ExtendedTradingDifference:
                    extendedTradingDifference = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.FinancialStatusIndicator:
                    financialStatusIndicator = value;
                    break;

                case DynamicFieldset.FractionDisplayCode:
                    fractionDisplayCode = value;
                    break;

                case DynamicFieldset.High:
                    high = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.Last:
                    last = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.LastDate:
                    lastDate = FieldParser.ParseDate(value, UpdateMessageDateFormat);
                    break;

                case DynamicFieldset.LastMarketCenter:
                    lastMarketCenter = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.LastSize:
                    lastSize = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.LastTime:
                    lastTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat);
                    break;

                case DynamicFieldset.Low:
                    low = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.MarketCapitalization:
                    marketCapitalization = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.MarketOpen:
                    marketOpen = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.MessageContents:
                    messageContents = value;
                    break;

                case DynamicFieldset.MostRecentTrade:
                    mostRecentTrade = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.MostRecentTradeAggressor:
                    mostRecentTradeAggressor = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.MostRecentTradeConditions:
                    mostRecentTradeConditions = value;
                    break;

                case DynamicFieldset.MostRecentTradeDate:
                    mostRecentTradeDate = FieldParser.ParseDate(value, UpdateMessageDateFormat);
                    break;

                case DynamicFieldset.MostRecentTradeDayCode:
                    mostRecentTradeDayCode = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.MostRecentTradeMarketCenter:
                    mostRecentTradeMarketCenter = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.MostRecentTradeSize:
                    mostRecentTradeSize = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.MostRecentTradeTime:
                    mostRecentTradeTime = FieldParser.ParseTime(value, UpdateMessageTimeFormat);
                    break;

                case DynamicFieldset.NetAssetValue:
                    netAssetValue = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.NumberOfTradesToday:
                    numberOfTradesToday = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.Open:
                    open = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.OpenInterest:
                    openInterest = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.OpenRange1:
                    openRange1 = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.OpenRange2:
                    openRange2 = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.PercentChange:
                    percentChange = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.PercentOffAverageVolume:
                    percentOffAverageVolume = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.PreviousDayVolume:
                    previousDayVolume = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.PriceEarningsRatio:
                    priceEarningsRatio = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.Range:
                    range = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.RestrictedCode:
                    restrictedCode = value;
                    break;

                case DynamicFieldset.Settle:
                    settle = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.SettlementDate:
                    settlementDate = FieldParser.ParseDate(value, UpdateMessageDateFormat);
                    break;

                case DynamicFieldset.Spread:
                    spread = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.Symbol:
                    symbol = value;
                    break;

                case DynamicFieldset.Tick:
                    tick = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.TickID:
                    tickID = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.TotalVolume:
                    totalVolume = FieldParser.ParseInt(value);
                    break;

                case DynamicFieldset.Type:
                    type = value;
                    break;

                case DynamicFieldset.Volatility:
                    volatility = FieldParser.ParseDouble(value);
                    break;

                case DynamicFieldset.VWAP:
                    vwap = FieldParser.ParseDouble(value);
                    break;
                }
            }

            return(new Level1DynamicFields(
                       sevenDayYield,
                       ask,
                       askChange,
                       askMarketCenter,
                       askSize,
                       askTime,
                       availableRegions,
                       averageMaturity,
                       bid,
                       bidChange,
                       bidMarketCenter,
                       bidSize,
                       bidTime,
                       change,
                       changeFromOpen,
                       close,
                       closeRange1,
                       closeRange2,
                       daysToExpiration,
                       decimalPrecision,
                       delay,
                       exchangeID,
                       extendedTrade,
                       extendedTradeDate,
                       extendedTradeMarketCenter,
                       extendedTradeSize,
                       extendedTradeTime,
                       extendedTradingChange,
                       extendedTradingDifference,
                       financialStatusIndicator,
                       fractionDisplayCode,
                       high,
                       last,
                       lastDate,
                       lastMarketCenter,
                       lastSize,
                       lastTime,
                       low,
                       marketCapitalization,
                       marketOpen,
                       messageContents,
                       mostRecentTrade,
                       mostRecentTradeAggressor,
                       mostRecentTradeConditions,
                       mostRecentTradeDate,
                       mostRecentTradeDayCode,
                       mostRecentTradeMarketCenter,
                       mostRecentTradeSize,
                       mostRecentTradeTime,
                       netAssetValue,
                       numberOfTradesToday,
                       open,
                       openInterest,
                       openRange1,
                       openRange2,
                       percentChange,
                       percentOffAverageVolume,
                       previousDayVolume,
                       priceEarningsRatio,
                       range,
                       restrictedCode,
                       settle,
                       settlementDate,
                       spread,
                       symbol,
                       tick,
                       tickID,
                       totalVolume,
                       type,
                       volatility,
                       vwap));
        }