function getColModelGrid() { var i = 0; var colModelGrid = [ { name: 'id', hidden: true, optionHide: true }, { name: 'EncryptTradeId', hidden: true, optionHide: true }, { name: 'TradeNumber', label: '交易编号', index: 'TradeNumber', width: 150, align: 'center', sortIndex: i++, sortable: true }, { name: 'GroupName', label: '分组名', index: 'GroupName', sortIndex: i++, width: 80, sortable: false, hidden: !page.isGuoyuan }, { name: 'ContractCode', label: '确认书编号', index: 'ContractCode', width: 150, align: 'center', sortIndex: i++, sortable: true }, { name: 'ExchangeOptionCode', label: '期权代码', index: 'ExchangeOptionCode', width: 150, align: 'center', sortIndex: i++, sortable: true }, { name: 'ChildLeg', label: '多腿编号', index: 'ChildLeg', width: 80, align: 'center', sortIndex: i++, sortable: false }, { name: page.isPvRounded ? 'RoundedPositionPnl' : 'PositionPnl', label: '浮动盈亏', index: page.isPvRounded ? 'RoundedPositionPnl' : 'PositionPnl', sortIndex: i++, width: 65, align: 'center', sortable: true, formatter: PriceFormat }, { name: 'RealizedPnl', label: '实现盈亏', index: 'RealizedPnl', sortIndex: i++, width: 65, align: 'center', sortable: false, formatter: RealizedPnlFormat }, { name: 'CurrentVolatility', label: '当前波动率', index: 'CurrentVolatility', sortIndex: i++, width: 65, align: 'center', formatter: otcformat.trading.premiumRateP, sortable: true }, { name: 'Delta', label: 'Delta', index: 'Delta', width: 100, align: 'center', sortIndex: i++, formatter: otcformat.trading.greek, sortable: false }, { name: 'DeltaLots', label: 'Delta手数', index: 'DeltaLots', width: 100, align: 'center', sortIndex: i++, formatter: otcformat.trading.notional, sortable: false }, { name: 'Gamma', label: 'Gamma', index: 'Gamma', width: 100, sortIndex: i++, align: 'center', formatter: otcformat.trading.greek, sortable: false }, { name: 'GammaLots', label: 'Gamma手数', index: 'GammaLots', width: 100, sortIndex: i++, align: 'center', formatter: otcformat.trading.notional, sortable: false }, { name: 'Theta', label: 'Theta', index: 'Theta', width: 100, align: 'center', sortIndex: i++, formatter: otcformat.trading.greek, sortable: true }, { name: 'Rho', label: 'Rho', index: 'Rho', width: 100, align: 'center', sortIndex: i++, formatter: otcformat.trading.greek, sortable: true }, { name: 'Vega', label: 'Vega', index: 'Vega', sortIndex: i++, width: 100, align: 'center', formatter: otcformat.trading.greek, sortable: true }, { name: 'ExerciseDate', label: '到期日期', index: 'ExerciseDate', width: 80, sortIndex: i++, align: 'center', formatter: 'date', sortable: true }, { name: 'ExerciseModeCn', label: '行权方式', index: 'ExerciseModeCn', width: 80, sortIndex: i++, align: 'center', sortable: false, formatter: ShowToolName }, { name: 'TradeType', label: '结构类型', index: 'TradeType', sortIndex: i++, width: 70, align: 'center', formatter: function (cellvalue, options, rowObject) { return rowObject.StructureType && rowObject.IsGroup != 2 ? rowObject.StructureType : rowObject.TradeType; }, sortable: true }, { name: 'KnockInOutStatus', label: '观察状态', index: 'KnockInOutStatus', sortIndex: i++, width: 100, align: 'center', sortable: false }, { name: 'ClientName', label: '交易对手方', index: 'ClientName', width: 150, sortIndex: i++, align: 'center', sortable: true }, { name: 'ClientNumber', label: '交易对手编号', index: 'ClientNumber', width: 150, sortIndex: i++, align: 'center', sortable: false }, { name: 'AssetBookName', label: '簿记账户', index: 'AssetBookName', width: 150, sortIndex: i++, align: 'center', sortable: true }, { name: 'TradeDate', label: '成交日期', sortIndex: i++, index: 'TradeDate', width: 90, align: 'center', formatter: 'date', sortable: true }, { name: 'OptionType', sortIndex: i++, label: '看涨看跌', index: 'OptionType', width: 80, align: 'center', sortable: false }, { name: 'BuySell', sortIndex: i++, label: '买卖方向', index: 'BuySell', width: 80, align: 'center', sortable: false }, { name: 'UnderlyingCode', label: '标的代码', index: 'UnderlyingCode', width: 80, align: 'center', sortIndex: i++, sortable: true }, { name: 'UnderlyingAssetName', label: '标的名称', index: 'UnderlyingAssetName', width: 80, align: 'center', sortIndex: i++, sortable: false }, { name: 'UnderlyingVariety', label: '标的品种', index: 'UnderlyingVariety', sortIndex: i++, width: 60, align: 'center', sortable: false, hidden: !page.showUnderlyingVariety, optionHide: !page.showUnderlyingVariety }, { name: 'InitialSpotPrice', label: '期初标的价格', index: 'InitialSpotPrice', sortIndex: i++, width: 85, align: 'center', formatter: SpotPriceFormat, sortable: false }, { name: 'Strike', label: '执行价格', index: 'Strike', sortIndex: i++, width: 100, align: 'center', formatter: StrikeFormatter, sortable: true }, { name: 'TradeSinglePrice', label: '权利金(成交)', index: 'TradeSinglePrice', sortIndex: i++, width: 100, align: 'center', formatter: function (cellValue, options, rowObject) { if (rowObject.IsUsePremiumRate) { return otcformat.trading.premiumRateP(rowObject.PremiumRate); } else { return otcformat.trading.tradeSinglePrice(cellValue); } }, sortable: false }, { name: 'TradeOriginalAmountV', label: '成交数量', sortIndex: i++, width: 70, align: 'center', formatter: function (cellvalue, options, rowObject) { return otcformat.trading.notional(Math.abs(tradeHelper.getTradeAmountV(rowObject.trade, null, rowObject.CountRatio))); }, sortable: false }, { name: 'TradeOriginalAmount', label: '有效成交数量', index: 'TradeOriginalAmount', sortIndex: i++, width: 100, align: 'center', formatter: TradeOriginalAmountFormat, sortable: false }, { name: 'TradePrice', label: '成交金额', index: 'TradePrice', sortIndex: i++, width: 100, align: 'center', formatter: TradePriceFormat, sortable: true }, { name: 'etcTradePrice', label: '存续成本', index: 'etcTradePrice', sortIndex: i++, width: 100, align: 'center', formatter: etcTradePriceFormat, sortable: false }, { name: 'StockEqvNotionalToShow', label: '名义本金', index: 'StockEqvNotionalToShow', sortIndex: i++, width: 100, align: 'center', formatter: StockEqvNotionalFormat, sortable: false }, { name: 'UnderlyingPrice', label: '最新标的价格', index: 'UnderlyingPrice', width: 100, align: 'center', sortIndex: i++, formatter: otcformat.trading.umprice, sortable: false }, { name: 'RiskFreeRate', label: '无风险利率', index: 'RiskFreeRate', width: 80, align: 'center', sortIndex: i++, formatter: otcformat.trading.premiumRateP, sortable: false }, { name: 'DividendRate', label: '分红率', index: 'DividendRate', width: 80, align: 'center', sortIndex: i++, formatter: otcformat.trading.premiumRateP, sortable: false }, { name: 'SinglePV', label: '权利金(存续)', index: 'SinglePV', sortIndex: i++, width: 100, align: 'center', sortable: false, formatter: function (cellValue, options, rowObject) { if (rowObject.IsUsePremiumRate) { var premiumRate = tradeHelper.GetPremiumRateByTradeSinglePrice(cellValue, rowObject.InitialSpotPrice); return otcformat.trading.premiumRateP(premiumRate); } else { return otcformat.trading.tradePrice(cellValue); } } }, { name: 'TradeAmountV', label: '存续数量', sortIndex: i++, width: 70, align: 'center', formatter: function (cellvalue, options, rowObject) { if (rowObject.trade === null) { return rowObject.TradeAmount; } else { return otcformat.trading.notional(tradeHelper.getTradeAmountV(rowObject.trade, rowObject.TradeAmount, 1)); } }, sortable: false }, { name: 'TradeAmount', label: '有效存续数量', index: 'TradeAmount', sortIndex: i++, width: 100, align: 'center', formatter: TradeAmountFormat, sortable: false }, { name: page.isPvRounded ? 'RoundedPV' : 'PV', label: '存续市值', index: page.isPvRounded ? 'RoundedPV' : 'PV', sortIndex: i++, width: 100, align: 'center', sortable: false, formatter: otcformat.trading.tradePrice }, { name: 'Margin', label: '维持预付金', index: 'Margin', sortIndex: i++, width: 100, align: 'center', sortable: false, formatter: otcformat.trading.tradePrice }, { name: 'TraderName', label: '交易员', index: 'TraderName', sortIndex: i++, width: 100, align: 'center', sortable: false }, { name: 'SurvivingNominalPrincipal', label: '存续名义本金', index: 'SurvivingNominalPrincipal', sortIndex: i++, hidden: !page.showGuohai, optionHide: !page.showGuohai, width: 100, align: 'center', sortable: false, formatter(cellValue, options, rowObject) { return main.formatNumber(cellValue || '', 2); } }, { name: 'Comments', label: '备注', index: 'Comments', sortIndex: i++, width: 100, align: 'center', sortable: false } ]; if (page.isGuoJun) { colModelGrid.push({ name: 'PosiInitMargin', label: '持仓初始预付金', index: 'PosiInitMargin', sortIndex: i++, width: 100, align: 'center', sortable: false, formatter: otcformat.trading.tradePrice }); } if (page.showCreditExposure) { colModelGrid.push({ name: 'Exposure', label: '信用风险敞口', index: 'Exposure', sortIndex: i++, width: 100, align: 'center', sortable: false, formatter: otcformat.trading.tradePrice }); } if (page.calcPnlExplain) { var pnlCols = [{ name: 'PnLDelta', label: 'dPnLDelta', width: 100, align: 'center', sortable: false, formatter: otcformat.trading.greek }, { name: 'PnLGamma', label: 'dPnLGamma', width: 100, align: 'center', sortable: false, formatter: otcformat.trading.greek }, { name: 'PnLVega', label: 'dPnLVega', width: 100, align: 'center', sortable: false, formatter: otcformat.trading.greek }, { name: 'PnLTheta', label: 'dPnLTheta', width: 100, align: 'center', sortable: false, formatter: otcformat.trading.greek }, { name: 'PnLPsi', label: 'dPnLPsi', width: 100, align: 'center', sortable: false, formatter: otcformat.trading.greek }]; colModelGrid = colModelGrid.concat(pnlCols); } if (page.needShowSpv) { //涨停市值,不变市值,跌停市值 var spvCols = [{ name: 'Spv1', label: '涨停市值', width: 100, align: 'center', sortable: false, formatter: otcformat.trading.greek }, { name: 'Spv2', label: '不变市值', width: 100, align: 'center', sortable: false, formatter: otcformat.trading.greek }, { name: 'Spv3', label: '跌停市值', width: 100, align: 'center', sortable: false, formatter: otcformat.trading.greek }]; colModelGrid = colModelGrid.concat(spvCols); } if (page.isGLMS) { colModelGrid.push({ name: 'Delta_r', label: 'Delta_r', index: 'Delta_r', width: 100, align: 'center', sortIndex: i++, formatter: greeksFormat, sortable: false }, { name: 'Delta_r_1bp', label: 'Delta_r(1bp)', index: 'Delta_r_1bp', width: 100, align: 'center', sortIndex: i++, formatter: greeksFormat, sortable: false }, { name: 'Dv01', label: 'Dv01', index: 'Dv01', width: 100, align: 'center', sortIndex: i++, formatter: greeksFormat, sortable: false }, { name: 'Gamma_r', label: 'Gamma_r', index: 'Gamma_r', width: 100, align: 'center', sortIndex: i++, formatter: greeksFormat, sortable: false }, { name: 'Gamma_r_1bp', label: 'Gamma_r(1bp)', index: 'Gamma_r_1bp', width: 120, align: 'center', sortIndex: i++, formatter: greeksFormat, sortable: false }, { name: 'Vega_r', label: 'Vega_r', index: 'Vega_r', width: 100, align: 'center', sortIndex: i++, formatter: greeksFormat, sortable: false }, { name: 'Vega_r_1bp', label: 'Vega_r(1bp)', index: 'Vega_r_1bp', width: 100, align: 'center', sortIndex: i++, formatter: greeksFormat, sortable: false },); } return tradeHelper.getAmountToNotional(colModelGrid); } $(function () { var PostData = {}; $("#DateValueDate").datepicker({ changeMonth: true, changeYear: true, showButtonPanel: true, showOtherMonths: true, selectOtherMonths: true, maxDate: page.valueDate_eod }); changePriceType(); PostData.ValueDate = $("#DateValueDate").val(); PostData.VolType = "持仓"; $("#VolType").val("持仓"); var grid = jQuery('#listGrid').jqGrid({ url: '/trade/EodPositionRisksQuery', datatype: "local", height: 'auto', width: '96%', multiselect: true, autowidth: false, shrinkToFit: false, viewrecords: true, jsonReader: { repeatitems: false }, mtype: 'POST', postData: PostData, afterInsertRow: AfterInsertRow, onSelectRow: rowclick, ondblClickRow: rowdblclick, colModel: getColModelGrid(), pager: jQuery('#pagerGrid'), pagerpos: 'left', rowNum: 10000, rowList: [25, 50, 100, 200, 10000], footerrow: false, //userDataOnFooter: true, loadComplete: gridComplete, onPaging: onJqgridPaging, grouping: true }); document.onkeydown = function (event) { var e = event ? event : (window.event ? window.event : null); if (e.keyCode === 13) { SearchClick(true); } }; let underlyingCtrl = new tradeHelper.UnderlyingSelectCtrl('#UnderlyingId') .setFlag(tradeHelper.UnderlyingSelectFlag.OtcTrade); $(window).resize(function () { //如有频繁改变大小的需求,要增加延迟运行的逻辑; $("#listGrid").setGridWidth($("#main-wrapper").width() - 30); var newHeight = $(window).height() - 350; $("#listGrid").setGridHeight(newHeight); }); }); const GroupingFormat = main.numberFormat(2, { grouping: true }); const ThreeDecimalGroupingFormat = main.numberFormat(3, { grouping: false }); function gridComplete(data) { var jgrid = $(this); main.setcolumnChooser(jgrid, '日终持仓风险'); $(window).resize(); if (page.calcPnlExplain && data.Sum) { $('#footSummaryDiv').text("dPnL: " + data.Sum.dpnl.toFixed(2)); } } function rowdblclick(rowid) { var rowData = $(this).getRowData(rowid); if (rowData.id > 0 && rowData.TradeType) { starttradeView(rowData.EncryptTradeId, rowData.TradeType); } } function starttradeView(id, tradeType) { if (tradeType.indexOf("远期") >= 0) { var srcurl = "/forwardtrade/tradeView/?enid=" + id + "&isFromPositionReport=false&isOnlyCloseButton=true"; main.open("查看远期交易", srcurl, { area: ['1260px', '800px'] }); } else { var srcurl = "/trade/tradeView/?enid=" + id + "&isFromPositionReport=false&isOnlyCloseButton=true"; main.open("查看交易", srcurl, { area: ['1260px', '800px'] }); } } //---------------------------Formatter--------------------------------- function TradeOriginalAmountFormat(cellValue, options, rowObject) { return otcformat.trading.notional(Math.abs(cellValue)); } function TradeAmountFormat(cellValue, options, rowObject) { return otcformat.trading.notional(cellValue); } function greeksFormat(cellValue, options, rowObject) { if (cellValue) { return otcformat.trading.greek(cellValue); } return ""; } function SpotPriceFormat(cellValue, options, rowObject) { if (rowObject.TradeType !== "场内期权" && rowObject.TradeType !== "商品期货" && rowObject.TradeType !== "股票" && rowObject.TradeType !== "商品现货") { return otcformat.trading.umprice(cellValue) } else { return ""; } } function TradePriceFormat(cellValue, options, rowObject) { return otcformat.trading.tradePrice(cellValue * (rowObject.BuySell === "买入" || rowObject.BuySell === "多头开仓" || rowObject.BuySell === "空头开仓" ? -1 : 1)); } function etcTradePriceFormat(cellValue, options, rowObject) { //黑箱主交易后台已经处理过了 if (rowObject.IsGroup == 1) { return otcformat.trading.tradePrice(cellValue); } return otcformat.trading.tradePrice(cellValue * (rowObject.BuySell === "买入" || rowObject.BuySell === "多头开仓" || rowObject.BuySell === "空头开仓" ? -1 : 1)); } function PriceFormat(cellValue, options, rowObject) { return otcformat.trading.tradePrice(cellValue); } function RealizedPnlFormat(cellValue, options, rowObject) { return otcformat.trading.tradePrice(cellValue); } function StockEqvNotionalFormat(cellValue, options, rowObject) { if (rowObject.TradeType !== "场内期权" && rowObject.TradeType !== "商品期货" && rowObject.TradeType !== "股票" && rowObject.TradeType !== "商品现货") { return otcformat.trading.StockEqvNotional(cellValue); } else { return ""; } } function ComputePV(cellValue, options, rowObject) { var pv = main.formatNumber(rowObject.SinglePV) * main.formatNumber(rowObject.TradeAmount); return otcformat.trading.tradePrice(pv); } function PercentFormat(cellValue, options, rowObject) { return otcformat.trading.premiumRateP(cellValue); } function DoubleFormat(cellValue, options, rowObject) { return main.formatNumber(cellValue); } function StrikeFormatter(cellValue, options, rowObject) { if (rowObject.TradeType == "自定义交易") { return ""; } if (rowObject.Strike) { if (rowObject.IsMoneynessOption === "是") { return otcformat.trading.premiumRateP(rowObject.Strike); } else { return otcformat.trading.umprice(rowObject.Strike); } } else { if (rowObject.Strike === 0) { return 0; } else { return ""; } } } function ShowToolName(cellValue, options, rowObject) { if ("American" == rowObject.ExerciseMode) { return "美式"; } else if ("European" == rowObject.ExerciseMode) { return "欧式"; } } //--------------------------------------------------------------------------------- function rowclick(id) { } function exportTrade() { var jgrid = jQuery('#listGrid'); var postData = GetPostData(); var ids = jgrid.jqGrid('getGridParam', 'selarrrow'); if (ids.length > 0) { postData.TradeIds = ids; } downLoadFile("/trade/DownloadEodPositionRisks?" + $.param(postData, true)); } function downClientRiskMonitor() { var htmlContent = $('#exportRiskReport').html(); main.open2("导出日终持仓风险", htmlContent, { area: ["450px", "300px"], success: function (layero, index) { var valueDate = $("#DateValueDate").val(); main.setTradeDatePicker(valueDate, ""); $("#endDate").val($("#DateValueDate").val()); $("#startDate,#endDate").datepicker("option", "maxDate", valueDate); $("#startDate").on("change", function () { var startDate = $(this).val(); if (!main.isDate(startDate)) { return; } $("#endDate").datepicker("option", "minDate", startDate); }); $("#endDate").on("change", function () { var endDate = $(this).val(); if (!main.isDate(endDate)) { return; } $("#startDate").datepicker("option", "maxDate", endDate); }); } }); } //导出区间 function rangeClick() { $("#startDate").prop("disabled", !$("#useRange").prop("checked")); } //导出提示 function execExport() { if (main.isEmpty($("#startDate").val()) && $("#useRange").prop("checked")) { return main.message("开始日期不能为空"); } if (main.isEmpty($("#endDate").val())) { return main.message("结束日期不能为空"); } if ($("#startDate").val() > $("#endDate").val()) { return main.message("开始日期不能在结束日期之后"); } var jgrid = jQuery('#listGrid'); var postData = GetPostData(); if ($("#useRange").prop("checked")) { postData.StartDate = $("#startDate").val(); postData.ValueDate = $('#endDate').val(); window.open("/trade/EodPositionRiskExport?" + $.param(postData, true) + "&processName=ExportEodPositionRisks"); //asyncDownload(postData); //main.post("/trade/BatchDownloadEodPositionRisks", postData); //main.waitMe(close); //parent.layer.closeAll(); //main.open("", "/common/ProgressBar?processName=ExportEodPositionRisks&showStatus=true", { area: ['400px', '40px'], maxmin: false, closeBtn: 0, content: ["/common/ProgressBar?processName=ExportEodPositionRisks&showStatus=true", "no"] }); } else { postData.ValueDate = $('#endDate').val(); var ids = jgrid.jqGrid('getGridParam', 'selarrrow'); if (ids.length > 0) { postData.TradeIds = ids; } downLoadFile("/trade/DownloadEodPositionRisks?" + $.param(postData, true)); parent.layer.closeAll(); } } function downLoadFile(downloadUrlStr) { window.open(downloadUrlStr); } function GetPostData() { var postData = {}; postData.ValueDate = $("#DateValueDate").val(); postData.TradeNumber = $("#TradeNumber").val(); postData.BookIds = $("#BookId").val(); postData.AssetIdGroupList = $("#GroupId").val(); postData.TradeTypes = $("#TradeType").val(); postData.UnderlyingIds = $("#UnderlyingId").val(); postData.TraderIds = $("#TraderId").val(); postData.ClientIds = $("#ClientId").val(); postData.EodSettlePriceMode = $("#EodSettlePriceMode").val(); postData.VolType = $("#VolType").val(); postData.IsParentTrade = $("#IsParentTrade").val(); postData.GroupNames = $("#GroupNames").val(); postData.TagIds = $("#TagIds").val(); if ($("#DividendRateType")) { postData.DividendRateType = $("#DividendRateType").val(); } return postData; } function SearchClick(isSearchclick) { var listGrid = $('#listGrid'); listGrid.appendPostData(GetPostData()); if (typeof (isSearchclick) != "undefined" && isSearchclick) { //点击搜索时默认第一页 listGrid.jqGrid('setGridParam', { page: 1 }); } listGrid.jqGrid('setGridParam', { datatype: 'json' }).trigger('reloadGrid'); } function showcolumnChooser() { var jgrid = jQuery('#listGrid'); main.showcolumnChooser(jgrid, '日终持仓风险'); } function changePriceType() { var lastDate = new Date().Format("yyyy-MM-dd"); if ($('#EodSettlePriceMode').val() == "结算价") { lastDate = page.valueDate_settle; $('#settleBtn').show(); } else { lastDate = page.valueDate_eod; $('#settleBtn').hide(); } $("#DateValueDate").datepicker("option", "maxDate", lastDate); if (!$("#DateValueDate").val()) { $("#DateValueDate").val(lastDate); } } //function openSettlePage() { // main.open("结算价收盘", "/eod_trade_value/eodBatchExec_Settle", { area: ["680px", "510px"] }); //}