/// <summary>
        /// Parses from the CSV row.
        /// </summary>
        /// <param name="row">  the CSV row </param>
        /// <param name="info">  the trade info </param>
        /// <param name="resolver">  the resolver used to parse additional information </param>
        /// <returns> the parsed trade </returns>
        internal static SwapTrade parse(CsvRow row, IList <CsvRow> variableRows, TradeInfo info, TradeCsvInfoResolver resolver)
        {
            SwapTrade trade = parseRow(row, info, resolver);

            trade = parseVariableNotional(trade, variableRows);
            trade = parseVariableRates(trade, variableRows);
            return(resolver.completeTrade(row, trade));
        }
        // parses a trade from the CSV row
        internal static SecurityQuantityTrade parseTrade(CsvRow row, TradeInfo info, TradeCsvInfoResolver resolver)
        {
            SecurityTrade trade = parseSecurityTrade(row, info, resolver);
            SecurityTrade @base = resolver.completeTrade(row, trade);

            double?tickSizeOpt = row.findValue(TICK_SIZE).map(str => LoaderUtils.parseDouble(str));
            Optional <Currency> currencyOpt = row.findValue(CURRENCY).map(str => Currency.of(str));
            double?tickValueOpt             = row.findValue(TICK_VALUE).map(str => LoaderUtils.parseDouble(str));
            double contractSize             = row.findValue(CONTRACT_SIZE).map(str => LoaderUtils.parseDouble(str)).orElse(1d);

            if (tickSizeOpt.HasValue && currencyOpt.Present && tickValueOpt.HasValue)
            {
                SecurityPriceInfo priceInfo = SecurityPriceInfo.of(tickSizeOpt.Value, CurrencyAmount.of(currencyOpt.get(), tickValueOpt.Value), contractSize);
                GenericSecurity   sec       = GenericSecurity.of(SecurityInfo.of(@base.SecurityId, priceInfo));
                return(GenericSecurityTrade.of(@base.Info, sec, @base.Quantity, @base.Price));
            }
            return(@base);
        }
        /// <summary>
        /// Parses the data from a CSV row.
        /// </summary>
        /// <param name="row">  the CSV row object </param>
        /// <param name="info">  the trade info object </param>
        /// <param name="resolver">  the resolver used to parse additional information. This is not currently used in this method. </param>
        /// <returns> the parsed trade, as an instance of <seealso cref="FxSingleTrade"/> </returns>
        internal static FxSingleTrade parse(CsvRow row, TradeInfo info, TradeCsvInfoResolver resolver)
        {
            FxSingleTrade trade = parseRow(row, info);

            return(resolver.completeTrade(row, trade));
        }
        /// <summary>
        /// Parses from the CSV row.
        /// </summary>
        /// <param name="row">  the CSV row </param>
        /// <param name="info">  the trade info </param>
        /// <param name="resolver">  the resolver used to parse additional information </param>
        /// <returns> the parsed trade </returns>
        internal static TermDepositTrade parse(CsvRow row, TradeInfo info, TradeCsvInfoResolver resolver)
        {
            TermDepositTrade trade = parseRow(row, info, resolver);

            return(resolver.completeTrade(row, trade));
        }