Selectable column information

This commit is contained in:
Joe Tretter
2020-04-30 17:29:31 -05:00
parent dc5841f2a9
commit 5b747069dd
4 changed files with 88 additions and 10 deletions

1
.gitignore vendored
View File

@@ -109,3 +109,4 @@ dist
.vscode-test .vscode-test
server/quoteDBs/consolidated.sqlite3 server/quoteDBs/consolidated.sqlite3
server/quoteDBs/processedDBs server/quoteDBs/processedDBs
server/quoteDBs/*.7z

View File

@@ -105,6 +105,8 @@ body {
#frmOrder ul li { #frmOrder ul li {
border-top:1px solid blue; border-top:1px solid blue;
font-family: monospace;
font-size: 12px;
} }
#frmOrder div.orderItemLine2 { #frmOrder div.orderItemLine2 {
@@ -148,7 +150,12 @@ body {
position:absolute; position:absolute;
left:300; left:300;
top:80px; top:80px;
width:800px; min-width:800px;
}
.btn-myColSelection {
padding-top: 0;
padding-bottom: 0;
} }
.ralign { text-align:right; } .ralign { text-align:right; }
@@ -172,8 +179,8 @@ body {
} }
.plusMinusContainer{ .plusMinusContainer{
position: absolute; position: absolute;
margin-top: -20; margin-top: -17;
left: 250; left: 238;
} }
.priceClick { .priceClick {

View File

@@ -31,7 +31,10 @@ let getCallArtifact=(callData,allColumns)=>{
let classes=(callData.delta < 0.5)?" otm":" itm"; let classes=(callData.delta < 0.5)?" otm":" itm";
for (let i=0;i< allColumns.length;i++){ for (let i=0;i< allColumns.length;i++){
let cellValue=Number(callData[allColumns[i]]).toLocaleString('en',{minimumFractionDigits: 2, maximumFractionDigits: 2}); let cellValue=callData[allColumns["c"+(i+1)]];
if (!isNaN(cellValue)) {
cellValue=Number(cellValue).toLocaleString('en',{minimumFractionDigits: 2, maximumFractionDigits: 2});
}
artifact+=` artifact+=`
<td class="${classes} ralign">${cellValue}</td> <td class="${classes} ralign">${cellValue}</td>
@@ -56,7 +59,10 @@ let getPutArtifact=(putData,allColumns)=>{
let classes=(putData.delta > -0.5)?" otm":" itm"; let classes=(putData.delta > -0.5)?" otm":" itm";
for (let i=0;i< allColumns.length;i++){ for (let i=0;i< allColumns.length;i++){
let cellValue=Number(putData[allColumns[i]]).toLocaleString('en',{minimumFractionDigits: 2, maximumFractionDigits: 2}); let cellValue=putData[allColumns["c"+(i+1)]];
if (!isNaN(cellValue)) {
cellValue=Number(cellValue).toLocaleString('en',{minimumFractionDigits: 2, maximumFractionDigits: 2});
}
artifact+=` artifact+=`
<td class="${classes} ralign">${cellValue}</td> <td class="${classes} ralign">${cellValue}</td>
@@ -86,7 +92,8 @@ let getStrikeArtifact=(strike)=>{
let fillChainRow=(rowData)=>{ let fillChainRow=(rowData)=>{
let theTable=document.getElementById("tblOptionChain"); let theTable=document.getElementById("tblOptionChain");
let theNewRow=theTable.insertRow(-1); let theNewRow=theTable.insertRow(-1);
let allColumns=["delta","theta","vega"]; let allColumns=JSON.parse(localStorage["KPIs"]);
allColumns.length=3;
theNewRow.innerHTML=getCallArtifact(rowData.call,allColumns) + getStrikeArtifact(rowData.strike) + getPutArtifact(rowData.put,allColumns); theNewRow.innerHTML=getCallArtifact(rowData.call,allColumns) + getStrikeArtifact(rowData.strike) + getPutArtifact(rowData.put,allColumns);
} }
@@ -121,13 +128,49 @@ let fillChainTable=(expirationDate,dateOnly)=>{
} }
} }
let getColumnSelection=(colNum)=>{
if (localStorage["KPIs"] === undefined) {
localStorage["KPIs"] = '{"c1":"delta","c2":"theta","c3":"vega"}';
}
let displayColumnKPIs=JSON.parse(localStorage["KPIs"]);
let selectedValue=displayColumnKPIs["c"+colNum];
let capitalize=(theOption)=>{
// add a blank before each Upper Case letter
let optionText=theOption.replace(/([A-Z])/g, ' $1').trim();
// make the first letter upper case
optionText= optionText.charAt(0).toUpperCase() + optionText.substring(1);
return(optionText);
}
let allOptions=Object.keys(dta.callExpDateMap[Object.keys(dta.callExpDateMap)[0]][Object.keys(dta.callExpDateMap[Object.keys(dta.callExpDateMap)[0]])[0]][0]);
allOptions=allOptions.sort();
let me=`
<div class="dropdown myColDropDown">
<button class="btn btn-default dropdown-toggle btn-myColSelection" type="button" id="colMenu" + ${colNum} data-toggle="dropdown" aria-expanded="false">${capitalize(selectedValue)}<span class="caret"></span></button>
<ul class="dropdown-menu" role="menu" aria-labelledby="colMenu" + ${colNum}>
`;
for (let i=0; i<allOptions.length;i++){
let theOption=allOptions[i];
if ((theOption==="bid") || (theOption === "ask")) { continue; } // bid and ask are fix.
me += `<li role="presentation"><a role="menuitem" tabindex="-1" onclick="myTblOptionChain.changeColKPI(${colNum}, '${theOption}')">${capitalize(theOption)}</a></li>`;
}
me += `
</ul>
</div>
`;
return(me);
}
let displayOptionChain=()=>{ let displayOptionChain=()=>{
let app=window.document.getElementById('app'); let app=window.document.getElementById('app');
$("#wrapperOptionChain").remove(); $("#wrapperOptionChain").remove();
let newNode=document.createElement("div"); let newNode=document.createElement("div");
newNode.setAttribute("id","wrapperOptionChain"); newNode.setAttribute("id","wrapperOptionChain");
newNode.innerHTML=` newNode.innerHTML=`
<div class="container-fluid " id="frmOptionChainMain"> <div class="container-fluid col-md-9" id="frmOptionChainMain">
<div class="col-md-12"> <div class="col-md-12">
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
${Object.keys(dta.callExpDateMap).map(datesOut).join('')} ${Object.keys(dta.callExpDateMap).map(datesOut).join('')}
@@ -140,7 +183,7 @@ let displayOptionChain=()=>{
<th colspan="4" class='center'>CALLS</th><th></th><th colspan="4" class='center'>PUTS</th> <th colspan="4" class='center'>CALLS</th><th></th><th colspan="4" class='center'>PUTS</th>
</tr> </tr>
<tr> <tr>
<th class='ralign'>Delta</th><th class='ralign'>Theta</th><th class='ralign'>Vega</th><th class='ralign'>Bid</th><th class='ralign'>Ask</th><th class='center'>Strike</th><th class='ralign'>Delta</th><th class='ralign'>Theta</th><th class='ralign'>Vega</th><th class='ralign'>Bid</th><th class='ralign'>Ask</th> <th class='ralign'>${getColumnSelection(1)}</th><th class='ralign'>${getColumnSelection(2)}</th><th class='ralign'>${getColumnSelection(3)}</th><th class='ralign'>Bid</th><th class='ralign'>Ask</th><th class='center'>Strike</th><th class='ralign'>${getColumnSelection(1)}</th><th class='ralign'>${getColumnSelection(2)}</th><th class='ralign'>${getColumnSelection(3)}</th><th class='ralign'>Bid</th><th class='ralign'>Ask</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -151,7 +194,20 @@ let displayOptionChain=()=>{
</div> </div>
`; `;
app.appendChild(newNode) app.appendChild(newNode)
myTblOptionChain = $("#tblOptionChain")[0];
myTblOptionChain.allColumns=["delta","theta","vega"];
myTblOptionChain.changeColKPI=(colNum, kpi)=>{
console.log("ChangeKPI",colNum,kpi);
let displayColumnKPIs=JSON.parse(localStorage["KPIs"]);
displayColumnKPIs["c"+colNum]=kpi;
localStorage["KPIs"]=JSON.stringify(displayColumnKPIs);
displayOptionChain();
}
// "click" the date if it's the context dte // "click" the date if it's the context dte
if ($(".nav").find(".active").children().length > 0){ if ($(".nav").find(".active").children().length > 0){

View File

@@ -55,13 +55,27 @@ let createOrderFrame=()=>{
me.parentElement.removeChild(me); me.parentElement.removeChild(me);
} }
let splitOptionDetails=(input)=>{
let symbolRest=input.split("_");
let symbol=symbolRest[0];
let putCall=(symbolRest[1].indexOf("P")>-1)?"P":"C";
let dateStrike = symbolRest[1].split(putCall);
let date = dateStrike[0].replace(/(..)(..)(..)/,"20$3-$1-$2");
let strike = dateStrike[1];
return({symbol:symbol, putCall:putCall, date:date, strike:strike });
}
let optionDetails=splitOptionDetails(optionData.symbol);
me.innerHTML=` me.innerHTML=`
<a class='danger' onclick='this.parentElement.removeFromOrder();'>[X]</a> <b>${myMasterFilter.selectedDate}|${myMasterFilter.selectedTime.substr(0,5)}</b>|<span class="opentype${openType}">${openType}</span>@<span class="singlePrice">${Math.abs(me.singleCostAmount).toLocaleString('en',{minimumFractionDigits: 0, maximumFractionDigits: 2})}</span>|<span class='quantity'>${me.quantity}</span> <a class='danger' onclick='this.parentElement.removeFromOrder();'>[X]</a> <b>${myMasterFilter.selectedDate}|${myMasterFilter.selectedTime.substr(0,5)}</b>|<span class="opentype${openType}">${((openType==="buy")?" ":"") + openType}</span>@<span class="singlePrice">${Math.abs(me.singleCostAmount).toLocaleString('en',{minimumFractionDigits: 0, maximumFractionDigits: 2}).padStart(7,"\xa0")}</span>|<span class='quantity'>${me.quantity}</span>
<div class='plusMinusContainer'> <div class='plusMinusContainer'>
<a class='plusMinus' onclick='this.parentElement.parentElement.increaseQty();'>[+]</a><a class='plusMinus' onclick='this.parentElement.parentElement.decreaseQty();'>[-]</a> <a class='plusMinus' onclick='this.parentElement.parentElement.increaseQty();'>[+]</a><a class='plusMinus' onclick='this.parentElement.parentElement.decreaseQty();'>[-]</a>
</div> </div>
<div class='orderItemLine2'> <div class='orderItemLine2'>
${optionData.symbol} =&gt; <span class='totalCost'>${me.totalCostAmount.toLocaleString('en',{minimumFractionDigits: 0, maximumFractionDigits: 2})}</span> ${optionDetails.symbol} ${optionDetails.date} ${optionDetails.putCall} ${optionDetails.strike} =&gt; <span class='totalCost'>${me.totalCostAmount.toLocaleString('en',{minimumFractionDigits: 0, maximumFractionDigits: 2})}</span>
</div> </div>
`; `;