/// <summary> /// Initializes a new instance of the <see cref="PriceableCEROption"/> class. /// </summary> /// <param name="baseDate">The base date.</param> /// <param name="nodeStruct">The nodeStruct.</param> /// <param name="rollCalendar">THe rollCalendar.</param> /// <param name="fixedRate"></param> public PriceableCEROption(DateTime baseDate, CommodityFutureNodeStruct nodeStruct, IBusinessCalendar rollCalendar, BasicQuotation fixedRate) : base(baseDate, nodeStruct, rollCalendar, fixedRate) { Id = nodeStruct.Future.id; Future = nodeStruct.Future; ModelIdentifier = "CommoditiesFuturesOptionAsset"; var idParts = Id.Split('-'); var exchangeCommodityName = idParts[2]; var immCode = idParts[3]; int intResult; //Catch the relative rolls. if (int.TryParse(immCode, out intResult)) { var tempTradingDate = LastTradingDayHelper.ParseCode(immCode); immCode = tempTradingDate.GetNthMainCycleCode(baseDate, intResult); } var lastTradingDay = LastTradingDayHelper.Parse(exchangeCommodityName, immCode); LastTradeDate = lastTradingDay.GetLastTradingDay(baseDate); RiskMaturityDate = LastTradeDate; OptionsExpiryDate = LastTradeDate; TimeToExpiry = (decimal)DayCounter.YearFraction(BaseDate, RiskMaturityDate); }
/// <summary> /// Initializes a new instance of the <see cref="PriceableCER"/> class. /// </summary> /// <param name="baseDate">The base date.</param> /// <param name="nodeStruct">The nodeStruct.</param> /// <param name="rollCalendar">THe rollCalendar.</param> /// <param name="fixedRate"></param> public PriceableCER(DateTime baseDate, CommodityFutureNodeStruct nodeStruct, IBusinessCalendar rollCalendar, BasicQuotation fixedRate) : base(baseDate, nodeStruct.Future, nodeStruct.BusinessDayAdjustments, fixedRate, null) { Id = nodeStruct.Future.id; Future = nodeStruct.Future; PriceQuoteUnits = nodeStruct.PriceQuoteUnits; ModelIdentifier = "CommoditiesFuturesAsset"; SettlementBasis = "The business day prior to the 15th calendar day of the contract month"; ContractMonthPeriod = nodeStruct.ContractMonthPeriod; ContractSeries = "March (H), May (K), July (N), September (U) & December (Z)"; var idParts = Id.Split('-'); var exchangeCommodityNames = idParts[2].Split('.'); var commodityCode = exchangeCommodityNames[0]; if (exchangeCommodityNames.Length > 1) { commodityCode = exchangeCommodityNames[1]; } var immCode = idParts[3]; //Catch the relative rolls. if (int.TryParse(immCode, out var intResult)) { var tempTradingDate = LastTradingDayHelper.ParseCode(commodityCode); immCode = tempTradingDate.GetNthMainCycleCode(baseDate, intResult); } var lastTradingDay = LastTradingDayHelper.Parse(commodityCode, immCode); LastTradeDate = lastTradingDay.GetLastTradingDay(baseDate); RiskMaturityDate = LastTradeDate; TimeToExpiry = (decimal)DayCounter.YearFraction(BaseDate, RiskMaturityDate); }
/// <summary> /// Initializes a new instance of the <see cref="PriceableIceBrentFuture"/> class. /// </summary> /// <param name="baseDate">The base date.</param> /// <param name="nodeStruct">The nodeStruct.</param> /// <param name="rollCalendar">THe rollCalendar.</param> /// <param name="fixedRate"></param> public PriceableIceBrentFuture(DateTime baseDate, CommodityFutureNodeStruct nodeStruct, IBusinessCalendar rollCalendar, BasicQuotation fixedRate) : base(baseDate, nodeStruct.Future, nodeStruct.BusinessDayAdjustments, fixedRate, new Offset { dayType = DayTypeEnum.Business, dayTypeSpecified = true, period = PeriodEnum.D, periodMultiplier = "0", periodSpecified = true }) { Id = nodeStruct.Future.id; Future = nodeStruct.Future; PriceQuoteUnits = nodeStruct.PriceQuoteUnits; ModelIdentifier = "CommoditiesFuturesAsset"; SettlementBasis = "EFP Delivery with an option to cash settle."; ContractSeries = "Monthly"; var idParts = Id.Split('-'); //var exchangeCommodityName = idParts[2]; var immCode = idParts[3]; int intResult; //Only the relative rolls. if (int.TryParse(immCode, out intResult)) { var lastTradingDay = new FirstDayLessFifteen().GetNthLastTradingDay(baseDate, intResult); //Do the date adjustment logic. LastTradeDate = rollCalendar.Advance(lastTradingDay, RollOffset, BusinessDayConventionEnum.PRECEDING); RiskMaturityDate = LastTradeDate; TimeToExpiry = (decimal)DayCounter.YearFraction(BaseDate, RiskMaturityDate); } }
/// <summary> /// Initializes a new instance of the <see cref="PriceableLMEFuture"/> class. /// </summary> /// <param name="baseDate">The base date.</param> /// <param name="nodeStruct">The nodeStruct.</param> /// <param name="rollCalendar">THe rollCalendar.</param> /// <param name="fixedRate"></param> public PriceableLMEFuture(DateTime baseDate, CommodityFutureNodeStruct nodeStruct, IBusinessCalendar rollCalendar, BasicQuotation fixedRate) : base(baseDate, nodeStruct.Future, nodeStruct.BusinessDayAdjustments, fixedRate, new Offset { dayType = DayTypeEnum.Business, dayTypeSpecified = true, period = PeriodEnum.D, periodMultiplier = "0", periodSpecified = true }) { Id = nodeStruct.Future.id; CommodityType = Future.description; Future = nodeStruct.Future; PriceQuoteUnits = nodeStruct.PriceQuoteUnits; ModelIdentifier = "CommoditiesFuturesAsset"; SettlementBasis = "EFP Delivery with an option to cash settle."; ContractMonthPeriod = nodeStruct.ContractMonthPeriod; ContractSeries = "Daily:3M/Weekly:6M/Monthly:" + ContractMonthPeriod.ToString(); ExchangeIdentifier = nodeStruct.Future.exchangeId.Value; var idParts = Id.Split('-'); var immCode = idParts[3]; if (int.TryParse(immCode, out int intResult)) { //If the roll is less that 3M then daily roll. //Less the number of business days in the next 3 months i.e. approximately 60. //TODO This hsould be all moved to configuration! var dailyCutoverOffset = new Offset { dayType = DayTypeEnum.Calendar, dayTypeSpecified = true, period = PeriodEnum.M, periodMultiplier = "3", periodSpecified = true }; var dailyCutoverDate = rollCalendar.Advance(BaseDate, dailyCutoverOffset, BusinessDayConventionEnum.MODFOLLOWING); var businessDays = rollCalendar.BusinessDaysBetweenDates(BaseDate, dailyCutoverDate); if (intResult <= businessDays.Count) { LastTradeDate = businessDays[intResult]; } //TODO //If the roll is greater than 3M and less than 6M then weekly on a Wednesday. //Less the number of weeks in the following 3 months i.e. approximately 12 // else { //Remember thefirst expiry is after the 3 motn cutover! //TODO this should be the 6 ContractMonthPeriod. var rollDate = baseDate.AddMonths(intResult - businessDays.Count + 3); var lastTradingDay = new LastTradingDate().GetLastTradingDay(rollDate.Month, rollDate.Year); //Do the date adjustment logic. LastTradeDate = rollCalendar.Advance(lastTradingDay, RollOffset, BusinessDayConventionEnum.PRECEDING); } } //This means that the value should be a period. else { var term = PeriodHelper.Parse(immCode); LastTradeDate = GetEffectiveDate(BaseDate, rollCalendar, term, nodeStruct.BusinessDayAdjustments.businessDayConvention); } RiskMaturityDate = LastTradeDate; TimeToExpiry = (decimal)DayCounter.YearFraction(BaseDate, RiskMaturityDate); }