/// <summary>
        /// Method to retrieve the Function for a specific future symbol
        /// </summary>
        public static Func <DateTime, DateTime> FuturesExpiryFunction(string symbol)
        {
            if (FuturesExpiryDictionary.ContainsKey(symbol.ToUpper()))
            {
                return(FuturesExpiryDictionary[symbol.ToUpper()]);
            }

            // If function for expiry cannot be found pass the date through
            // return (date) => date;

            // by default set NSE India's rule for expiry (anyways above if condition will be
            // false for nfo stocks because they are not in dictionay)
            return(time => FuturesExpiryUtilityFunctions.NSELastThursday(time));
        }
Example #2
0
        /// <summary>
        /// Determine if a given Futures contract is a standard contract.
        /// </summary>
        /// <param name="symbol">Future symbol</param>
        /// <returns>True if symbol expiration matches standard expiration</returns>
        public static bool IsStandard(Symbol symbol)
        {
            var contractExpirationDate = symbol.ID.Date.Date;

            try
            {
                // Use our FutureExpiryFunctions to determine standard contracts dates.
                var expiryFunction = FuturesExpiryFunctions.FuturesExpiryFunction(symbol);
                var monthsToAdd    = FuturesExpiryUtilityFunctions.GetDeltaBetweenContractMonthAndContractExpiry(symbol.ID.Symbol, contractExpirationDate);
                var contractMonth  = contractExpirationDate.AddDays(-(contractExpirationDate.Day - 1))
                                     .AddMonths(monthsToAdd);

                var standardExpirationDate = expiryFunction(contractMonth);

                // Return true if the dates match
                return(contractExpirationDate == standardExpirationDate.Date);
            }
            catch
            {
                Log.Error($"Could not find standard date for {symbol}, will be classified as standard");
                return(true);
            }
        }