#EQD-6947 国联民生-保证金计算整体改造-实现第一版盯市规则(不支持同一客户多部门)(1)保证金规则的设置 阶段2 新增字段 BondTerm,调整互换交易模板绑定逻辑
This commit is contained in:
@@ -207,5 +207,11 @@ namespace YLErp.DBModels
|
||||
/// 发生追保时系数
|
||||
/// </summary>
|
||||
public double CoefficientFactor { get; set; } = 1.05;
|
||||
|
||||
/// <summary>
|
||||
/// 利率债期限档(区间追保结构使用,取值为空=全部 或 ConsMarginTerm 四档:<5y / 5y-10y / 10y-30y / >30y)。
|
||||
/// 存于 SpanConfigJson 文本列,无需 DDL。
|
||||
/// </summary>
|
||||
public string BondTerm { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using YLErp.Core.Helpers;
|
||||
using YLErp.DBModels;
|
||||
using YLErp.DBModels.Consts;
|
||||
using YLErp.DBModels.Enums;
|
||||
using YLErp.Modules.MarginModule;
|
||||
using YLErp.Modules.UnderlyingModule;
|
||||
using YLErp.Plugins.TradeDocGenerator;
|
||||
using YLErp.Plugins.TradeDocGenerator.Abstracts;
|
||||
@@ -253,8 +254,15 @@ namespace YLErp.Plugins.GuoLian.DocumentGenerator
|
||||
: swapRatePosition != null ? "" : "0.0000";
|
||||
|
||||
// 获取客户适用的保证金率
|
||||
var clientMarginRate = UnderlyingHelper.GetApplicableMarginRate(
|
||||
client.id, swapPosition.UnderlyingCode, trade.TradeDate ?? DateTime.Now);
|
||||
//保证金模板V2迁移:优先按交易绑定的预付金模板V2(区间追保结构)取 初始率x/维持率y;
|
||||
//取不到(未绑定/模板无效/无匹配明细)时回退旧的互换预付金率维护(client_margin_config)链路
|
||||
var templateRate = MarginTemplateV2RateHelper.GetTradeMarginRate(
|
||||
trade.id, swapPosition.UnderlyingCode, swapPosition.UnderlyingInstrumentType, trade.TradeDate ?? DateTime.Now);
|
||||
|
||||
var clientMarginRate = templateRate != null
|
||||
? new client_margin_detail { init_rate = templateRate.InitRate ?? 0, maintain_rate = templateRate.MaintainRate ?? 0 }
|
||||
: UnderlyingHelper.GetApplicableMarginRate(
|
||||
client.id, swapPosition.UnderlyingCode, trade.TradeDate ?? DateTime.Now);
|
||||
|
||||
if (clientMarginRate != null)
|
||||
{
|
||||
|
||||
@@ -6,6 +6,7 @@ using YLErp.Model.Enum;
|
||||
using YLErp.Modules;
|
||||
using YLErp.Modules.CalculationModule;
|
||||
using YLErp.Modules.DataProviderModule;
|
||||
using YLErp.Modules.MarginModule;
|
||||
using YLErp.Modules.TradeModule;
|
||||
|
||||
namespace YLErp.BLL.MarginCalculation
|
||||
@@ -365,9 +366,97 @@ namespace YLErp.BLL.MarginCalculation
|
||||
}
|
||||
|
||||
//收益互换预付金计算
|
||||
//预付金模板V2迁移:绑定了模板的互换交易按模板规则计算——无预付金=0;区间追保结构=名义本金×x(初始)/名义本金×y(持仓),
|
||||
//x/y 由 MarginTemplateV2RateHelper 按 期限档+资产类型 匹配明细取得。未绑定或绑定其他规则的互换交易维持现状(不产出 trade_span)。
|
||||
private static List<trade_span> SwapTradeMarginCalculation(RunMarginCalculationReq req)
|
||||
{
|
||||
var result = new List<trade_span>();
|
||||
|
||||
var swapTradeIds = req.tradeList.Where(t => t.ParentTradeId == 0 && t.id > 0).Select(t => t.id).ToList();
|
||||
if (swapTradeIds.Count == 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
using (var db = new YLContext())
|
||||
{
|
||||
var bindings = db.trade_margin_template.AsNoTracking()
|
||||
.Where(x => swapTradeIds.Contains(x.TradeId) && x.ValueDate <= req.settleDate)
|
||||
.ToList();
|
||||
if (bindings.Count == 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var templateIds = bindings.Select(x => x.MarginTemplateId).Distinct().ToList();
|
||||
var templates = db.margin_template_v2.AsNoTracking()
|
||||
.Where(x => templateIds.Contains(x.id) && x.IsValid)
|
||||
.ToList();
|
||||
|
||||
foreach (var trade in req.tradeList)
|
||||
{
|
||||
//剔除多空组合子交易
|
||||
if (trade.ParentTradeId > 0 || trade.id <= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var binding = bindings.Where(x => x.TradeId == trade.id).OrderByDescending(x => x.ValueDate).FirstOrDefault();
|
||||
var template = binding == null ? null : templates.FirstOrDefault(x => x.id == binding.MarginTemplateId);
|
||||
if (template == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
double rate;
|
||||
if (template.RuleType == (int)MarginRuleTypeEnum.无预付金)
|
||||
{
|
||||
rate = 0;
|
||||
}
|
||||
else if (template.RuleType == (int)MarginRuleTypeEnum.区间追保结构)
|
||||
{
|
||||
var rateResult = MarginTemplateV2RateHelper.GetTradeMarginRate(trade.id, trade.UnderlyingCode, trade.UnderlyingInstrumentType, req.settleDate, db);
|
||||
if (rateResult == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
//初始预付金=名义本金×x;持仓预付金=名义本金×y
|
||||
rate = (double)(req.CalcMarginType == CalcMarginTypeEnum.InitialMargin
|
||||
? rateResult.InitRate ?? 0m
|
||||
: rateResult.MaintainRate ?? 0m);
|
||||
}
|
||||
else
|
||||
{
|
||||
//其他规则不在默认引擎支持范围,显式跳过
|
||||
continue;
|
||||
}
|
||||
|
||||
var margin = rate * trade.StockEqvNotional;
|
||||
result.Add(new trade_span()
|
||||
{
|
||||
TradeId = trade.id,
|
||||
OptDate = DateTime.Now,
|
||||
OptId = req.userId,
|
||||
OptName = req.userName,
|
||||
ClientId = trade.ClientId,
|
||||
UnderlyingId = trade.UnderlyingId,
|
||||
UnderlyingCode = trade.UnderlyingCode,
|
||||
ValueDate = req.settleDate,
|
||||
Spv1 = margin,
|
||||
Spv2 = margin,
|
||||
Spv3 = margin,
|
||||
Spv4 = margin,
|
||||
Spv5 = margin,
|
||||
Spv6 = margin,
|
||||
Spv7 = margin,
|
||||
Spv8 = margin,
|
||||
Spv = margin,
|
||||
WorstCastClientPayable = margin,
|
||||
Margin = 0
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,152 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using YLErp.BLL;
|
||||
using YLErp.DBModels;
|
||||
using YLErp.Enums;
|
||||
using YLErp.Modules.UnderlyingModule;
|
||||
|
||||
namespace YLErp.Modules.MarginModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 预付金模板V2 取数帮助类:按交易绑定的模板(trade_margin_template → margin_template_v2 → margin_template_detail)
|
||||
/// 取 初始预付金率x / 维持预付金率y,供交易确认书、预付金计算等消费点统一使用。
|
||||
/// 匹配维度:生效日期(ValueDate 最新)→ 利率债期限档(SpanConfig.BondTerm,四档,空=全部兜底)→ 标的资产类型(UnderlyingType 标志位)。
|
||||
/// </summary>
|
||||
public static class MarginTemplateV2RateHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// 取数结果。率已统一换算为小数(如 0.1 表示 10%),调用方直接用。
|
||||
/// </summary>
|
||||
public class MarginRateResult
|
||||
{
|
||||
/// <summary>
|
||||
/// 命中的模板
|
||||
/// </summary>
|
||||
public margin_template_v2 Template { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 命中的明细参数行(无预付金规则时为 null)
|
||||
/// </summary>
|
||||
public margin_template_detail Detail { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 初始预付金率 x(小数)
|
||||
/// </summary>
|
||||
public decimal? InitRate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 维持预付金率 y(小数)
|
||||
/// </summary>
|
||||
public decimal? MaintainRate { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按交易绑定的模板取 初始/维持预付金率。
|
||||
/// </summary>
|
||||
/// <param name="tradeId">交易ID</param>
|
||||
/// <param name="underlyingCode">标的代码(用于计算利率债期限档)</param>
|
||||
/// <param name="underlyingInstrumentType">标的资产类型(trade/swap_position 的 UnderlyingInstrumentType,如 TBonds)</param>
|
||||
/// <param name="valueDate">业务日期</param>
|
||||
/// <returns>命中返回结果;交易未绑定模板、模板无效、规则非 无预付金/区间追保结构、或明细无匹配行时返回 null(由调用方决定兜底)</returns>
|
||||
public static MarginRateResult GetTradeMarginRate(int tradeId, string underlyingCode, string underlyingInstrumentType, DateTime valueDate)
|
||||
{
|
||||
using (var db = new YLContext())
|
||||
{
|
||||
return GetTradeMarginRate(tradeId, underlyingCode, underlyingInstrumentType, valueDate, db);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按交易绑定的模板取 初始/维持预付金率(调用方传入 DbContext,供批量场景复用连接)。
|
||||
/// </summary>
|
||||
public static MarginRateResult GetTradeMarginRate(int tradeId, string underlyingCode, string underlyingInstrumentType, DateTime valueDate, YLContext db)
|
||||
{
|
||||
//1.交易绑定(ValueDate 最新)
|
||||
var binding = db.trade_margin_template.AsNoTracking()
|
||||
.Where(x => x.TradeId == tradeId && x.ValueDate <= valueDate)
|
||||
.OrderByDescending(x => x.ValueDate)
|
||||
.FirstOrDefault();
|
||||
if (binding == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var template = db.margin_template_v2.AsNoTracking().FirstOrDefault(x => x.id == binding.MarginTemplateId);
|
||||
if (template == null || !template.IsValid)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
//2.无预付金规则:率直接为 0
|
||||
if (template.RuleType == (int)MarginRuleTypeEnum.无预付金)
|
||||
{
|
||||
return new MarginRateResult { Template = template, InitRate = 0m, MaintainRate = 0m };
|
||||
}
|
||||
|
||||
if (template.RuleType != (int)MarginRuleTypeEnum.区间追保结构)
|
||||
{
|
||||
//其他规则不在本帮助类支持范围,显式返回 null
|
||||
return null;
|
||||
}
|
||||
|
||||
//3.区间追保结构:取 ValueDate 最新生效的一组明细(同一 ValueDate 下有多行参数组)
|
||||
var detailQuery = db.margin_template_detail.AsNoTracking()
|
||||
.Where(x => x.MarginTemplateId == template.id && x.ValueDate <= valueDate);
|
||||
if (!detailQuery.Any())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var latestValueDate = detailQuery.Max(x => x.ValueDate);
|
||||
var details = detailQuery.Where(x => x.ValueDate == latestValueDate).ToList();
|
||||
|
||||
//4.利率债期限档匹配:精确档 → "全部"(BondTerm 为空)兜底
|
||||
var term = UnderlyingHelper.GetApplicableMarginTerm(underlyingCode, valueDate);
|
||||
var matched = details.Where(x => x.SpanConfig != null && x.SpanConfig.BondTerm == term).ToList();
|
||||
if (!matched.Any())
|
||||
{
|
||||
matched = details.Where(x => x.SpanConfig == null || string.IsNullOrEmpty(x.SpanConfig.BondTerm)).ToList();
|
||||
}
|
||||
if (!matched.Any())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
//5.标的资产类型匹配(仅当模板选了"按资产类型分类"):精确标志位 → 通配行(None/All)兜底
|
||||
if (template.UnderlyingSeperateType == (int)UnderlyingSeperateTypeEnum.CustomInstrumentType
|
||||
&& Enum.TryParse<UnderlyingTypeEnum>(underlyingInstrumentType, out var instrumentFlag))
|
||||
{
|
||||
var byInstrument = matched.Where(x => (x.UnderlyingType & instrumentFlag) > 0).ToList();
|
||||
if (byInstrument.Any())
|
||||
{
|
||||
matched = byInstrument;
|
||||
}
|
||||
else
|
||||
{
|
||||
var wildcard = matched.Where(x => x.UnderlyingType == UnderlyingTypeEnum.None || x.UnderlyingType == UnderlyingTypeEnum.All).ToList();
|
||||
if (wildcard.Any())
|
||||
{
|
||||
matched = wildcard;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var detail = matched.First();
|
||||
return new MarginRateResult
|
||||
{
|
||||
Template = template,
|
||||
Detail = detail,
|
||||
InitRate = ToDecimalRate(detail.MarginRatio1),
|
||||
MaintainRate = ToDecimalRate(detail.MarginRatio2)
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 模板页录入的百分数(如 10 表示 10%)换算为小数(0.1)
|
||||
/// </summary>
|
||||
private static decimal? ToDecimalRate(double? ratio)
|
||||
{
|
||||
return ratio.HasValue ? (decimal)(ratio.Value / 100d) : (decimal?)null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,9 +12,10 @@ namespace YLErp.Modules.SwapModule
|
||||
public static SwapMarginTemplateConfig GetConfig()
|
||||
{
|
||||
//保证金模板V2迁移:交易页"保证金模板"下拉的选项改为"预付金模板V2"页面维护的模板(自定义+全局默认,存模板名称),不再使用数据字典
|
||||
//互换交易只显示"适用结构"包含 收益互换 的模板
|
||||
using var db = new YLErp.BLL.YLContext();
|
||||
var items = db.margin_template_v2
|
||||
.Where(item => !item.IsForClient && item.IsValid)
|
||||
.Where(item => !item.IsForClient && item.IsValid && item.TradeTypes.Contains("收益互换"))
|
||||
.OrderBy(item => item.IsDefault).ThenBy(item => item.id)
|
||||
.Select(item => new SelectItem { Text = item.Name, Value = item.Name })
|
||||
.ToArray();
|
||||
|
||||
@@ -134,9 +134,9 @@ namespace YLErp.Modules.SwapModule
|
||||
DbContext.trade_margin_template.RemoveRange(olds);
|
||||
if (!string.IsNullOrWhiteSpace(dbTrade.MarginTemplateName))
|
||||
{
|
||||
//匹配自定义+全局默认模板(重名时优先自定义)
|
||||
//匹配自定义+全局默认模板(重名时优先自定义),模板"适用结构"需包含 收益互换
|
||||
var template = DbContext.margin_template_v2
|
||||
.Where(x => x.Name == dbTrade.MarginTemplateName && !x.IsForClient && x.IsValid)
|
||||
.Where(x => x.Name == dbTrade.MarginTemplateName && !x.IsForClient && x.IsValid && x.TradeTypes.Contains("收益互换"))
|
||||
.OrderBy(x => x.IsDefault)
|
||||
.FirstOrDefault();
|
||||
if (template != null)
|
||||
|
||||
@@ -301,19 +301,43 @@ namespace YLErp.Web.Controllers
|
||||
|
||||
if (marginTemplate.Details.Count() > 1)
|
||||
{
|
||||
var underlyingType = UnderlyingTypeEnum.None;
|
||||
foreach (var detail in marginTemplate.Details)
|
||||
if (marginTemplate.RuleType == (int)MarginRuleTypeEnum.区间追保结构)
|
||||
{
|
||||
if (detail.UnderlyingType == UnderlyingTypeEnum.None)
|
||||
//区间追保结构:按 利率债期限档(SpanConfig.BondTerm)分组校验,同一期限档内标的类型不允许重复,不同期限档允许相同标的类型
|
||||
foreach (var termGroup in marginTemplate.Details.GroupBy(x => x.SpanConfig?.BondTerm ?? ""))
|
||||
{
|
||||
throw new Exception("标的类型不能为空");
|
||||
}
|
||||
if ((detail.UnderlyingType & underlyingType) > 0)
|
||||
{
|
||||
throw new Exception("存在重复的标的类型:" + UnderlyingTypeUtil.GetDesc(detail.UnderlyingType & underlyingType));
|
||||
}
|
||||
var termUnderlyingType = UnderlyingTypeEnum.None;
|
||||
foreach (var detail in termGroup)
|
||||
{
|
||||
if ((detail.UnderlyingType & termUnderlyingType) > 0)
|
||||
{
|
||||
if (marginTemplate.UnderlyingSeperateType == (int)UnderlyingSeperateTypeEnum.None)
|
||||
{
|
||||
throw new Exception("同一利率债期限档下存在重复的参数组");
|
||||
}
|
||||
throw new Exception("存在重复的标的类型:" + UnderlyingTypeUtil.GetDesc(detail.UnderlyingType & termUnderlyingType));
|
||||
}
|
||||
|
||||
underlyingType |= detail.UnderlyingType;
|
||||
termUnderlyingType |= detail.UnderlyingType;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var underlyingType = UnderlyingTypeEnum.None;
|
||||
foreach (var detail in marginTemplate.Details)
|
||||
{
|
||||
if (detail.UnderlyingType == UnderlyingTypeEnum.None)
|
||||
{
|
||||
throw new Exception("标的类型不能为空");
|
||||
}
|
||||
if ((detail.UnderlyingType & underlyingType) > 0)
|
||||
{
|
||||
throw new Exception("存在重复的标的类型:" + UnderlyingTypeUtil.GetDesc(detail.UnderlyingType & underlyingType));
|
||||
}
|
||||
|
||||
underlyingType |= detail.UnderlyingType;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
<label class="formlabel">是否按标的分类设置参数</label>
|
||||
<select v-model="marginTemplate.UnderlyingSeperateType" v-on:change="changeUnderlyingSeperateType()" v-bind:disabled="marginTemplate.RuleType != @((int)MarginRuleTypeEnum.按固定利率) && marginTemplate.RuleType != @((int)MarginRuleTypeEnum.标准SPAN) && marginTemplate.RuleType != @((int)MarginRuleTypeEnum.卖出自动赎回规则1) && marginTemplate.RuleType != @((int)MarginRuleTypeEnum.区间追保结构)">
|
||||
<option value="@((int)UnderlyingSeperateTypeEnum.None)">不区分</option>
|
||||
<option value="@((int)UnderlyingSeperateTypeEnum.CustomStock)">按自定义权益分类</option>
|
||||
<option v-if="marginTemplate.RuleType != @((int)MarginRuleTypeEnum.区间追保结构)" value="@((int)UnderlyingSeperateTypeEnum.CustomStock)">按自定义权益分类</option>
|
||||
<option v-if="marginTemplate.RuleType == @((int)MarginRuleTypeEnum.区间追保结构)" value="@((int)UnderlyingSeperateTypeEnum.CustomInstrumentType)">按资产类型分类</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -203,6 +203,16 @@
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="marginTemplate.RuleType == @((int)MarginRuleTypeEnum.区间追保结构)">
|
||||
<div class="form-group" v-if="detail.SpanConfig">
|
||||
<label class="formlabel">利率债期限</label>
|
||||
<select v-model="detail.SpanConfig.BondTerm">
|
||||
<option value="">全部</option>
|
||||
<option value="<5y"><5y</option>
|
||||
<option value="5y-10y">5y-10y</option>
|
||||
<option value="10y-30y">10y-30y</option>
|
||||
<option value=">30y">>30y</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType)">
|
||||
<label class="formlabel">当标的资产类型为</label>
|
||||
|
||||
@@ -423,12 +433,12 @@
|
||||
</template>
|
||||
</div>
|
||||
<div class="col-auto" v-show="index + 1 == marginTemplate.Details.length">
|
||||
<button class="delBtn" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomStock) || marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType)" v-on:click="deleteDetail(index)">- 刪除</button>
|
||||
<button class="delBtn" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomStock) || marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.区间追保结构)" v-on:click="deleteDetail(index)">- 刪除</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<button class="addBtn" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomStock) || marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType)" v-on:click="addDetail()" v-bind:disabled="marginTemplate.RuleType == @((int)MarginRuleTypeEnum.无预付金) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.自动赎回买入预付金规则) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.保底预付金规则) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.含赔付预付金计算规则)">+ 新增参数组</button>
|
||||
<button class="addBtn" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomStock) || marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.区间追保结构)" v-on:click="addDetail()" v-bind:disabled="marginTemplate.RuleType == @((int)MarginRuleTypeEnum.无预付金) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.自动赎回买入预付金规则) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.保底预付金规则) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.含赔付预付金计算规则)">+ 新增参数组</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-buttons">
|
||||
@@ -467,6 +477,16 @@
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="ruleType == @((int)MarginRuleTypeEnum.区间追保结构)">
|
||||
<div class="form-group" v-if="detail.SpanConfig">
|
||||
<label class="formlabel">利率债期限</label>
|
||||
<select v-model="detail.SpanConfig.BondTerm">
|
||||
<option value="">全部</option>
|
||||
<option value="<5y"><5y</option>
|
||||
<option value="5y-10y">5y-10y</option>
|
||||
<option value="10y-30y">10y-30y</option>
|
||||
<option value=">30y">>30y</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="formlabel">初始预付金率x</label>
|
||||
<vue-number-input v-model="detail.MarginRatio1" v-bind:format="inputFormatPercent"></vue-number-input>
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
<label class="formlabel">是否按标的分类设置参数</label>
|
||||
<select v-model="marginTemplate.UnderlyingSeperateType" v-on:change="changeUnderlyingSeperateType()" v-bind:disabled="marginTemplate.RuleType != @((int)MarginRuleTypeEnum.按固定利率) && marginTemplate.RuleType != @((int)MarginRuleTypeEnum.标准SPAN) && marginTemplate.RuleType != @((int)MarginRuleTypeEnum.卖出自动赎回规则1) && marginTemplate.RuleType != @((int)MarginRuleTypeEnum.区间追保结构)">
|
||||
<option value="@((int)UnderlyingSeperateTypeEnum.None)">不区分</option>
|
||||
<option value="@((int)UnderlyingSeperateTypeEnum.CustomStock)">按自定义权益分类</option>
|
||||
<option v-if="marginTemplate.RuleType != @((int)MarginRuleTypeEnum.区间追保结构)" value="@((int)UnderlyingSeperateTypeEnum.CustomStock)">按自定义权益分类</option>
|
||||
<option v-if="marginTemplate.RuleType == @((int)MarginRuleTypeEnum.区间追保结构)" value="@((int)UnderlyingSeperateTypeEnum.CustomInstrumentType)">按资产类型分类</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -183,6 +183,16 @@
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="marginTemplate.RuleType == @((int)MarginRuleTypeEnum.区间追保结构)">
|
||||
<div class="form-group" v-if="detail.SpanConfig">
|
||||
<label class="formlabel">利率债期限</label>
|
||||
<select v-model="detail.SpanConfig.BondTerm">
|
||||
<option value="">全部</option>
|
||||
<option value="<5y"><5y</option>
|
||||
<option value="5y-10y">5y-10y</option>
|
||||
<option value="10y-30y">10y-30y</option>
|
||||
<option value=">30y">>30y</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType)">
|
||||
<label class="formlabel">当标的资产类型为</label>
|
||||
|
||||
@@ -403,12 +413,12 @@
|
||||
</template>
|
||||
</div>
|
||||
<div class="col-auto" v-show="index + 1 == marginTemplate.Details.length">
|
||||
<button class="delBtn" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomStock) || marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType)" v-on:click="deleteDetail(index)">- 刪除</button>
|
||||
<button class="delBtn" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomStock) || marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.区间追保结构)" v-on:click="deleteDetail(index)">- 刪除</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<button class="addBtn" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomStock) || marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType)" v-on:click="addDetail()" v-bind:disabled="marginTemplate.RuleType == @((int)MarginRuleTypeEnum.无预付金) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.自动赎回买入预付金规则) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.保底预付金规则) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.含赔付预付金计算规则)">+ 新增参数组</button>
|
||||
<button class="addBtn" v-show="marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomStock) || marginTemplate.UnderlyingSeperateType == @((int)UnderlyingSeperateTypeEnum.CustomInstrumentType) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.区间追保结构)" v-on:click="addDetail()" v-bind:disabled="marginTemplate.RuleType == @((int)MarginRuleTypeEnum.无预付金) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.自动赎回买入预付金规则) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.保底预付金规则) || marginTemplate.RuleType == @((int)MarginRuleTypeEnum.含赔付预付金计算规则)">+ 新增参数组</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-buttons">
|
||||
@@ -451,6 +461,16 @@
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="ruleType == @((int)MarginRuleTypeEnum.区间追保结构)">
|
||||
<div class="form-group" v-if="detail.SpanConfig">
|
||||
<label class="formlabel">利率债期限</label>
|
||||
<select v-model="detail.SpanConfig.BondTerm">
|
||||
<option value="">全部</option>
|
||||
<option value="<5y"><5y</option>
|
||||
<option value="5y-10y">5y-10y</option>
|
||||
<option value="10y-30y">10y-30y</option>
|
||||
<option value=">30y">>30y</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="formlabel">初始预付金率x</label>
|
||||
<vue-number-input v-model="detail.MarginRatio1" v-bind:format="inputFormatPercent"></vue-number-input>
|
||||
|
||||
@@ -136,6 +136,16 @@
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="marginTemplate.RuleType == @((int)MarginRuleTypeEnum.区间追保结构)">
|
||||
<div class="form-group" v-if="detail.SpanConfig">
|
||||
<label class="formlabel">利率债期限</label>
|
||||
<select v-model="detail.SpanConfig.BondTerm">
|
||||
<option value="">全部</option>
|
||||
<option value="<5y"><5y</option>
|
||||
<option value="5y-10y">5y-10y</option>
|
||||
<option value="10y-30y">10y-30y</option>
|
||||
<option value=">30y">>30y</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="formlabel">初始预付金率x</label>
|
||||
<vue-number-input v-model="detail.MarginRatio1" v-bind:format="inputFormatPercent"></vue-number-input>
|
||||
@@ -325,6 +335,16 @@
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="ruleType == @((int)MarginRuleTypeEnum.区间追保结构)">
|
||||
<div class="form-group" v-if="detail.SpanConfig">
|
||||
<label class="formlabel">利率债期限</label>
|
||||
<select v-model="detail.SpanConfig.BondTerm">
|
||||
<option value="">全部</option>
|
||||
<option value="<5y"><5y</option>
|
||||
<option value="5y-10y">5y-10y</option>
|
||||
<option value="10y-30y">10y-30y</option>
|
||||
<option value=">30y">>30y</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="formlabel">初始预付金率x</label>
|
||||
<vue-number-input v-model="detail.MarginRatio1" v-bind:format="inputFormatPercent"></vue-number-input>
|
||||
|
||||
@@ -95,7 +95,7 @@ const vue = new Vue({
|
||||
this.marginTemplate.Comments = "名义本金*Max(x,y-0.5*虚值比例)+ Flag*Max(0,PV);\n其中虚值比例 = max(0, P - 执行价)/期初价格,当计算日为成交日时,Flag = 0,P = 期初价格,当计算日不为成交日时,Flag = 1,P = 标的现价;\n若勾选了“取与保底金额孰小”,则取较小的一个;\n保底金额 =ABS(执行价格 - 保底价格)* ABS(交易数量)。";
|
||||
break;
|
||||
case MarginRuleTypeEnum.区间追保结构:
|
||||
this.marginTemplate.Comments = "预付金占用为名义本金的固定比例。支持按标的资产类型(利率债/信用债/其它债券/股票/股指等全部资产类型)分别设置初始预付金率x、维持预付金率y;以期初净价为基准,按(x-y)逐档推算预警线/平仓线,标的价格触及档位线时触发追保或平仓。";
|
||||
this.marginTemplate.Comments = "预付金占用为名义本金的固定比例。按利率债期限(<5y/5y-10y/10y-30y/>30y)分别设置初始预付金率x、维持预付金率y,支持再按标的资产类型(利率债/信用债/其它债券/股票/股指等全部资产类型)分组;以期初净价为基准,按(x-y)逐档推算预警线/平仓线,标的价格触及档位线时触发追保或平仓。";
|
||||
break;
|
||||
case MarginRuleTypeEnum.默认预付金规则:
|
||||
this.marginTemplate.Comments = "考虑了14种场景下的Span算法与Delta算法比较的通用预付金规则,该规则可以调整Span涨跌幅度";
|
||||
|
||||
@@ -81,7 +81,7 @@ const vue = new Vue({
|
||||
this.marginTemplate.Comments = "名义本金*Max(x,y-0.5*虚值比例)+ Flag*Max(0,PV);\n其中虚值比例 = max(0, P - 执行价)/期初价格,当计算日为成交日时,Flag = 0,P = 期初价格,当计算日不为成交日时,Flag = 1,P = 标的现价;\n若勾选了“取与保底金额孰小”,则取较小的一个;\n保底金额 =ABS(执行价格 - 保底价格)* ABS(交易数量)。";
|
||||
break;
|
||||
case MarginRuleTypeEnum.区间追保结构:
|
||||
this.marginTemplate.Comments = "预付金占用为名义本金的固定比例。以期初净价为基准,按(初始预付金率x-维持预付金率y)逐档推算预警线/平仓线,标的价格触及档位线时触发追保或平仓。";
|
||||
this.marginTemplate.Comments = "预付金占用为名义本金的固定比例。按利率债期限(<5y/5y-10y/10y-30y/>30y)分别设置初始预付金率x、维持预付金率y;以期初净价为基准,按(x-y)逐档推算预警线/平仓线,标的价格触及档位线时触发追保或平仓。";
|
||||
break;
|
||||
case MarginRuleTypeEnum.单独计算规则:
|
||||
this.marginTemplate.Comments = "基于宏源定制的预付金规则,用于计算单笔交易,不参与Span预付金规则的轧差。";
|
||||
|
||||
Reference in New Issue
Block a user