// 查询自定义结构 function queryStructure() { var name = $("#UserDefineStructure :selected").text(); main.post("/UserDefinedStructure/QueryUserDefinedStructure", { structureName: name }).done(function (res) { if (res != null) { $("#StructureName").val(res.StructureName); $("#StructureCode").val(res.StructureCode); $("#PricingMethod").val(res.PricingMethod); $("#userDefinedFields").empty(); var li = ""; var selectId = ""; for (var i = 0; i < res.Fields.length; ++i) { selectId = "fieldDefSelect" + res.Fields[i].FieldName; li = ""; li += "
  • "; li += ""; li += "
  • "; $("#userDefinedFields").append(li); $("#" + selectId).get(0).selectedIndex = res.Fields[i].FieldType; } // 设置payoff源代码的显示 $("#PayoffDescription").text(res.PayoffDescription); editor.getDoc().setValue(res.PayoffDescription); editor.refresh(); $("#PriceDistribution").val(res.PriceDistribution); $(".delete").click(function () { $(this).parent().remove(); }); // 刷新“定价测试”区域的自定义字段 refreshNewFieldInPricingTest(res.Fields); $("#StructureName").attr("disabled", true); } }); } // 新建一个结构 function createStructure() { $("#StructureName").attr("disabled", false); $("#StructureName").val(""); $("#StructureCode").val(""); $("#PricingMethod").val("无"); $("#userDefinedFields").empty(); var sampleCode = "\ /// \n\ /// 预处理蒙特卡洛模拟的参数,以获得更高的模拟效率。\n\ /// 默认仅生成每一个观察日对应的时间序列\n\ /// \n\ /// valueDate: 估值日期\n\ /// r: 无风险利率\n\ public override float[] PrepareMC(Date valueDate, double r)\n\ {\n\ return base.PrepareMC(valueDate, r);\n\ }\n\ \n\ /// \n\ /// 蒙特卡洛模拟中对单一价格路径的处理函数\n\ /// \n\ /// st: 价格序列\n\ /// r: 无风险利率\n\ public override float DiscountedPayoffForOnePath(float[] st, float r)\n\ {\n\ return (float)0.0;\n\ }"; editor.getDoc().setValue(sampleCode); editor.refresh(); } // 结构定义新增字段 function addNewField() { var li = "
  • "; li += ""; li += "
  • " $("#userDefinedFields").append(li); $(".delete").click(function () { $(this).parent().remove(); }); } // 从当前页面获取自定义结构信息 function getCurrentStructure() { var structure = {}; structure.StructureName = $("#StructureName").val(); structure.StructureCode = $("#StructureCode").val(); structure.PricingMethod = $("#PricingMethod option:selected").val(); structure.FieldDefinitions = getUserDefinedFields(); structure.PayoffDescription = editor.getDoc().getValue(); structure.PriceDistribution = $("#PriceDistribution option:selected").val(); return structure; } // 保存自定义结构 function saveStructure() { var structure = getCurrentStructure(); var saveNew = !$("#StructureName").prop("disabled"); main.post("/UserDefinedStructure/SaveUserDefinedStructure", { req: structure, saveNew: saveNew }).done(function (res) { window.location.reload(); }); } // 删除自定义结构 function deleteStructure() { var name = $("#StructureName").val(); main.confirm("确认删除" + name + "吗?", function () { main.post("/UserDefinedStructure/DeleteStructureByName", { name: $("#StructureName").val() }).done(function (res) { window.location.reload(); }); } ); } // 获取自定义字段列表 function getUserDefinedFields() { var fields = []; $("#userDefinedFields").find("li").each(function () { var field = {}; field.FieldDisplayName = $(this).find("input").eq(0).val(); field.FieldName = $(this).find("input").eq(1).val(); field.FieldType = $(this).find("select").val(); fields.push(field); }); return JSON.stringify(fields); } // 在定价测试中刷新结构字段 function refreshFields() { //var name = $("#UserDefineStructure :selected").text(); var name = $("#StructureName").val(); main.post("/UserDefinedStructure/QueryUserDefinedStructure", { structureName: name }).done(function (res) { refreshNewFieldInPricingTest(res.Fields); }); } // 在定价测试中刷新结构字段 function refreshNewFieldInPricingTest(fields) { $("#divTestOptionFields").empty(); var html = ""; var inputId = ""; for (var i = 0; i < fields.length; ++i) { inputId = "Test" + fields[i].FieldName; html += "
    "; if (fields[i].FieldType == 3) { html += "
    "; } else if (fields[i].FieldType == 0) { html += ""; } else { html += ""; } } $("#divTestOptionFields").append(html); ResetDatePicker(); } // 编译自定义的结构 function compileSourceCode() { var structure = getCurrentStructure(); main.post("/UserDefinedStructure/CompileUserDefineSourceCode", { req: structure }).done(function (res) { }); } // 试定价 function calcStructure() { var structure = getCurrentStructure(); var request = {}; request.req = structure; request.baseFieldStr = getBaseFieldsForPricingTest(); request.customizedFieldStr = getCustomizedFieldsForPricingTest(structure.FieldDefinitions); request.valueDate = "2020-07-28"; request.spot = 1; request.r = 0.05; request.q = 0.05; request.vol = 0.25; request.calcGreeks = $("#checkBoxCalcGreeks").is(":checked"); main.post("/UserDefinedStructure/PricingTestUserDefineSourceCode", request).done(function (res) { $("#resultPv").text(isNaN(res.Pv) ? "0.00" : res.Pv.toFixed(2)); $("#resultDelta").text(isNaN(res.Delta) ? "0.00" : res.Delta.toFixed(2)); $("#resultGamma").text(isNaN(res.Gamma) ? "0.00" : res.Gamma.toFixed(2)); $("#resultVega").text(isNaN(res.Vega) ? "0.00" : res.Vega.toFixed(2)); $("#resultTheta").text(isNaN(res.Theta) ? "0.00" : res.Theta.toFixed(2)); $("#resultRho").text(isNaN(res.Rho) ? "0.00" : res.Rho.toFixed(2)); }); } // 为试定价获取基础字段 function getBaseFieldsForPricingTest() { var fields = {}; fields.StartDate = $("#TestStartDate").val(); fields.MaturityDate = $("#TestMaturityDate").val(); fields.ObservationDateStr = $("#setObservationDatesBtn").data("observationdates"); return JSON.stringify(fields); } // 为试定价获取自定义字段 function getCustomizedFieldsForPricingTest(defStr) { var fields = []; var fieldDefs = JSON.parse(defStr); fieldDefs.forEach(function (val, i) { var field = {}; field.Name = val.FieldName; field.Type = val.FieldType; field.Value = $("#Test" + val.FieldName).val(); fields.push(field); }); return JSON.stringify(fields); } // 发布结构 function publishStructure() { var structure = getCurrentStructure(); main.post("/UserDefinedStructure/PublishUserDefinedStructure", { req: structure }).done(function (res) { window.location.reload(); }); } // 设置观察日 function setObservationDates(thisobj, title1 = "", title2 = "", isTitle1Percent = false, isTitle2Percent = false, defaultTitle1Value = 0, defaultTitle2Value = 0) { var startTime = $("#TestStartDate").val(); var endTime = $("#TestMaturityDate").val(); if (main.isEmpty(startTime)) { main.message("请输入成交日期"); return false; } if (main.isEmpty(endTime)) { main.message("请输入到期日期"); return false; } var observationDates = $(thisobj).data("observationdates"); var observationNum = $(thisobj).data("observationnum"); var observationUnit = $(thisobj).data("observationunit"); var observationHolidayType = $(thisobj).data("observationholidaytype"); var alignEnd = true; var btnId = $(thisobj).attr('id'); sessionStorage.setItem(btnId + "_observationdates", observationDates); layer.open({ type: 2, title: "设置自定义观察日", shadeClose: false, shade: 0.4, area: ['500px', '560px'], content: "/trade/tradeObservationDates?observationNum=" + observationNum + "&observationUnit=" + observationUnit + "&observationHolidayType=" + observationHolidayType + "&startTime=" + startTime + "&endTime=" + endTime + "&alignEnd=" + alignEnd + "&btnId=" + btnId + "&title1=" + title1 + "&title2=" + title2 + "&isTitle1Percent=" + isTitle1Percent + "&isTitle2Percent=" + isTitle2Percent + "&defaultTitle1Value=" + defaultTitle1Value + "&defaultTitle2Value=" + defaultTitle2Value }); } // 设置观察日窗口返回的函数 function getObservationDatesSetting(observationNum, observationUnit, observationHolidayType, observationDates, alignEnd, btnId) { $("#" + btnId).data("observationdates", observationDates); $("#" + btnId).data("observationnum", observationNum); $("#" + btnId).data("observationunit", observationUnit); $("#" + btnId).data("observationholidaytype", observationHolidayType); $("#" + btnId).data("alignend", alignEnd); } // 重置页面上所有日期控件 function ResetDatePicker() { $(".datepicker").datepicker({ changeMonth: true, changeYear: true, showButtonPanel: true, showOtherMonths: true, selectOtherMonths: true }); };