275 lines
11 KiB
Plaintext
275 lines
11 KiB
Plaintext
@{
|
||
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>*@
|
||
|
||
|
||
|
||
|