Files
zszq-trs/YLErpWeb/Views/eod_var/eod_var.cshtml
T
2024-05-09 14:06:26 +08:00

275 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@{
ViewBag.Title = "VaR计算";
Layout = "~/Views/Shared/_MainLayout.cshtml";
}
@section CSS{
<style>
.searchdiv .search-label {
width: 100px;
}
.searchdiv .search-group {
width: 262px;
}
.result-label {
width: 70px;
}
.result-span {
text-align: right;
display: inline-block;
border: 1px solid;
width: 120px;
min-height: 25px;
margin-bottom: -6px;
padding: 0 5px;
}
th, td {
text-align: center;
border: 1px solid;
padding: 4px;
}
</style>
}
@section JS
{
<script src="~/Scripts/app/tradeHelper.js?v=@HtmlUtil.JsVersion"></script>
<script>
var valueDate = "@ViewBag.valueDate";
const day_count = 244;
main.setTradeDatePicker(moment(valueDate));
let underlyingCtrl = new tradeHelper.UnderlyingSelectCtrl('#UnderlyingId').setFlag(tradeHelper.UnderlyingSelectFlag.OtcTrade);
$(function () {
$("#DateValueDate").val(valueDate);
try {
SetAceDropDown();
} catch (e) {
}
$("#VaRType").bind("change", function () {
if ($("#VaRType").val() == 0) {
$("#TradeType,#PvPercent,#DateEndValueDate,#DateCalcStartDate,#DaysCount").prop("disabled", false);
} else {
$("#TradeType,#PvPercent,#DateEndValueDate,#DateCalcStartDate,#DaysCount").prop("disabled", true);
}
});
$("#DateCalcStartDate").bind("change", function () {
var endDate = !$('#DateEndValueDate').val() ? $('#DateValueDate').val() : $('#DateEndValueDate').val();
var startDate = $("#DateCalcStartDate").val();
getDaysCount(startDate, endDate);
});
$("#DaysCount,#DateValueDate,#DateEndValueDate").bind("change", function () {
var endDate = !$('#DateEndValueDate').val() ? $('#DateValueDate').val() : $('#DateEndValueDate').val();
var dayCount = $("#DaysCount").val();
setCalcStartDate(endDate, dayCount);
});
$("#DateEndValueDate").bind("change", function () {
if ($('#DateEndValueDate').val() && $('#DateEndValueDate').val() < $('#DateValueDate').val()) {
main.alert("结束日期不得早于估值日期");
$('#DateEndValueDate').val($('#DateEndValueDate').val());
}
});
$("#DaysCount").val(244);
$("#DaysCount").change()
FastVue.numberInput(document.getElementById('PvPercent'), { precision: 0,append:'%' });
});
function CalcEodVaR() {
if ($("#DateEndValueDate").val()) {
if ($("#DateEndValueDate").val() < $("#DateValueDate").val()) {
main.alert("结束日不应早于开始日!");
return;
}
}
var dayCount = $("#DaysCount").val();
if (!(dayCount > 0)) {
main.alert("回溯期限应大于0");
return;
}
var data = {
ValueDate: $("#DateValueDate").val(),
EndValueDate: $("#DateEndValueDate").val(),
AssetId: $("#AssetId").val()
};
var varType = $("#VaRType").val();
if (varType == 0) {
var isNeedExport = false;
if (confirm("计算时是否需要导出中间数据?")) {
data["IsNeedExport"] = true;
isNeedExport = true;
} else {
data["IsNeedExport"] = false;
isNeedExport = false;
}
data["TradeType"] = $("#TradeType").val();
data["DaysCount"] = dayCount;
main.post("/eod_var/calcEodVaR", data).done(function (data) {
if (data.success) {
vue.search();
if (isNeedExport) {
var fileName = "EodVar中间数据" + $("#DateValueDate").val().replaceAll('-','') + ".xlsx"
window.open("/App_Docs/Temp/" + fileName);
}
}
});
} else {
main.post("/eod_var/calcSimpleDeltaGammaVaR", data).done(function (data) {
if (data.success) {
vue.search()
}
});
}
}
var vue = new Vue({
el: "#listdiv",
data: {
Model: null,
//IsTotalVaR: function (underlyingCode,IsUnderlying) {
// if (underlyingCode == "-- 总计 --") {
// return "background:lightgreen";
// } else if (IsUnderlying) {
// return "background-color: #ffe3d9";
// }
//}
},
filters: {
toPercent: function (val) {
return (val * 100).toFixed(2) + "%";
},
grouping2Format: main.numberFormat(2, { grouping: true }),
grouping4Format: main.numberFormat(4, { grouping: true })
},
mounted: function () { },
methods: {
search: function () {
var thisObj = this;
var pvpercent = parseInt($("#PvPercent").val()) / 100;
var data = {
ValueDate: $("#DateValueDate").val(), PvPercent: pvpercent, VarType: $("#VaRType").val(),
UnderlyingIds: (!$("#UnderlyingId").val() ? "" : $("#UnderlyingId").val().join(",")),
AssetId: $("#AssetId").val(),
};
if (data.VarType == 0) {
data["TradeType"] = $("#TradeType").val();
}
main.post("/eod_var/getEodVaR", data).done(function (data) {
thisObj.Model = data;
});
}
}
})
function getDaysCount(startDate,endDate) {
if (!startDate || !endDate) {
$("#DaysCount").val(0);
return;
}
main.post("/calendar/GetWorkDays", { from: startDate, to: endDate }).done(function (res) {
$("#DaysCount").val(res.obj);
});
}
function setCalcStartDate(endDate, daysCount) {
var count = -1 * parseInt(daysCount);
if (!count) {
count = 0;
$("#DaysCount").val(count);
}
if (!endDate) return;
main.post("/calendar/GetNonHolidayShiftDay", { from: endDate, shiftDays: count }).done(function (res) {
$("#DateCalcStartDate").val(res.obj);
});
}
</script>
}
<div class="searchdiv">
@Html.SearchDate("ValueDate", "估值日期")
@Html.SearchDate("EndValueDate", "结束日期")
@Html.MyAceDropdownInput2("VaRType", "计算方法", new List<SelectListItem>
{
new SelectListItem {Text = "历史模拟法", Value = "0"},
new SelectListItem {Text = "简单Delta/Gamma法", Value = "1"},
}, false)
@Html.SearchDate("CalcStartDate", "回溯起始日期")
<div id="DaysCountDiv" class="search-group" style="width:112px">
<input class="text-box" type="text" name="DaysCount" style="margin-left:22px;width:73px" id="DaysCount">
<label>天</label>
</div>
@Html.MyAceDropdownInput2("TradeType", "业务类型", new List<SelectListItem>
{
new SelectListItem {Text = "整体", Value = ""},
new SelectListItem {Text = "场外", Value = "场外"},
new SelectListItem {Text = "互换", Value = "互换"},
new SelectListItem {Text = "远期", Value = "远期"},
new SelectListItem {Text = "场内", Value = "场内"},
new SelectListItem {Text = "商品", Value = "商品"},
}, false)
@Html.MyAceDropdownInput2("AssetId", "簿记账户", AssetunitController.GetClientassetunit())
@MyControls.Btn("VaR计算", "CalcEodVaR()")
</div>
<div class="searchdiv">
<div class="search-group">
<span class="search-label">标的代码</span>
<select class="" data-placeholder="请选择 标的代码" id="UnderlyingId" name="UnderlyingId" multiple></select>
</div>
<div id="PvPercentDiv" class="search-group">
<label class="search-label">百分比</label>
<input class="text-box" type="text" value="@PS.Config.ErpElement.EodVarPvPercent" name="PvPercent" id="PvPercent">
</div>
@MyControls.Btn("VaR查看", "vue.search()")
</div>
<div id="listdiv" style="overflow-y:scroll;margin:14px">
<template v-if="Model == null || Model.length < 1">
</template>
<template v-else>
<table>
<thead style="background-color:lightgrey">
<tr>
<th>标的代码</th>
<th>簿记账户</th>
<th>试算Pv</th>
<th>实际Pv</th>
<th>盈亏</th>
<th>盈亏比例</th>
</tr>
</thead>
<tbody>
<template v-for="(item,index) in Model">
<tr>
<td style="font-weight:bold">{{item.UnderlyingCode}}</td>
<td style="font-weight:bold">{{item.AssetName}}</td>
<td>{{item.CalcPv |grouping4Format}}</td>
<td>{{item.RealPv |grouping4Format}}</td>
<td>{{item.WinLoss |grouping4Format}}</td>
<td>{{item.WinLossPercent |toPercent}}</td>
</tr>
</template>
</tbody>
</table>
</template>
</div>
@*<div>
<label class="result-label">试算Pv:</label><span id="calcPv" class="result-span"></span>
</div>
<div>
<label class="result-label">实际Pv:</label><span id="realPv" class="result-span"></span>
</div>
<div>
<label class="result-label" title="试算Pv - 实际Pv">盈亏:</label><span id="winLoss" class="result-span" title="试算Pv - 实际Pv"></span>
</div>
<div>
<label class="result-label" title="盈亏/Abs(实际Pv)">盈亏比例:</label><span id="winLossPercent" class="result-span" title="盈亏/Abs(实际Pv)"></span>
</div>*@