"use strict"; var optionResults; $(document).ready(function() { $("#option-terms").on("submit", function(e) { // e.preventDefault(); sendRequest(); }) }); function serializeForm(id) { // return $(id).serializeArray() .reduce(function(a, x) { a[x.name] = x.value; return a; }, {}); } function sendRequest() { // var inputData = serializeForm("#option-terms"); // Get the right data-types inputData.ExpiryDate = new Date(inputData.ExpiryDate).toJSON(); inputData.OptType = parseInt(inputData.OptType); inputData.Rfr = parseFloat(inputData.Rfr); inputData.Sims = parseInt(inputData.Sims); inputData.Spot = parseFloat(inputData.Spot); inputData.Strike = parseFloat(inputData.Strike); inputData.ValueDate = new Date(inputData.ValueDate).toJSON(); inputData.Vol = parseFloat(inputData.impliedVol); // Send request var startTime; $.ajax({ type: "POST", url: "http://localhost:8080", data: JSON.stringify(inputData), beforeSend: function(request, settings) { startTime = new Date().getTime(); }, success: function(e) { optionResults = e; updateTable(); updateGraph(); let requestTime = new Date().getTime() - startTime; console.log("Request time(s):", requestTime / 1000); }, }); } function updateTable() { // TODO $("#results-table > tbody > tr").each(function(idx, el) { $($(el).children()[1])[0].innerText = optionResults["ClosedForm"][$($(el).children()[0]).text()].toFixed(4); $($(el).children()[2])[0].innerText = optionResults["MonteCarlo"][$($(el).children()[0]).text()].toFixed(4); }); } function updateGraph() { // TODO var strippedData = optionResults.MonteCarlo.Levels.map(function(i) { return Number(i.toFixed(0)); }); // Count the elements var counts = {}; var minY = 0; for (var i=0; i next - prev)[0]; y.domain([0, maxY]).nice(); svg.selectAll(".bin") .data(summaryData) .enter().append("line") .attr("class", "bin") .attr("x1", function(d) { return x(d.key) }) .attr("x2", function(d) { return x(d.key) }) .attr("y1", height) .attr("y2", function(d) { return y(d.value ) }); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom() .scale(x)); svg.append("g") .attr("class", "y axis") .call(d3.axisLeft() .scale(y)); var logNormalLine = d3.line() .x(function(d, i) { return x(d); }) .y(function(d) { return logNormal(d, 100, 0.4); }) .curve(d3.curveBasis); svg.append("g") .attr("d", logNormalLine(d3.range(x.domain()[0], x.domain()[1], 1))) .attr("stroke", "blue") .attr("stroke-width", 2) .attr("fill", "none") } function logNormal(x, mean, stddev) { var y = (1 / (x * Math.sqrt(2 * Math.PI * Math.pow(stddev, 2)))) * Math.pow(Math.E, - (Math.pow(Math.log(x) - mean, 2) / (2 * Math.pow(stddev, 2)))); // console.log('logNormal', x, mean, stddev, y); y = isFinite(y) ? y : 0; return y; }