从山证v2.3.0拷贝
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
namespace YLErp.Modules.ExcelAddinModule.Model
|
||||
{
|
||||
public class TradeQueryReq
|
||||
{
|
||||
/// <summary>
|
||||
/// 将交易合并为持仓
|
||||
/// </summary>
|
||||
public bool MergeTrade { get; set; }
|
||||
/// <summary>
|
||||
/// Api版本
|
||||
/// </summary>
|
||||
public int ApiVersion { get; set; }
|
||||
/// <summary>
|
||||
/// 估值日期
|
||||
/// <para>为空时使用当前系统估值日期</para>
|
||||
/// </summary>
|
||||
public DateTime? ValueDate { get; set; }
|
||||
/// <summary>
|
||||
/// 交易日期_开始
|
||||
/// </summary>
|
||||
public DateTime TradeDateStart { get; set; }
|
||||
/// <summary>
|
||||
/// 交易日期_结束
|
||||
/// </summary>
|
||||
public DateTime TradeDateEnd { get; set; }
|
||||
/// <summary>
|
||||
/// 交易类型
|
||||
/// </summary>
|
||||
public string TradeTypes { get; set; }
|
||||
/// <summary>
|
||||
/// 执行日期_开始
|
||||
/// </summary>
|
||||
public DateTime ExerciseDateStart { get; set; }
|
||||
/// <summary>
|
||||
/// 执行日期_结束
|
||||
/// </summary>
|
||||
public DateTime ExerciseDateEnd { get; set; }
|
||||
/// <summary>
|
||||
/// 交易状态
|
||||
/// </summary>
|
||||
public string TradeStatusStr { get; set; }
|
||||
/// <summary>
|
||||
/// 簿记账户
|
||||
/// </summary>
|
||||
public string AssetBookNameStr { get; set; }
|
||||
/// <summary>
|
||||
/// 交易编号
|
||||
/// </summary>
|
||||
public string TradeNumberStr { get; set; }
|
||||
/// <summary>
|
||||
/// 标的代码
|
||||
/// </summary>
|
||||
public string UnderlyingCodeStr { get; set; }
|
||||
/// <summary>
|
||||
/// 交易方向
|
||||
/// </summary>
|
||||
public string BuySellStr { get; set; }
|
||||
/// <summary>
|
||||
/// 期权类型
|
||||
/// </summary>
|
||||
public string OptionTypeStr { get; set; }
|
||||
/// <summary>
|
||||
/// 行权方式
|
||||
/// </summary>
|
||||
public string ExerciseModeStr { get; set; }
|
||||
/// <summary>
|
||||
/// 交易对手
|
||||
/// </summary>
|
||||
public string ClientNameStr { get; set; }
|
||||
/// <summary>
|
||||
/// 交易员
|
||||
/// </summary>
|
||||
public string TraderNameStr { get; set; }
|
||||
/// <summary>
|
||||
/// 开始日期_开始
|
||||
/// </summary>
|
||||
public DateTime StartDateStart { get; set; }
|
||||
/// <summary>
|
||||
/// 开始日期_结束
|
||||
/// </summary>
|
||||
public DateTime StartDateEnd { get; set; }
|
||||
/// <summary>
|
||||
/// 均价起算日_开始
|
||||
/// </summary>
|
||||
public DateTime AveragingPeriodStartDateStart { get; set; }
|
||||
/// <summary>
|
||||
/// 均价起算日_结束
|
||||
/// </summary>
|
||||
public DateTime AveragingPeriodStartDateEnd { get; set; }
|
||||
/// <summary>
|
||||
/// PayoffType
|
||||
/// </summary>
|
||||
public string PayoffTypeStr { get; set; }
|
||||
/// <summary>
|
||||
/// StrikeType
|
||||
/// </summary>
|
||||
public string StrikeTypeStr { get; set; }
|
||||
/// <summary>
|
||||
/// 场内期权代码
|
||||
/// </summary>
|
||||
public string ExchangeOptionCodeStr { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,253 @@
|
||||
namespace YLErp.Modules.ExcelAddinModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 主要是给Excel用
|
||||
/// <para>接口响应Trade结构</para>
|
||||
/// </summary>
|
||||
public class Trade_Simplify
|
||||
{
|
||||
private trade trade;
|
||||
/// <summary>
|
||||
/// 交易编号
|
||||
/// </summary>
|
||||
public string TradeNumber { get { return trade.TradeNumber; } set { trade.TradeNumber = value; } }
|
||||
/// <summary>
|
||||
/// 客户名称
|
||||
/// </summary>
|
||||
public string ClientName { get { return trade.ClientName; } set { trade.ClientName = value; } }
|
||||
/// <summary>
|
||||
/// 标的代码
|
||||
/// </summary>
|
||||
public string UnderlyingCode { get { return trade.UnderlyingCode; } set { trade.UnderlyingCode = value; } }
|
||||
/// <summary>
|
||||
/// 标的品种
|
||||
/// </summary>
|
||||
public string UnderlyingAssetClass { get { return trade.UnderlyingAssetClass; } set { trade.UnderlyingAssetClass = value; } }
|
||||
/// <summary>
|
||||
/// 交易日期
|
||||
/// </summary>
|
||||
public DateTime? TradeDate { get { return trade.TradeDate; } set { trade.TradeDate = value; } }
|
||||
/// <summary>
|
||||
/// 买/卖
|
||||
/// </summary>
|
||||
public string BuySell { get { return trade.BuySell; } set { trade.BuySell = value; } }
|
||||
/// <summary>
|
||||
/// 开始日
|
||||
/// </summary>
|
||||
public DateTime? StartDate { get { return trade.StartDate; } set { trade.StartDate = value; } }
|
||||
/// <summary>
|
||||
/// 期权到期日
|
||||
/// </summary>
|
||||
public DateTime? ExerciseDate { get { return trade.ExerciseDate; } set { trade.ExerciseDate = value; } }
|
||||
/// <summary>
|
||||
/// 标的到期日
|
||||
/// </summary>
|
||||
public DateTime? MaturityDate { get { return trade.MaturityDate; } set { trade.MaturityDate = value; } }
|
||||
/// <summary>
|
||||
/// 单份期权价格
|
||||
/// </summary>
|
||||
public double? TradeSinglePrice { get { return trade.TradeSinglePrice; } set { trade.TradeSinglePrice = value; } }
|
||||
/// <summary>
|
||||
/// 交易价格
|
||||
/// </summary>
|
||||
public double? TradePrice { get { return trade.TradePrice; } set { trade.TradePrice = value; } }
|
||||
/// <summary>
|
||||
/// 交易状态
|
||||
/// </summary>
|
||||
public string TradeStatus { get { return trade.TradeStatus; } set { trade.TradeStatus = value; } }
|
||||
/// <summary>
|
||||
/// 平仓/执行日期
|
||||
/// </summary>
|
||||
public DateTime? UnWindDate { get { return trade.UnWindDate; } set { trade.UnWindDate = value; } }
|
||||
/// <summary>
|
||||
/// 操作者Id
|
||||
/// </summary>
|
||||
public int? OptId { get { return trade.OptId; } set { trade.OptId = value ?? 0; } }
|
||||
/// <summary>
|
||||
/// 操作者名称
|
||||
/// </summary>
|
||||
public string OptName { get { return trade.OptName; } set { trade.OptName = value; } }
|
||||
/// <summary>
|
||||
/// 操作时间
|
||||
/// </summary>
|
||||
public DateTime? OptDate { get { return trade.OptDate; } set { trade.OptDate = value; } }
|
||||
/// <summary>
|
||||
/// 有效状态
|
||||
/// </summary>
|
||||
public string ValidState { get { return trade.ValidState; } set { trade.ValidState = value; } }
|
||||
/// <summary>
|
||||
/// 现货价格
|
||||
/// </summary>
|
||||
public double? SpotPrice { get { return trade.SpotPrice; } set { trade.SpotPrice = value; } }
|
||||
/// <summary>
|
||||
/// 行权
|
||||
/// </summary>
|
||||
public string ExerciseMode { get { return trade.ExerciseMode; } set { trade.ExerciseMode = value; } }
|
||||
/// <summary>
|
||||
/// 涨/跌
|
||||
/// </summary>
|
||||
public string OptionType { get { return trade.OptionType; } set { trade.OptionType = value; } }
|
||||
/// <summary>
|
||||
/// 存续份额
|
||||
/// </summary>
|
||||
public double CurNotional { get { return trade.CurNotional; } set { trade.CurNotional = value; } }
|
||||
/// <summary>
|
||||
/// 成交份额
|
||||
/// </summary>
|
||||
public double OriginalNotional { get { return trade.OriginalNotional ?? 0; } set { trade.OriginalNotional = value; } }
|
||||
/// <summary>
|
||||
/// 前一日收盘份额
|
||||
/// </summary>
|
||||
public double LastDayNotional { get { return trade.LastDayNotional; } set { trade.LastDayNotional = value; } }
|
||||
/// <summary>
|
||||
/// 资产账簿名称
|
||||
/// </summary>
|
||||
public string AssetBookName { get { return trade.AssetBookName; } set { trade.AssetBookName = value; } }
|
||||
/// <summary>
|
||||
/// 行权价
|
||||
/// </summary>
|
||||
public double? Strike { get { return trade.Strike; } set { trade.Strike = value; } }
|
||||
/// <summary>
|
||||
/// 交易员名称
|
||||
/// </summary>
|
||||
public string TraderName { get { return trade.TraderName; } set { trade.TraderName = value; } }
|
||||
/// <summary>
|
||||
/// 交易类型
|
||||
/// </summary>
|
||||
public string TradeType { get { return trade.TradeType; } set { trade.TradeType = value; } }
|
||||
/// <summary>
|
||||
/// 标的资产类型
|
||||
/// </summary>
|
||||
public string UnderlyingInstrumentType { get { return trade.UnderlyingInstrumentType; } set { trade.UnderlyingInstrumentType = value; } }
|
||||
/// <summary>
|
||||
/// 名义本金
|
||||
/// </summary>
|
||||
public double? StockEqvNotionalReal { get { return trade.StockEqvNotionalReal; } set { trade.StockEqvNotionalReal = value ?? 0; } }
|
||||
/// <summary>
|
||||
/// 交易单位
|
||||
/// </summary>
|
||||
public string TradeUnit { get { return trade.TradeUnit; } set { trade.TradeUnit = value; } }
|
||||
/// <summary>
|
||||
/// 交易数量
|
||||
/// </summary>
|
||||
public double? TradeAmount { get { return trade.TradeAmount; } set { trade.TradeAmount = value ?? 0; } }
|
||||
/// <summary>
|
||||
/// 成交数量
|
||||
/// </summary>
|
||||
public double? TradeOriginalAmount { get { return trade.TradeOriginalAmount; } set { trade.TradeOriginalAmount = value ?? 0; } }
|
||||
/// <summary>
|
||||
/// 交易手数
|
||||
/// </summary>
|
||||
public double? Lots { get { return trade.Lots; } set { trade.Lots = value ?? 0; } }
|
||||
/// <summary>
|
||||
/// 平仓Vol
|
||||
/// </summary>
|
||||
public double? TradeCloseVolatility { get { return trade.TradeCloseVolatility; } set { trade.TradeCloseVolatility = value; } }
|
||||
/// <summary>
|
||||
/// 开仓Vol
|
||||
/// </summary>
|
||||
public double? TradeOpenVolatility { get { return trade.TradeOpenVolatility; } set { trade.TradeOpenVolatility = value; } }
|
||||
/// <summary>
|
||||
/// 平滑天数
|
||||
/// </summary>
|
||||
public int? NumOfSmoothingDays { get { return trade.NumOfSmoothingDays; } set { trade.NumOfSmoothingDays = value; } }
|
||||
/// <summary>
|
||||
/// 持仓波动率
|
||||
/// </summary>
|
||||
public double? Vol { get { return trade.Vol; } set { trade.Vol = value; } }
|
||||
/// <summary>
|
||||
/// 交易所代码
|
||||
/// </summary>
|
||||
public string ExchangeOptionCode { get { return trade.ExchangeOptionCode; } set { trade.ExchangeOptionCode = value; } }
|
||||
/// <summary>
|
||||
/// 亚式期权
|
||||
/// </summary>
|
||||
public trade_asian_option trade_asian_option { get { return TradeType == "亚式期权" ? trade.trade_asian_option : null; } set { trade.trade_asian_option = value; } }
|
||||
/// <summary>
|
||||
/// 彩虹期权
|
||||
/// </summary>
|
||||
public trade_rainbow_option trade_rainbow_option { get { return TradeType == "彩虹期权" ? trade.trade_rainbow_option : null; } set { trade.trade_rainbow_option = value; } }
|
||||
/// <summary>
|
||||
/// 障碍期权
|
||||
/// </summary>
|
||||
public trade_barrier_option trade_barrier_option { get { return TradeType == "障碍期权" ? trade.trade_barrier_option : null; } set { trade.trade_barrier_option = value; } }
|
||||
/// <summary>
|
||||
/// 二元期权
|
||||
/// </summary>
|
||||
public trade_binary_option trade_binary_option { get { return TradeType == "二元期权" ? trade.trade_binary_option : null; } set { trade.trade_binary_option = value; } }
|
||||
///// <summary>
|
||||
///// 香草期权(Excel可能会用到所以改成一个对象)
|
||||
///// </summary>
|
||||
//public object trade_vanilla_option { get { return TradeType == "香草期权" ? new object() : null; } }
|
||||
|
||||
///// <summary>
|
||||
///// 合成价差期权(Excel可能会用到所以改成一个对象)
|
||||
///// </summary>
|
||||
//public object trade_synthetic_spread_option { get { return TradeType == "合成价差期权" ? new object() : null; } }
|
||||
|
||||
public trade_double_sharkfin_option trade_double_sharkfin_option { get { return TradeType == "双鲨期权" ? trade.trade_double_sharkfin_option : null; } set { trade.trade_double_sharkfin_option = value; } }
|
||||
public trade_autocall trade_autocall { get { return TradeType == "凤凰期权" ? trade.trade_autocall : null; } set { trade.trade_autocall = value; } }
|
||||
public trade_snowball trade_snowball { get { return TradeType == "雪球期权" ? trade.trade_snowball : null; } set { trade.trade_snowball = value; } }
|
||||
public trade_rangeaccrual trade_rangeaccrual { get { return TradeType == "区间累积期权" ? trade.trade_rangeaccrual : null; } set { trade.trade_rangeaccrual = value; } }
|
||||
public trade_airbag trade_airbag { get { return TradeType == "气囊结构" ? trade.trade_airbag : null; } set { trade.trade_airbag = value; } }
|
||||
public trade_underlying_enhance trade_underlying_enhance { get { return TradeType == "收益增强结构" ? trade.trade_underlying_enhance : null; } set { trade.trade_underlying_enhance = value; } }
|
||||
public trade_accumulator_option trade_accumulator_option { get { return TradeType == "累计期权" ? trade.trade_accumulator_option : null; } set { trade.trade_accumulator_option = value; } }
|
||||
|
||||
public trade_forward trade_Forward { get { return TradeType == "远期" ? trade.trade_forward : null; } set { trade.trade_forward = value; } }
|
||||
/// <summary>
|
||||
/// 资金情况
|
||||
/// </summary>
|
||||
public trade_cash trade_cash { get { return trade.trade_cash; } set { trade.trade_cash = value; } }
|
||||
/// <summary>
|
||||
/// 对冲波动率
|
||||
/// </summary>
|
||||
public double? TradeSavedVol { get { return trade.TradeSavedVol; } set { trade.TradeSavedVol = value; } }
|
||||
/// <summary>
|
||||
/// 昨收对冲波动率
|
||||
/// </summary>
|
||||
public double? YesterDayTradeSavedVol { get { return trade.YesterDayTradeSavedVol; } set { trade.YesterDayTradeSavedVol = value; } }
|
||||
/// <summary>
|
||||
/// 行权价类型
|
||||
/// </summary>
|
||||
public string IsMoneynessOption { get { return trade.IsMoneynessOption; } set { trade.IsMoneynessOption = value; } }
|
||||
/// <summary>
|
||||
/// 参与率
|
||||
/// </summary>
|
||||
public double ParticipationRate { get { return trade.ParticipationRate ?? 1; } set { trade.ParticipationRate = value; } }
|
||||
/// <summary>
|
||||
/// 保底收益率
|
||||
/// </summary>
|
||||
public double? PrincipalRate { get { return trade.PrincipalRate; } set { trade.PrincipalRate = value; } }
|
||||
/// <summary>
|
||||
/// 无风险利率
|
||||
/// </summary>
|
||||
public double? NoRiskRate { get { return trade.NoRiskRate; } set { trade.NoRiskRate = value; } }
|
||||
/// <summary>
|
||||
/// 分红率
|
||||
/// </summary>
|
||||
public double? DividendRate { get { return trade.DividendRate; } set { trade.DividendRate = value; } }
|
||||
/// <summary>
|
||||
/// 是否年化
|
||||
/// </summary>
|
||||
public bool IsAnnualized { get { return trade.IsAnnualized; } set { trade.IsAnnualized = value; } }
|
||||
/// <summary>
|
||||
/// 年化系数
|
||||
/// </summary>
|
||||
public double AnnualizeFactor { get { return trade.AnnualizeFactor ?? 1; } set { trade.AnnualizeFactor = value; } }
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
public string Comments { get { return trade.Comments; } set { trade.Comments = value; } }
|
||||
|
||||
public Dictionary<string, string> MetaDic { get { return trade.MetaDic; } set { trade.MetaDic = value; } }
|
||||
|
||||
public Trade_Simplify() : this(new trade()) { }
|
||||
|
||||
public Trade_Simplify(trade trade) { this.trade = trade; }
|
||||
|
||||
public static implicit operator Trade_Simplify(trade trade)
|
||||
{
|
||||
return new Trade_Simplify(trade);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
namespace YLErp.Modules.ExcelAddinModule
|
||||
{
|
||||
public class UnderlyingManagerInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 合约代码UnderlyingCode,(场内期权则是场内期权代码 Exchange_list_option表中对应contractcode)
|
||||
/// </summary>
|
||||
public string Code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 合约名称(场内期权忽略) UnderlyingName
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易所代码(MarketCode)
|
||||
/// </summary>
|
||||
public string Exchange { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品种类 CommodityCode(场内期权忽略)
|
||||
/// </summary>
|
||||
public string Product_Class { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 场内期权字段--场内期权的标的代码,其它忽略
|
||||
/// </summary>
|
||||
public string Underlying_Code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 上市日期
|
||||
/// </summary>
|
||||
public DateTime? Create_Date { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 到期日期
|
||||
/// </summary>
|
||||
public DateTime? Expire_Date { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 合约乘数
|
||||
/// </summary>
|
||||
public double Multiple { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 行权价(场内期权产品用,其它 0)
|
||||
/// </summary>
|
||||
public double Strike { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 最小变动价位 来自品种表
|
||||
/// </summary>
|
||||
public double Price_Tick { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 多头预付金率,MarginRate
|
||||
/// </summary>
|
||||
public double Long_Margin_Ratio { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 空投预付金率,MarginRate
|
||||
/// </summary>
|
||||
public double Short_Margin_Ratio { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易产品类型
|
||||
/// </summary>
|
||||
public ContractTypeEnum Contract_Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 期权类型
|
||||
/// </summary>
|
||||
public OptionTypeEnum OptionType { get; set; }
|
||||
}
|
||||
|
||||
public enum ContractTypeEnum
|
||||
{
|
||||
None = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 现货
|
||||
/// </summary>
|
||||
Spot = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 期货
|
||||
/// </summary>
|
||||
Futures = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 证券
|
||||
/// </summary>
|
||||
Stocks = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 期货期权
|
||||
/// </summary>
|
||||
Options = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 股票期权
|
||||
/// </summary>
|
||||
StockOptions = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 现货期权
|
||||
/// </summary>
|
||||
SpotOption = 6,
|
||||
|
||||
/// <summary>
|
||||
/// 期转现
|
||||
/// </summary>
|
||||
FutuToSpot = 7,
|
||||
|
||||
/// <summary>
|
||||
/// 组合
|
||||
/// </summary>
|
||||
Combination = 8,
|
||||
|
||||
/// <summary>
|
||||
/// 外汇远期
|
||||
/// </summary>
|
||||
FxForward = 9,
|
||||
|
||||
/// <summary>
|
||||
/// 金交所递延
|
||||
/// </summary>
|
||||
SGE_DEFER = 10,
|
||||
|
||||
/// <summary>
|
||||
/// 金交所远期
|
||||
/// </summary>
|
||||
SGE_FOWARD = 11,
|
||||
|
||||
/// <summary>
|
||||
/// 金交所现货
|
||||
/// </summary>
|
||||
SGE_SPOT = 12,
|
||||
}
|
||||
|
||||
public enum OptionTypeEnum
|
||||
{
|
||||
None = 0,
|
||||
Call = 1,
|
||||
Put = 2
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
using YLErp.BLL;
|
||||
|
||||
namespace YLErp.Modules.ExcelAddinModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 基础数据服务
|
||||
/// </summary>
|
||||
public class BasicDataService
|
||||
{
|
||||
public static List<UnderlyingManagerInfo> GetUnderlyingList()
|
||||
{
|
||||
using (var context = new YLContext())
|
||||
{
|
||||
var limitLowDate = DateTime.Now.AddYears(-3);
|
||||
var underlyings = from source in context.underlying_manager.AsNoTracking()
|
||||
join vari in context.variety.AsNoTracking() on source.UnderlyingTypeId equals vari.id into varies
|
||||
from vari in varies.DefaultIfEmpty()
|
||||
select new { underlying = source, variety = vari };
|
||||
|
||||
var result = new List<UnderlyingManagerInfo>();
|
||||
underlyings.ToList().ForEach(x =>
|
||||
{
|
||||
double.TryParse(x.variety.MinPriceChange, out var priceTick);
|
||||
result.Add(new UnderlyingManagerInfo()
|
||||
{
|
||||
Code = x.underlying.UnderlyingCode,
|
||||
Name = x.underlying.UnderlyingName,
|
||||
Exchange = x.underlying.MarketCode,
|
||||
Product_Class = x.underlying.CommodityCode,
|
||||
Underlying_Code = x.underlying.UnderlyingCode,
|
||||
Expire_Date = x.underlying.MaturityDate,
|
||||
Multiple = x.variety.TradeUnitValue ?? 0,
|
||||
Price_Tick = priceTick,
|
||||
Long_Margin_Ratio = x.underlying.MarginRate ?? 0,
|
||||
Short_Margin_Ratio = x.underlying.MarginRate ?? 0
|
||||
});
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
using Qdp.Foundation.Implementations;
|
||||
using Qdp.Pricing.Base.Enums;
|
||||
using Qdp.Pricing.Base.Implementations;
|
||||
using Qdp.Pricing.Library.Equity.Engines.Analytical;
|
||||
using YLErp.BLL;
|
||||
using YLErp.Modules.VolatilityModule;
|
||||
|
||||
namespace YLErp.Modules.ExcelAddinModule
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public static class ExcelVolatilityService
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public static double? GetUnderlyingVol(YLContext db, string optionCode, DateTime valueDate, string userGroup = null)
|
||||
{
|
||||
if (PS.Config.Is光大光子)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var exUm = DataCacheProvider.GetExchangeListOptionDataSource().GetData(optionCode);
|
||||
if (exUm == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(exUm.UnderlyingCode);
|
||||
if (um == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var price = um.Price ?? 0;
|
||||
|
||||
if (valuedateBLL.SystemDate.ValueDate > valueDate)
|
||||
{
|
||||
if (ConsGlobal.InstrumentType.IsStock(um.UnderlyingInstrumentType))
|
||||
{
|
||||
price = (db.eod_stock_price.Where(O => O.ValueDate <= valueDate && O.UnderlyingCode == um.UnderlyingCode)
|
||||
.OrderByDescending(n => n.ValueDate).Select(n => (double?)n.ClosePrice).FirstOrDefault()) ?? 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
price = (db.eod_commodity_future_price.Where(O => O.ValueDate <= valueDate && O.UnderlyingCode == um.UnderlyingCode)
|
||||
.OrderByDescending(n => n.ValueDate).Select(n => (double?)n.ClosePrice).FirstOrDefault()) ?? 0;
|
||||
}
|
||||
}
|
||||
|
||||
var req = new SingleVolReq
|
||||
{
|
||||
VolType = "交易",
|
||||
Strike = exUm.Strike,
|
||||
SpotPrice = price,
|
||||
TradeDate = valueDate,
|
||||
ExerciseDate = exUm.MaturityDate,
|
||||
IsMoneynessOption = "否",
|
||||
//req.CallPut = trade.CallPut;
|
||||
UnderlyingId = exUm.id,
|
||||
UnderlyingCode = exUm.UnderlyingCode,
|
||||
UnderlyingName = um.UnderlyingName,
|
||||
UnderlyingTypeId = um.UnderlyingTypeId,
|
||||
UserGroup = userGroup
|
||||
};
|
||||
|
||||
var vol = SingleVolService.GetSingleVol(req, 0);
|
||||
|
||||
return vol;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public static HandleResult<Dictionary<string, Dictionary<string, double?>>> GetTradeVol(DateTime date, List<string> tradeNumbers)
|
||||
{
|
||||
var result = new Dictionary<string, Dictionary<string, double?>>();
|
||||
|
||||
using (var context = new YLContext())
|
||||
{
|
||||
var trades = context.trade.Where(O => tradeNumbers.Contains(O.TradeNumber)).ToList();
|
||||
if (trades == null || trades.Count == 0)
|
||||
{ return new HandleResult<Dictionary<string, Dictionary<string, double?>>>("交易代码不存在"); }
|
||||
for (var i = 0; i < trades.Count; i++)
|
||||
{
|
||||
if (!result.ContainsKey(trades[i].TradeNumber))
|
||||
{ result.Add(trades[i].TradeNumber, new Dictionary<string, double?>()); }
|
||||
result[trades[i].TradeNumber]["TradeOpenVolatility"] = trades[i].TradeOpenVolatility;
|
||||
result[trades[i].TradeNumber]["TradeCloseVolatility"] = trades[i].TradeCloseVolatility;
|
||||
result[trades[i].TradeNumber]["NumOfSmoothingDays"] = trades[i].NumOfSmoothingDays;
|
||||
if (trades[i].StartDate > date) { result[trades[i].TradeNumber]["TradeVol"] = null; }
|
||||
else
|
||||
{
|
||||
result[trades[i].TradeNumber]["TradeVol"] = AnalyticalOptionTradeVolInterp.tradeVolLinearInterp(
|
||||
new Date(date),
|
||||
trades[i].TradeOpenVolatility.GetValueOrDefault(),
|
||||
trades[i].TradeCloseVolatility.GetValueOrDefault(),
|
||||
new Date(trades[i].StartDate.GetValueOrDefault()),
|
||||
new Date(trades[i].ExerciseDate.GetValueOrDefault()),
|
||||
trades[i].NumOfSmoothingDays.GetValueOrDefault(),
|
||||
DayCountMode.TradingDay,
|
||||
CalendarImpl.Get("chn")
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return new HandleResult<Dictionary<string, Dictionary<string, double?>>>(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,313 @@
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using YLErp.BLL;
|
||||
using YLErp.DBModels.Enums;
|
||||
using YLErp.Modules.ExcelAddinModule.Model;
|
||||
|
||||
namespace YLErp.Modules.ExcelAddinModule.Service
|
||||
{
|
||||
public class TradeQueryService : YLBaseService
|
||||
{
|
||||
/// <summary>
|
||||
/// 分隔符
|
||||
/// </summary>
|
||||
private readonly char[] separator = ",".ToArray();
|
||||
/// <summary>
|
||||
/// 无效日期
|
||||
/// </summary>
|
||||
private readonly DateTime InValidDate = DateTime.Now.AddYears(-10);
|
||||
|
||||
public TradeQueryService(OptUserInfo userInfo) : base(userInfo)
|
||||
{
|
||||
}
|
||||
|
||||
private bool SplitParame(string str, out string[] arr)
|
||||
{
|
||||
bool result = false;
|
||||
arr = null;
|
||||
if (!string.IsNullOrWhiteSpace(str))
|
||||
{
|
||||
arr = str.Split(separator, StringSplitOptions.RemoveEmptyEntries);
|
||||
result = arr.Length > 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<trade> SearchTradeList(TradeQueryReq req)
|
||||
{
|
||||
List<trade> results = null;
|
||||
try
|
||||
{
|
||||
var query = from source in DbContext.trade where source.ValidState != "InValid" select source;
|
||||
string[] payoffTypeArr = null, strikeTypeArr = null;
|
||||
if (req.AveragingPeriodStartDateStart > InValidDate ||
|
||||
req.AveragingPeriodStartDateEnd > InValidDate ||
|
||||
SplitParame(req.PayoffTypeStr, out payoffTypeArr) ||
|
||||
SplitParame(req.StrikeTypeStr, out strikeTypeArr))
|
||||
{
|
||||
var queryEx = from source in query join ex in DbContext.trade_asian_option on source.id equals ex.TradeId select new { source, ex };
|
||||
if (req.AveragingPeriodStartDateStart > InValidDate)
|
||||
{
|
||||
queryEx = queryEx.Where(O => O.ex.AveragingPeriodStartDate >= req.AveragingPeriodStartDateStart);
|
||||
}
|
||||
if (req.AveragingPeriodStartDateEnd > InValidDate)
|
||||
{
|
||||
queryEx = queryEx.Where(O => O.ex.AveragingPeriodStartDate <= req.AveragingPeriodStartDateEnd);
|
||||
}
|
||||
if (payoffTypeArr?.Length > 0)
|
||||
{
|
||||
queryEx = queryEx.Where(O => payoffTypeArr.Contains(O.ex.PayoffType));
|
||||
}
|
||||
if (strikeTypeArr?.Length > 0)
|
||||
{
|
||||
queryEx = queryEx.Where(O => strikeTypeArr.Contains(O.ex.StrikeType));
|
||||
}
|
||||
query = queryEx.Select(O => O.source);
|
||||
}
|
||||
if (req.TradeDateStart > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.TradeDate >= req.TradeDateStart);
|
||||
}
|
||||
if (req.TradeDateEnd > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.TradeDate <= req.TradeDateEnd);
|
||||
}
|
||||
if (SplitParame(req.TradeTypes, out var tradeTypeArr))
|
||||
{
|
||||
query = query.Where(O => tradeTypeArr.Contains(O.TradeType));
|
||||
}
|
||||
if (req.ExerciseDateStart > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.ExerciseDate >= req.ExerciseDateStart);
|
||||
}
|
||||
if (req.ExerciseDateEnd > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.ExerciseDate <= req.ExerciseDateEnd);
|
||||
}
|
||||
if (SplitParame(req.TradeStatusStr, out var tradeStatusArr))
|
||||
{
|
||||
query = query.Where(O => tradeStatusArr.Contains(O.TradeStatus));
|
||||
}
|
||||
if (SplitParame(req.AssetBookNameStr, out var assetBookNameArr))
|
||||
{
|
||||
query = query.Where(O => assetBookNameArr.Contains(O.AssetBookName));
|
||||
}
|
||||
if (SplitParame(req.TradeNumberStr, out var tradeNumberArr))
|
||||
{
|
||||
query = query.Where(O => tradeNumberArr.Contains(O.TradeNumber));
|
||||
}
|
||||
if (SplitParame(req.UnderlyingCodeStr, out var underlyingCodeArr))
|
||||
{
|
||||
query = query.Where(O => underlyingCodeArr.Contains(O.UnderlyingCode));
|
||||
}
|
||||
if (SplitParame(req.BuySellStr, out var buySellArr))
|
||||
{
|
||||
query = query.Where(O => buySellArr.Contains(O.BuySell));
|
||||
}
|
||||
if (SplitParame(req.OptionTypeStr, out var optionTypeArr))
|
||||
{
|
||||
query = query.Where(O => optionTypeArr.Contains(O.OptionType));
|
||||
}
|
||||
if (SplitParame(req.ExerciseModeStr, out var exerciseModeArr))
|
||||
{
|
||||
query = query.Where(O => exerciseModeArr.Contains(O.ExerciseMode));
|
||||
}
|
||||
if (SplitParame(req.ClientNameStr, out var clientNameArr))
|
||||
{
|
||||
query = query.Where(O => clientNameArr.Contains(O.ClientName));
|
||||
}
|
||||
if (SplitParame(req.TraderNameStr, out var traderNameArr))
|
||||
{
|
||||
query = query.Where(O => traderNameArr.Contains(O.TraderName));
|
||||
}
|
||||
if (req.StartDateStart > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.StartDate >= req.StartDateStart);
|
||||
}
|
||||
if (req.StartDateEnd > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.StartDate <= req.StartDateEnd);
|
||||
}
|
||||
results = query.ToList();
|
||||
tradeBLL.SetFieldsByTradeType(results);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogFactory.GetLogger<TradeQueryService>().Error(ex);
|
||||
throw;
|
||||
}
|
||||
return results ?? new List<trade>();
|
||||
}
|
||||
|
||||
public List<trade> SearchExchangeTradeList(TradeQueryReq req)
|
||||
{
|
||||
try
|
||||
{
|
||||
var query = from source in DbContext.ExchangeTrade
|
||||
join book in DbContext.assetunit on source.AssetBookId equals book.id
|
||||
join underlying in DbContext.underlying_manager on source.UnderlyingId equals underlying.id
|
||||
where source.IsValid
|
||||
select new InnerExchangeTradeDto
|
||||
{
|
||||
id = source.id,
|
||||
AssetBookName = book.Name,
|
||||
AssetId = source.AssetBookId,
|
||||
BuySell = source.TradeSide,
|
||||
OptionType = source.OptionType,
|
||||
Comments = source.Comments,
|
||||
Commission = source.Commission,
|
||||
CommissionType = source.CommissionType,
|
||||
CreateDate = source.CreateTime,
|
||||
ExchangeAccountCode = source.ExchangeAccountCode,
|
||||
ExchangeAccountId = source.ExchangeAccountId,
|
||||
ExchangeOptionCode = source.OptionCode,
|
||||
ExerciseMode = source.ExerciseMode,
|
||||
ExerciseDate = source.MaturityDate,
|
||||
Lots = source.TradeLots,
|
||||
Notional = source.Notional,
|
||||
OptDate = source.OptDate,
|
||||
OptId = source.OptId ?? 0,
|
||||
OptName = source.OptName,
|
||||
OriginalNotional = source.Notional,
|
||||
SpotPrice = source.TradeSinglePrice,
|
||||
TradeSinglePrice = source.TradeSinglePrice,
|
||||
StartDate = source.TradeDate,
|
||||
TradeNumber = source.TradeNumber,
|
||||
TradeDate = source.TradeDate,
|
||||
Strike = source.OptionStrike,
|
||||
TradeAmount = source.TradeAmount,
|
||||
TradePrice = source.TradeSinglePrice * source.Notional,
|
||||
TradeType = source.TradeType,
|
||||
UnderlyingAssetClass = underlying.UnderlyingType,
|
||||
UnderlyingAssetName = underlying.UnderlyingName,
|
||||
UnderlyingCode = source.UnderlyingCode,
|
||||
UnderlyingId = source.UnderlyingId,
|
||||
};
|
||||
if (req.TradeDateStart > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.TradeDate >= req.TradeDateStart);
|
||||
}
|
||||
if (req.TradeDateEnd > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.TradeDate <= req.TradeDateEnd);
|
||||
}
|
||||
if (SplitParame(req.TradeTypes, out var tradeTypeArr))
|
||||
{
|
||||
query = query.Where(O => tradeTypeArr.Contains(O.TradeType));
|
||||
}
|
||||
if (req.ExerciseDateStart > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.ExerciseDate >= req.ExerciseDateStart);
|
||||
}
|
||||
if (req.ExerciseDateEnd > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.ExerciseDate <= req.ExerciseDateEnd);
|
||||
}
|
||||
if (SplitParame(req.AssetBookNameStr, out var assetBookNameArr))
|
||||
{
|
||||
query = query.Where(O => assetBookNameArr.Contains(O.AssetBookName));
|
||||
}
|
||||
if (SplitParame(req.TradeNumberStr, out var tradeNumberArr))
|
||||
{
|
||||
query = query.Where(O => tradeNumberArr.Contains(O.TradeNumber));
|
||||
}
|
||||
if (SplitParame(req.UnderlyingCodeStr, out var underlyingCodeArr))
|
||||
{
|
||||
query = query.Where(O => underlyingCodeArr.Contains(O.UnderlyingCode));
|
||||
}
|
||||
if (SplitParame(req.BuySellStr, out var buySellArr))
|
||||
{
|
||||
query = query.Where(O => buySellArr.Contains(O.BuySell));
|
||||
}
|
||||
if (SplitParame(req.OptionTypeStr, out var optionTypeArr))
|
||||
{
|
||||
query = query.Where(O => optionTypeArr.Contains(O.OptionType));
|
||||
}
|
||||
if (SplitParame(req.ExerciseModeStr, out var exerciseModeArr))
|
||||
{
|
||||
query = query.Where(O => exerciseModeArr.Contains(O.ExerciseMode));
|
||||
}
|
||||
if (req.StartDateStart > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.StartDate >= req.StartDateStart);
|
||||
}
|
||||
if (req.StartDateEnd > InValidDate)
|
||||
{
|
||||
query = query.Where(O => O.StartDate <= req.StartDateEnd);
|
||||
}
|
||||
if (SplitParame(req.ExchangeOptionCodeStr, out var exchangeOptionCodeArr))
|
||||
{
|
||||
query = query.Where(O => exchangeOptionCodeArr.Contains(O.ExchangeOptionCode));
|
||||
}
|
||||
|
||||
return query.ToList().Select(O =>
|
||||
{
|
||||
var td = new InnerTradeDto();
|
||||
YLAutoMapper.Map<OtcTradeBase, OtcTradeBase>(O, td);
|
||||
td.ExchangeAccountId = O.ExchangeAccountId;
|
||||
td.ExchangeAccountCode = O.ExchangeAccountCode;
|
||||
td.Commission = O.Commission;
|
||||
td.CommissionType = O.CommissionType;
|
||||
return (trade)td;
|
||||
}).ToList();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogFactory.GetLogger<TradeQueryService>().Error(ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
class InnerExchangeTradeDto : OtcTradeBase
|
||||
{
|
||||
private string exchangeAccountCode;
|
||||
|
||||
/// <summary>
|
||||
/// 对冲账户
|
||||
/// </summary>
|
||||
public int? ExchangeAccountId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 对冲账户
|
||||
/// </summary>
|
||||
public string ExchangeAccountCode
|
||||
{
|
||||
get => exchangeAccountCode;
|
||||
set => exchangeAccountCode = value ?? "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 手续费
|
||||
/// </summary>
|
||||
public double? Commission { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 手续费计算方式
|
||||
/// </summary>
|
||||
public CommissionType? CommissionType { get; set; }
|
||||
}
|
||||
|
||||
[NotMapped]
|
||||
class InnerTradeDto : trade
|
||||
{
|
||||
/// <summary>
|
||||
/// 对冲账户
|
||||
/// </summary>
|
||||
public int? ExchangeAccountId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 对冲账户
|
||||
/// </summary>
|
||||
public string ExchangeAccountCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 手续费
|
||||
/// </summary>
|
||||
public double? Commission { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 手续费计算方式
|
||||
/// </summary>
|
||||
public CommissionType? CommissionType { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user