654 lines
20 KiB
C#
654 lines
20 KiB
C#
using BaseOUDAL;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations.Schema;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using YLErp.Commons;
|
|
using YLErp.Models.Tag;
|
|
|
|
namespace YLErp.Model
|
|
{
|
|
/// <summary>
|
|
/// 财务汇总
|
|
/// </summary>
|
|
public abstract class FinancialSummaryModelBase
|
|
{
|
|
/// <summary>
|
|
/// 交易份额
|
|
/// <para>未完结:本期末持仓数量</para>
|
|
/// <para>已完结:本次交易数量</para>
|
|
/// </summary>
|
|
public double? Notional { get; set; }
|
|
/// <summary>
|
|
/// 成交日
|
|
/// </summary>
|
|
public DateTime? TradeDate { get; set; }
|
|
/// <summary>
|
|
/// 清算日期
|
|
/// </summary>
|
|
public DateTime? ClearDate { get; set; }
|
|
/// <summary>
|
|
/// 买卖方向-交易所
|
|
/// </summary>
|
|
public string TradeDirection { get; set; }
|
|
/// <summary>
|
|
/// 标的代码
|
|
/// </summary>
|
|
public string UnderlyingCode { get; set; }
|
|
/// <summary>
|
|
/// 名义本金(期初价格)
|
|
/// </summary>
|
|
public double? StockEqvNotional { get; set; }
|
|
/// <summary>
|
|
/// 名义本金(执行价格)
|
|
/// </summary>
|
|
public double? StockEqvNotional2 { get; set; }
|
|
/// <summary>
|
|
/// 名义本金(期初价格:合成标的时取最大价格)
|
|
/// </summary>
|
|
public double? StockEqvNotional3 { get; set; }
|
|
/// <summary>
|
|
/// 交易总额
|
|
/// </summary>
|
|
public double? TradePrice { get; set; }
|
|
/// <summary>
|
|
/// 清算金额
|
|
/// </summary>
|
|
public double? ClearPrice { get; set; }
|
|
/// <summary>
|
|
/// 手续费
|
|
/// </summary>
|
|
public double? ServiceFee { get; set; }
|
|
|
|
/// <summary>
|
|
/// 存续名义本金
|
|
/// </summary>
|
|
public double? SurvivingNominalPrincipal { get; internal set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 财务汇总-场外期权
|
|
/// <para>含远期和掉期</para>
|
|
/// </summary>
|
|
public class FinancialSummaryOptionModel : FinancialSummaryModelBase
|
|
{
|
|
/// <summary>
|
|
/// 上期期末日期
|
|
/// </summary>
|
|
public DateTime PreLastDate { get; set; }
|
|
/// <summary>
|
|
/// 客户Id
|
|
/// </summary>
|
|
public int ClientId { get; set; }
|
|
|
|
/// <summary>
|
|
/// 对应的交易编号
|
|
/// </summary>
|
|
public int TradeId { get; set; }
|
|
|
|
public double? NewTotalPnl { get; set; }
|
|
/// <summary>
|
|
/// 主交易编号
|
|
/// </summary>
|
|
public int ParentTradeId { get; set; }
|
|
/// <summary>
|
|
/// 对应的开仓时资金记录编号
|
|
/// </summary>
|
|
public int TradeOpenCashId { get; set; }
|
|
/// <summary>
|
|
/// 对应的资金记录编号
|
|
/// </summary>
|
|
public int TradeCloseCashId { get; set; }
|
|
/// <summary>
|
|
/// 合约乘数
|
|
/// </summary>
|
|
public double ContractSize { get; set; }
|
|
/// <summary>
|
|
/// 成交手数
|
|
/// </summary>
|
|
public double OriginalLots { get; set; }
|
|
/// <summary>
|
|
/// 交易手数
|
|
/// </summary>
|
|
public double Lots { get; set; }
|
|
/// <summary>
|
|
/// 持仓手数
|
|
/// </summary>
|
|
public double PositionLots { get; set; }
|
|
/// <summary>
|
|
/// 成交份额
|
|
/// </summary>
|
|
public double OriginalNotional { get; set; }
|
|
/// <summary>
|
|
/// 成交数量
|
|
/// </summary>
|
|
public double OriginalAmount { get; set; }
|
|
/// <summary>
|
|
/// 持仓数量
|
|
/// </summary>
|
|
public double PositionAmount { get; set; }
|
|
/// <summary>
|
|
/// 看涨看跌
|
|
/// </summary>
|
|
public string OptionType { get; set; }
|
|
/// <summary>
|
|
/// 客户名称-全称
|
|
/// </summary>
|
|
public string ClientFullName { get; set; }
|
|
/// <summary>
|
|
/// 交易编号
|
|
/// </summary>
|
|
public string TradeNumber { get; set; }
|
|
/// <summary>
|
|
/// 确认书编号
|
|
/// </summary>
|
|
public string ContractCode { get; set; }
|
|
/// <summary>
|
|
/// 结算确认书编号
|
|
/// </summary>
|
|
public string SettlementCode { get; set; }
|
|
/// <summary>
|
|
/// 状态
|
|
/// <para>True:完结</para>
|
|
/// <para>False:未完结</para>
|
|
/// </summary>
|
|
public bool Status { get; set; }
|
|
public string StatusStr { get; set; }
|
|
/// <summary>
|
|
/// 客户名称-简称
|
|
/// </summary>
|
|
public string ClientShortName { get; set; }
|
|
/// <summary>
|
|
/// 到期日
|
|
/// </summary>
|
|
public DateTime? ExerciseDate { get; set; }
|
|
/// <summary>
|
|
/// 行权方式
|
|
/// </summary>
|
|
public string ExerciseMode { get; set; }
|
|
/// <summary>
|
|
/// 收益总额
|
|
/// <para>
|
|
/// 已完结:交易总额 + 清算金额
|
|
/// 未完结:Null
|
|
/// </para>
|
|
/// </summary>
|
|
public double? ConfirmPnl { get { return Status ? TradePrice.FormatValue(2) + ClearPrice.FormatValue(2) : null; } }
|
|
public double? ConfirmTotlePnl { get; set; }
|
|
/// <summary>
|
|
/// 上期期末市值
|
|
/// </summary>
|
|
public double? LastPv { get; set; }
|
|
|
|
private double? _lastTotalPnl = null;
|
|
/// <summary>
|
|
/// 上期期末累计浮动盈亏
|
|
/// <para>上期期末市值=0:0</para>
|
|
/// <para>上期期末市值!=0:
|
|
/// 卖出:交易价格-上期期末市值
|
|
/// 非卖出:交易价格+上期期末市值
|
|
///
|
|
/// 3.10版本财务汇总页面场外期权和远期交易中该字段算法改为Eod_Trade_Position表里的AccruedTotalPnl字段
|
|
/// </para>
|
|
/// </summary>
|
|
public double? LastTotalPnl
|
|
{
|
|
get
|
|
{
|
|
if ((_lastTotalPnl == null && !PS.Config.Is广发商贸) || (PS.Config.Is广发商贸 && TradeDate <= PreLastDate))
|
|
{ _lastTotalPnl = TradePrice.FormatValue(2) + LastPv.FormatValue(2); }
|
|
return _lastTotalPnl;
|
|
}
|
|
set => _lastTotalPnl = value;
|
|
}
|
|
/// <summary>
|
|
/// 本期期末市值
|
|
/// </summary>
|
|
public double? Pv { get; set; }
|
|
public int CountRatio { get; set; }
|
|
|
|
public double? _totalPnl = null;
|
|
|
|
|
|
/// <summary>
|
|
/// 本期期末累计浮动盈亏
|
|
/// <para>本期期末市值=0:0</para>
|
|
/// <para>本期期末市值!=0:
|
|
/// 卖出:交易价格-本期期末市值
|
|
/// 非卖出:交易价格+本期期末市值
|
|
///
|
|
/// 3.10版本财务汇总页面场外期权和远期交易中该字段算法改为Eod_Trade_Position表里的AccruedTotalPnl字段
|
|
/// </para>
|
|
/// </summary>
|
|
public double? TotalPnl
|
|
{
|
|
get
|
|
{
|
|
if (_totalPnl == null)
|
|
{
|
|
_totalPnl = TradePrice.FormatValue(2) + Pv.FormatValue(2);
|
|
}
|
|
return Status ? 0 : _totalPnl;
|
|
}
|
|
set => _ = value;
|
|
}
|
|
/// <summary>
|
|
/// 本期浮动盈亏
|
|
/// <para>
|
|
/// 未完结:本期期末累计浮动盈亏 - 上期期末累计浮动盈亏
|
|
/// 已完结-光子:本期期末累计浮动盈亏 - 上期期末累计浮动盈亏
|
|
/// 已完结:交易总额 + 清算金额 - 上期期末累计浮动盈亏
|
|
/// </para>
|
|
/// </summary>
|
|
public double? Pnl
|
|
{
|
|
get
|
|
{
|
|
if (!Status || PS.Config.Is光大光子)//光子已完结和未完结计算逻辑一致;
|
|
{
|
|
return TotalPnl.FormatValue(2) - LastTotalPnl.FormatValue(2);
|
|
}
|
|
else
|
|
{
|
|
return ConfirmPnl.FormatValue(2) - LastTotalPnl.FormatValue(2);
|
|
}
|
|
}
|
|
set => _ = value;
|
|
}
|
|
public double? GF_Pnl { get; set; }
|
|
/// <summary>
|
|
/// 期货盈亏
|
|
/// </summary>
|
|
public double? FuturePnl { get; set; }
|
|
/// <summary>
|
|
/// 费后总盈亏
|
|
/// <para>
|
|
/// 已完结:收益总额 + 期货盈亏 - 手续费
|
|
/// 未完结:本期期末累计浮动盈亏 + 期货盈亏 - 手续费
|
|
/// </para>
|
|
/// </summary>
|
|
public double? TotalPnlAfterExpense {
|
|
get { return Status ? ConfirmPnl.FormatValue(2) + FuturePnl.FormatValue(2) - ServiceFee.FormatValue(2) : TotalPnl.FormatValue(2) + FuturePnl.FormatValue(2) - ServiceFee.FormatValue(2); }
|
|
set => _ = value;
|
|
}
|
|
/// <summary>
|
|
/// 可用资金(财务)
|
|
/// </summary>
|
|
public double AvailableCash { get; set; }
|
|
/// <summary>
|
|
/// 期末结存(财务)
|
|
/// </summary>
|
|
public double EndBalance { get; set; }
|
|
/// <summary>
|
|
/// 交易确认书状态
|
|
/// </summary>
|
|
public string TradeConfirmFileStatus { get; set; }
|
|
/// <summary>
|
|
/// 清算确认书状态
|
|
/// </summary>
|
|
public string ClearConfirmFileStatus { get; set; }
|
|
/// <summary>
|
|
/// 财务入账
|
|
/// </summary>
|
|
public double? FinancialEntry { get; set; }
|
|
/// <summary>
|
|
/// 交易确认日期-财务
|
|
/// </summary>
|
|
public DateTime? TradeConfirmDate { get; set; }
|
|
/// <summary>
|
|
/// 了结确认日期
|
|
/// </summary>
|
|
public DateTime? ClearConfirmDate { get; set; }
|
|
/// <summary>
|
|
/// 结构类型
|
|
/// </summary>
|
|
public string StructureType { get; set; }
|
|
|
|
/// <summary>
|
|
/// 交易数量
|
|
/// </summary>
|
|
public double TradeAmount { get; set; }
|
|
|
|
public string UnderlyingInstrumentType{ get; set; }
|
|
|
|
public string TradeType { get; set; }
|
|
public string VarietyCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// 客户标签
|
|
/// </summary>
|
|
[NotMapped]
|
|
public List<TagDto> Tags { get; set; }
|
|
|
|
/// <summary>
|
|
/// 客户标签
|
|
/// </summary>
|
|
[NotMapped]
|
|
public string OutputTags { get; set; }
|
|
|
|
/// <summary>
|
|
/// 簿记账户
|
|
/// </summary>
|
|
[NotMapped]
|
|
public string AssetBookName { get; set; }
|
|
/// <summary>
|
|
/// 簿记账户id
|
|
/// </summary>
|
|
[NotMapped]
|
|
public int AssetId { get; set; }
|
|
public double DailyPnL { get; internal set; }
|
|
public string ExchangeCode { get; internal set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 财务汇总-场内期权
|
|
/// </summary>
|
|
public class FinancialSummaryExchangeModel : FinancialSummaryModelBase
|
|
{
|
|
/// <summary>
|
|
/// 交易所代码
|
|
/// </summary>
|
|
public string ExchangeOptionCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// 期权类型
|
|
/// </summary>
|
|
public string OptionType { get; set; }
|
|
|
|
/// <summary>
|
|
/// 行权价
|
|
/// </summary>
|
|
public double? Strike { get; set; }
|
|
|
|
/// <summary>
|
|
/// 权利金单价
|
|
/// </summary>
|
|
public double? TradeSinglePrice
|
|
{
|
|
get
|
|
{
|
|
double? result = null;
|
|
if (TradePrice != null && TradeUnit != null)
|
|
{
|
|
result = Math.Abs((TradePrice.FormatValue(2) / TradeUnit.FormatValue(2) / Notional.FormatValue(2)) ?? 0);
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 吨/手
|
|
/// </summary>
|
|
public double? TradeUnit { get; set; }
|
|
/// <summary>
|
|
/// 名义本金
|
|
/// </summary>
|
|
public new double? StockEqvNotional { get { return Strike.FormatValue(2) * Notional.FormatValue(2) * TradeUnit.FormatValue(2); } }
|
|
|
|
/// <summary>
|
|
/// 上期末日期
|
|
/// </summary>
|
|
public DateTime PreLastDate { get; set; }
|
|
|
|
/// <summary>
|
|
/// 上期期末报价
|
|
/// </summary>
|
|
public double? PrePotionLastPrice { get; set; }
|
|
|
|
/// <summary>
|
|
/// 上期浮动盈亏
|
|
/// </summary>
|
|
public double? PrePotionLastPnl
|
|
{
|
|
get
|
|
{
|
|
if (TradeDate > PreLastDate || !PrePotionLastPrice.HasValue)
|
|
{ return null; }
|
|
return (PrePotionLastPrice.FormatValue(2) - TradeSinglePrice.FormatValue(4)) * Notional.FormatValue(2) * TradeUnit.FormatValue(2);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 本期末日期
|
|
/// </summary>
|
|
public DateTime PreDate { get; set; }
|
|
|
|
/// <summary>
|
|
/// 本期期末报价
|
|
/// </summary>
|
|
public double? PrePotionEndPrice { get; set; }
|
|
|
|
/// <summary>
|
|
/// 本期浮动盈亏
|
|
/// </summary>
|
|
public double? PrePotionEndPnl
|
|
{
|
|
get
|
|
{
|
|
if (TradeDate > PreDate || !PrePotionEndPrice.HasValue)
|
|
{ return null; }
|
|
double? price = TradeDate <= PreLastDate ? PrePotionLastPrice : TradeSinglePrice;
|
|
return (PrePotionEndPrice.FormatValue(2) - price.FormatValue(4)) * Notional.FormatValue(2) * TradeUnit.FormatValue(2);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 平仓买卖方向
|
|
/// </summary>
|
|
public string UnwindTradeDirection { get; set; }
|
|
|
|
/// <summary>
|
|
/// 平仓权利金单价
|
|
/// </summary>
|
|
public double? UnwindTradeSinglePrice { get { return ClearPrice.FormatValue(2) / UnwindNotional.FormatValue(2) / TradeUnit.FormatValue(2); } }
|
|
|
|
/// <summary>
|
|
/// 平仓成交量
|
|
/// </summary>
|
|
public double? UnwindNotional { get; set; }
|
|
|
|
/// <summary>
|
|
/// 平仓手续费
|
|
/// </summary>
|
|
public double? UnwindServiceFee { get; set; }
|
|
|
|
/// <summary>
|
|
/// 平仓对应初始权利金
|
|
/// </summary>
|
|
public double? UnwindOriginalTradePrice { get { return UnwindNotional.FormatValue(2) * TradeSinglePrice.FormatValue(4) * TradeUnit.FormatValue(2); } }
|
|
|
|
/// <summary>
|
|
/// 平仓本期浮动盈亏
|
|
/// </summary>
|
|
public double? UnwindEndPnl
|
|
{
|
|
get
|
|
{
|
|
double? price = TradeDate <= PreDate ? PrePotionEndPrice : TradeSinglePrice;
|
|
return (UnwindTradeSinglePrice.FormatValue(2) - price.FormatValue(4)) * UnwindNotional.FormatValue(2) * TradeUnit.FormatValue(2);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 平仓盈亏
|
|
/// </summary>
|
|
public double? UnwindPnl { get { return ClearPrice.FormatValue(2) - UnwindOriginalTradePrice.FormatValue(2); } }
|
|
|
|
/// <summary>
|
|
/// 期末持仓期末结算价
|
|
/// </summary>
|
|
public double? PositionEndSettlementPrice { get; set; }
|
|
|
|
/// <summary>
|
|
/// 持仓数(手)
|
|
/// </summary>
|
|
public double? PositionNotional { get; set; }
|
|
/// <summary>
|
|
/// 持仓期末市值
|
|
/// </summary>
|
|
public double? PositionEndPv { get { return PositionEndSettlementPrice.FormatValue(2) * PositionNotional.FormatValue(2) * TradeUnit.FormatValue(2); } }
|
|
|
|
/// <summary>
|
|
/// 持仓对应初始权利金
|
|
/// </summary>
|
|
public double? PositionOriginalTradePrice { get { return PositionNotional.FormatValue(2) * TradeUnit.FormatValue(2) * TradeSinglePrice.FormatValue(4); } }
|
|
|
|
/// <summary>
|
|
/// 持仓公允价值变动
|
|
/// </summary>
|
|
public double? PositionPvOffset
|
|
{
|
|
get
|
|
{
|
|
double? price = TradeDate <= PreDate ? PrePotionEndPrice : TradeSinglePrice;
|
|
return (PositionEndSettlementPrice.FormatValue(2) - price.FormatValue(4)) * PositionNotional.FormatValue(2) * TradeUnit.FormatValue(2);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 持仓名义本金
|
|
/// </summary>
|
|
public double? PositionStockEqvNotional { get { return Strike.FormatValue(2) * PositionNotional.FormatValue(2) * TradeUnit.FormatValue(2); } }
|
|
|
|
/// <summary>
|
|
/// 簿记账户
|
|
/// </summary>
|
|
public string AssetBookName { get; set; }
|
|
}
|
|
|
|
public class FinancialSummaryModelReq : BaseSearchReq
|
|
{
|
|
/// <summary>
|
|
/// 本期范围-开始
|
|
/// </summary>
|
|
public DateTime CurrentPeriodDateStart { get; set; }
|
|
/// <summary>
|
|
/// 本期范围-结束
|
|
/// </summary>
|
|
public DateTime CurrentPeriodDateEnd { get; set; }
|
|
|
|
public string SummaryType { get; set; }
|
|
|
|
public string ClientIds { get; set; }
|
|
/// <summary>
|
|
/// 客户Id
|
|
/// </summary>
|
|
public List<int> ClientIdList
|
|
{
|
|
get
|
|
{
|
|
if (ClientIds == null || !Regex.IsMatch(ClientIds, @"^(\d+,?)+$"))
|
|
{ return new List<int>(); }
|
|
List<int> list = Array.ConvertAll(ClientIds.Split(','), O => int.Parse(O)).ToList();
|
|
return list;
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 交易日期
|
|
/// </summary>
|
|
public string TradeNumber { get; set; }
|
|
/// <summary>
|
|
/// 确认书编号
|
|
/// </summary>
|
|
public string ContractCode { get; set; }
|
|
/// <summary>
|
|
/// 交易日期-开始
|
|
/// </summary>
|
|
public DateTime TradeDateStart { get; set; }
|
|
/// <summary>
|
|
/// 交易日期-结束
|
|
/// </summary>
|
|
public DateTime TradeDateEnd { get; set; }
|
|
/// <summary>
|
|
/// 到期日-开始
|
|
/// </summary>
|
|
public DateTime ExerciseDateStart { get; set; }
|
|
/// <summary>
|
|
/// 到期日-结束
|
|
/// </summary>
|
|
public DateTime ExerciseDateEnd { get; set; }
|
|
/// <summary>
|
|
/// 清算日期-开始
|
|
/// </summary>
|
|
public DateTime ClearDateStart { get; set; }
|
|
/// <summary>
|
|
/// 清算日期-结束
|
|
/// </summary>
|
|
public DateTime ClearDateEnd { get; set; }
|
|
/// <summary>
|
|
/// 交易确认日期-开始
|
|
/// </summary>
|
|
public DateTime TradeConfirmDateStart { get; set; }
|
|
/// <summary>
|
|
/// 交易确认日期-结束
|
|
/// </summary>
|
|
public DateTime TradeConfirmDateEnd { get; set; }
|
|
/// <summary>
|
|
/// 了结确认日期-开始
|
|
/// </summary>
|
|
public DateTime ClearConfirmDateStart { get; set; }
|
|
/// <summary>
|
|
/// 了结确认日期-结束
|
|
/// </summary>
|
|
public DateTime ClearConfirmDateEnd { get; set; }
|
|
/// <summary>
|
|
/// 期权类型
|
|
/// </summary>
|
|
public List<string> TradeTypeList { get; set; }
|
|
/// <summary>
|
|
/// 上期日期1
|
|
/// </summary>
|
|
public DateTime PreLastPartDate { get; set; }
|
|
/// <summary>
|
|
/// 上期日期2
|
|
/// </summary>
|
|
public DateTime LastPartDate { get; set; }
|
|
/// <summary>
|
|
/// 交易状态
|
|
/// </summary>
|
|
public string TradeStatus { get; set; }
|
|
/// <summary>
|
|
/// 开仓数据
|
|
/// <para>查询开仓数据时,一个交易编号只显示一条数据;</para>
|
|
/// </summary>
|
|
public bool IsOpen { get; set; }
|
|
|
|
public List<int> UserAssets { get; set; }
|
|
/// <summary>
|
|
/// 簿记账户组筛选
|
|
/// </summary>
|
|
public List<int> AssetIdGroupList { get; set; }
|
|
|
|
/// <summary>
|
|
/// 簿记账户信息
|
|
/// </summary>
|
|
public List<int> BookIds { get; set; }
|
|
|
|
public List<int> UserClients { get; set; }
|
|
|
|
public List<int> CurUserTradeIds { get; set; }
|
|
|
|
/// <summary>
|
|
/// 标签值
|
|
/// </summary>
|
|
public List<int> TagIds { get; set; }
|
|
|
|
/// <summary>
|
|
/// 客户标签值
|
|
/// </summary>
|
|
public List<int> ClientTagIds { get; set; }
|
|
|
|
/// <summary>
|
|
/// 品种代码
|
|
/// </summary>
|
|
public string VarietyCode { get; set; }
|
|
/// <summary>
|
|
/// 品种名称
|
|
/// </summary>
|
|
public string VarietyName { get; set; }
|
|
}
|
|
}
|