/// <summary> /// 取得合約到期日資訊(適用於月選擇權與期貨商品) /// </summary> /// <param name="date">日期</param> /// <param name="isAutoNextMonth">是否自動換月(如果不自動換月,不會超過本月)</param> /// <returns>返回值: 合約到期日資訊</returns> internal static ContractTime GetMonthMaturityDate(DateTime date, bool isAutoNextMonth) { int iYear = date.Year; int iMonth = date.Month; ContractTime cContractTime = new ContractTime(); for (int i = 15; i <= 21; i++) { DateTime cDate = new DateTime(iYear, iMonth, i, date.Hour, date.Minute, date.Second); if (cDate.DayOfWeek == DayOfWeek.Wednesday) { if (isAutoNextMonth && date > cDate) { i = 14; ++iMonth; if (iMonth > 12) { iMonth = 1; ++iYear; } continue; } cContractTime.ContractYear = iYear; cContractTime.ContractMonth = iMonth; cContractTime.MaturityDate = cDate; break; } } return cContractTime; }
private ContractTime CalcMaturityDate(DateTime date) { int iYear = date.Year; int iMonth = date.Month; ContractTime cContractTime = new ContractTime(); cContractTime.ContractYear = iYear; cContractTime.ContractMonth = iMonth; DateTime cDate = new DateTime(iYear, iMonth, date.Day, __iCloseHour, __iCloseMinute, __iCloseSecond); for (int i = 0; i < TRADE_LIMIT_DAY; i++) { cDate = cDate.AddSeconds(86400); //一次增加一天 if (__cTradeWeeks != null && !__cTradeWeeks.Contains(cDate.DayOfWeek)) { --i; continue; } } cContractTime.MaturityDate = cDate; return cContractTime; }
/// <summary> /// 取得週合約到期日資訊(適用於周選擇權商品) /// </summary> /// <param name="date">日期</param> /// <returns>返回值: 合約到期日資訊</returns> internal static ContractTime GetWeekMaturityDate(DateTime date) { ContractTime cContractTime = new ContractTime(); DateTime cMaturity = GetMonthMaturityDate(date, false).MaturityDate; for (int i = 0; i < 7; i++) { if (date.DayOfWeek == DayOfWeek.Wednesday) { double dTotals = (cMaturity - date).TotalSeconds; //計算是否在第三個星期三周期內(第三個星期三沒有週選擇權) if (dTotals >= 0 && dTotals <= 518400) { //要扣掉結算日 604800 - 86400 = 518400(星期四才是新的換周日) date = cMaturity.AddSeconds(604800); //一次加上一星期的秒數 } cContractTime.ContractYear = date.Year; cContractTime.ContractMonth = date.Month; cContractTime.MaturityDate = date; break; } date = date.AddSeconds(86400); //一次加上一天 86400 秒 } return cContractTime; }
private void AddContractTime(int id, ContractTime contractTime) { int iKey = contractTime.ContractYear * 100 + contractTime.ContractMonth; if (!__cIndexs.ContainsKey(iKey)) { contractTime.Id = id; __cIndexs.Add(iKey, id); __cContractTimes.Add(contractTime); } }
private ContractTime AddContractMonths(ContractTime contract, int month) { int iYear = contract.ContractYear; int iMonth = contract.ContractMonth + month; if (iMonth > 12) { --iMonth; iMonth %= 12; ++iMonth; ++iYear; } return MaturityDateUtil.GetMonthMaturityDate(new DateTime(iYear, iMonth, 1, __iCloseHour, __iCloseMinute, __iCloseSecond), false); }
private void AddContractTime(int id, ContractTime contractTime) { contractTime.Id = id; __cContractTimes.Add(contractTime); }