189 lines
8.3 KiB
C#
189 lines
8.3 KiB
C#
using Qdp.Foundation.Implementations;
|
|
using Qdp.Pricing.Base.Implementations;
|
|
using YLErp.BLL;
|
|
using YLErp.BLL.Calculation;
|
|
using YLErp.Model;
|
|
using YLErp.Models;
|
|
using YLErp.QdpModule;
|
|
|
|
namespace YLErp.Modules.QuotationModule
|
|
{
|
|
public class flat_price_quotationBLL
|
|
{
|
|
private YLContext yldb = new YLContext();
|
|
|
|
public List<UnderlyingMainContractRecord> GetContractViewModel()
|
|
{
|
|
var now = DateTime.Now.Date;
|
|
var marketCode = new List<string>() { "SHFE", "DCE", "ZCE", "CZCE", "SGE", "INE", "CFFEX", "GFEX" };
|
|
var maturityDate = QdpCalendarHelper.GetNonHoliday(valuedateBLL.ValueDate.AddMonths(1).AddDays(-1));
|
|
var underlyings = underlying_managerBLL.GetAllLiveunderlying_managerModel().Where(u => marketCode.Contains(u.MarketCode) && u.LaunchState == "1").ToList();
|
|
var total = underlying_managerBLL.GetAllLiveunderlying_managerModel().Where(u => marketCode.Contains(u.MarketCode) && u.LaunchState == "1").ToList(); //underlying_main_contractBLL.GetGtja_MaturityUnderlying(underlyings,maturityDate).ToList();//
|
|
|
|
//需要展示的标的信息
|
|
|
|
var manager = total.GroupBy(s => s.UnderlyingType).Select(g => (new { Key = g.Key, UnderlyingCode = g.Select(v => (new { Code = v.UnderlyingCode, MarketCode = v.MarketCode })).ToList() })).ToList();
|
|
|
|
var main = (from underlyingMainContract in yldb.underlying_main_contract select underlyingMainContract).ToList();
|
|
|
|
var viewModelList = new List<UnderlyingMainContractRecord>();
|
|
|
|
foreach (var item in manager)
|
|
{
|
|
var viewModel = new UnderlyingMainContractRecord();
|
|
|
|
viewModel.UnderlyingType = item.Key;
|
|
|
|
var underlyingMainContract = main.FirstOrDefault(s => s.UnderlyingType == item.Key);
|
|
|
|
viewModel.MinimumAmount = underlyingMainContract?.MinimumAmount;
|
|
viewModel.StrikeInterval = underlyingMainContract?.StrikeInterval;
|
|
|
|
if (underlyingMainContract?.OrderId != null)
|
|
{
|
|
viewModel.OrderId = underlyingMainContract.OrderId;
|
|
}
|
|
|
|
if (underlyingMainContract?.NeedQuote == null || underlyingMainContract.NeedQuote == 0)
|
|
{
|
|
viewModel.NeedQuote = false;
|
|
}
|
|
else
|
|
{
|
|
viewModel.NeedQuote = true;
|
|
}
|
|
|
|
foreach (var t in item.UnderlyingCode)
|
|
{
|
|
var selectListItem = new SelectItem
|
|
{
|
|
Text = t.Code,
|
|
Value = t.MarketCode
|
|
};
|
|
viewModel.UnderlyingCodeList.Add(selectListItem);
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(underlyingMainContract?.UnderlyingCode))
|
|
{
|
|
//viewModel.UnderlyingCodeList[0].Selected = true;
|
|
}
|
|
else
|
|
{
|
|
var underlyingCodeList = underlyingMainContract.UnderlyingCode.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
|
|
|
|
foreach (var underlyingCode in underlyingCodeList)
|
|
{
|
|
var firstOrDefault = viewModel.UnderlyingCodeList.FirstOrDefault(s => s.Text == underlyingCode);
|
|
if (firstOrDefault != null)
|
|
{
|
|
firstOrDefault.Selected = true;
|
|
}
|
|
else
|
|
{
|
|
//需要更新下数据库,因为已经过期,所以主标的的去掉,新的默认的需要加上
|
|
//如果 勾选的品种,显示的标的都到期了, 系统不能擅自报其他的标的。需要用户自己去选择该报的合约
|
|
//viewModel.UnderlyingCodeList[0].Selected = true;
|
|
}
|
|
}
|
|
}
|
|
viewModelList.Add(viewModel);
|
|
}
|
|
|
|
//underlying表没有了,但是underlyingmaincontract表还有的启用数据需要设为不启用
|
|
bool isNeedUpdate = false;
|
|
main.ForEach(m =>
|
|
{
|
|
var mList = manager.FirstOrDefault(w => w.Key == m.UnderlyingType);
|
|
|
|
if (mList == null && m.NeedQuote != 0)
|
|
{
|
|
isNeedUpdate = true;
|
|
m.NeedQuote = 0;
|
|
}
|
|
});
|
|
if (isNeedUpdate)
|
|
{
|
|
underlying_main_contractBLL.IsListOld = true;
|
|
yldb.SaveChanges();
|
|
}
|
|
|
|
////排序
|
|
viewModelList = viewModelList.OrderBy(s => s.OrderId).ToList();
|
|
//NetCacheHelper.Add(cacheKey, viewModelList, DateTime.Now.AddMinutes(10));
|
|
return viewModelList;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 计算报价预览页面的平值期权的到期日。
|
|
/// 手机端实时报价的平值到期日计算逻辑请参考CalculationHelper.AtmQuoteDefaultMaturity
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static Date GetAtmOptionQuotePreviewMaturity()
|
|
{
|
|
// 1个月平值期权的到期日是报价日后一个月减一天
|
|
var maturityDate = valuedateBLL.ValueDate.AddMonths(1).AddDays(-1);
|
|
return CalculatorHelper.AtmQuoteMaturityDateShift(maturityDate);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 得到排序的主合约
|
|
/// </summary>
|
|
public static IEnumerable<flat_price_quotationDto> GetSortFlat_Quotation(DateTime? date, string userGroup)
|
|
{
|
|
if (date == null)
|
|
{
|
|
date = GetAtmOptionQuotePreviewMaturity().DateTime;
|
|
}
|
|
|
|
var quotationList = new List<flat_price_quotationDto>();
|
|
var calendar = CalendarImpl.Get("chn");
|
|
var qdpDate = new Date(DateTime.Parse(date.Value.ToString()));
|
|
var mDate = calendar.IsBizDay(qdpDate) ? qdpDate : calendar.NextBizDay(qdpDate);
|
|
var result = AtMoneyOptionQuotes_API(mDate.DateTime, userGroup);
|
|
if (result != null && result.Count > 0)
|
|
{
|
|
foreach (var res in result)
|
|
{
|
|
var quotation = new flat_price_quotationDto
|
|
{
|
|
MarketCode = res.marketCode,
|
|
MarketName = res.marketName,
|
|
UnderlyingType = res.underlyingType,
|
|
UnderlyingCode = res.underlyingCode,
|
|
SpotPrice = res.spotPrice,
|
|
BuyOptionPrice = res.buyOptionPrice,
|
|
SellOptionPrice = res.sellOptionPrice,
|
|
ComparedToLastDayPrice = res.comparedToLastDayPrice,
|
|
OptDate = DateTime.Now,
|
|
LastUpdateTime = DateTime.Now,
|
|
BuyOptionVol = res.buyOptionVol,
|
|
SellOptionVol = res.sellOptionVol
|
|
};
|
|
quotationList.Add(quotation);
|
|
}
|
|
}
|
|
|
|
var underlyingList = underlying_main_contractBLL.GetDefaultAtMoneyQuoteList(date.Value);
|
|
foreach (var flat in quotationList)
|
|
{
|
|
var um = underlyingList.FirstOrDefault(c => string.Equals(c.UnderlyingCode, flat.UnderlyingCode, StringComparison.OrdinalIgnoreCase)) ??
|
|
underlyingList.FirstOrDefault(c => c.UnderlyingType == flat.UnderlyingType);//补丁 没有order
|
|
if (um != null)
|
|
{
|
|
flat.order = um.order;
|
|
flat.VarietyCode = um.CommodityCode;
|
|
}
|
|
}
|
|
|
|
return quotationList;
|
|
}
|
|
|
|
private static List<AtMoneyOptionQuoteRecord> AtMoneyOptionQuotes_API(DateTime maturityDate, string userGroup, bool onlyMainContract = true)
|
|
{
|
|
//string pathAndQuery = $"AtMoneyOptionQuotes?maturityDate={maturityDate.ToString("yyyy-MM-dd")}&userGroup={userGroup}&onlyMainContract={onlyMainContract}";
|
|
//return ApiHelper.Get<List<AtMoneyOptionQuoteRecord>>(pathAndQuery);
|
|
return CalculatorHelper.AtMoneyOptionQuotesV2(maturityDate.ToString("yyyy-MM-dd"), userGroup, onlyMainContract);
|
|
}
|
|
}
|
|
}
|