173 lines
5.5 KiB
C#
173 lines
5.5 KiB
C#
using YLErp.DBModels.Enums;
|
|
|
|
namespace YLErp.Modules.ExchangeTradeModule
|
|
{
|
|
/// <summary>
|
|
/// 对冲交易API服务
|
|
/// </summary>
|
|
public class ExchangeTradeApiService : ExchangeTradeSaveServiceBase
|
|
{
|
|
public ExchangeTradeApiService(YLBaseService baseService) : base(baseService)
|
|
{
|
|
|
|
}
|
|
|
|
public ExchangeTradeApiService(OptUserInfo userInfo) : base(userInfo)
|
|
{
|
|
|
|
}
|
|
|
|
public ExchangeTrade Save(ExchangeTradeApiReq req, string tradeSource, out bool isAddNew)
|
|
{
|
|
var reqTrade = PrepareReqTrad(req, tradeSource);
|
|
|
|
var dbTrade = DbContext.ExchangeTrade.FirstOrDefault(x => x.TradeDate == req.TradeDate && x.TradeNumber == req.TradeNumber && x.IsValid);
|
|
|
|
var canUpdate = dbTrade != null
|
|
&& req.TradeType == dbTrade.TradeType
|
|
&& req.TradeSide == dbTrade.TradeSide
|
|
&& req.ExchangeAccountCode.Equals(dbTrade.ExchangeAccountCode, StringComparison.OrdinalIgnoreCase)
|
|
&& (dbTrade.TradeType == "场内期权"
|
|
? req.OptionCode.Equals(dbTrade.OptionCode)
|
|
: req.UnderlyingCode.Equals(dbTrade.UnderlyingCode, StringComparison.OrdinalIgnoreCase));
|
|
|
|
SaveExchangeTradePosition(reqTrade, canUpdate ? dbTrade : null);
|
|
|
|
if (canUpdate)
|
|
{
|
|
dbTrade.UnderlyingCode = reqTrade.UnderlyingCode;
|
|
dbTrade.TradeSinglePrice = reqTrade.TradeSinglePrice;
|
|
|
|
dbTrade.Notional = reqTrade.Notional;
|
|
dbTrade.TradeAmount = reqTrade.TradeAmount;
|
|
dbTrade.TradeLots = reqTrade.TradeLots;
|
|
|
|
dbTrade.TraderId = reqTrade.TraderId;
|
|
dbTrade.TraderName = reqTrade.TraderName;
|
|
|
|
dbTrade.UnderlyingId = reqTrade.UnderlyingId;
|
|
dbTrade.MaturityDate = reqTrade.MaturityDate;
|
|
|
|
dbTrade.OptionStrike = reqTrade.OptionStrike;
|
|
dbTrade.OptionType = reqTrade.OptionType;
|
|
dbTrade.ExerciseMode = reqTrade.ExerciseMode;
|
|
|
|
dbTrade.AssetBookId = reqTrade.AssetBookId;
|
|
dbTrade.ExchangeAccountId = reqTrade.ExchangeAccountId;
|
|
|
|
dbTrade.InstrumentType = reqTrade.InstrumentType;
|
|
|
|
dbTrade.OptDate = DateTime.Now;
|
|
}
|
|
else
|
|
{
|
|
DbContext.ExchangeTrade.Add(dbTrade = reqTrade);
|
|
}
|
|
|
|
isAddNew = !canUpdate;
|
|
|
|
DbContext.SaveChanges();
|
|
|
|
return dbTrade;
|
|
}
|
|
|
|
//将req转换交易对象
|
|
private ExchangeTrade PrepareReqTrad(ExchangeTradeApiReq req, string tradeSource)
|
|
{
|
|
req.TradeType = CheckTradeType(req.TradeType);
|
|
|
|
if (req.TradeDate == DateTime.MinValue)
|
|
{
|
|
throw new ServiceException("交易日期 必须填写");
|
|
}
|
|
|
|
CheckTradeSide(req.TradeSide);
|
|
|
|
if (string.IsNullOrWhiteSpace(req.AssetBookName))
|
|
{
|
|
throw new ServiceException("簿记账户 必须填写");
|
|
}
|
|
|
|
//if (string.IsNullOrWhiteSpace(req.ExchangeAccountCode))
|
|
//{
|
|
// throw new ServiceException("对冲账户 必须填写");
|
|
//}
|
|
|
|
var td = new ExchangeTrade
|
|
{
|
|
IsValid = true,
|
|
|
|
TradeType = req.TradeType,
|
|
TradeDate = req.TradeDate,
|
|
TradeNumber = req.TradeNumber,
|
|
TradeSide = req.TradeSide,
|
|
TradeSinglePrice = req.TradeSinglePrice,
|
|
UnderlyingCode = req.UnderlyingCode,
|
|
ExchangeAccountCode = req.ExchangeAccountCode,
|
|
TradeSource = tradeSource,
|
|
|
|
Commission = 0,
|
|
CommissionType = CommissionType.系统计算,
|
|
|
|
OptId = 0,
|
|
OptDate = DateTime.Now,
|
|
OptName = UserName,
|
|
CreateTime = DateTime.Now,
|
|
|
|
Notional = 0,
|
|
TradeAmount = 0,
|
|
TradeLots = 0,
|
|
|
|
TraderId = 0,
|
|
TraderName = UserName,
|
|
|
|
UnderlyingId = 0,
|
|
MaturityDate = null,
|
|
|
|
OptionCode = null,
|
|
OptionStrike = null,
|
|
OptionType = null,
|
|
ExerciseMode = null,
|
|
|
|
AssetBookId = 0,
|
|
ExchangeAccountId = 0,
|
|
|
|
InstrumentType = null,
|
|
Comments = null,
|
|
};
|
|
|
|
var contractSize = 0d;
|
|
|
|
//场内期权
|
|
if (td.TradeType == "场内期权")
|
|
{
|
|
SetTradeOptionInfo(td, req.OptionCode, out var option);
|
|
|
|
contractSize = option.ContractSize;
|
|
req.UnderlyingCode = option.UnderlyingCode;
|
|
}
|
|
|
|
//标的信息
|
|
SetTradeUnderlyingInfo(td, req.UnderlyingCode, out var um);
|
|
|
|
//数量信息
|
|
SetTradeLotsInfo(td, req.TradeLots, contractSize < 1 ? um.ContractSize : contractSize, um.UnderlyingTypeId);
|
|
|
|
//簿记账户和对冲账户
|
|
SetAssetAndExchangeAccount(td, req.AssetBookName, req.ExchangeAccountCode, um.UnderlyingTypeId);
|
|
|
|
//交易员信息
|
|
SetTraderInfo(td, req.TraderName);
|
|
|
|
//交易手续费
|
|
if (req.Commission.HasValue)
|
|
{
|
|
td.Commission = req.Commission.Value;
|
|
td.CommissionType = CommissionType.手动录入;
|
|
}
|
|
|
|
return td;
|
|
}
|
|
}
|
|
}
|