/// <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)); }
/// <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); } }