diff --git a/.gitignore b/.gitignore
index b6cf75d..2677754 100644
--- a/.gitignore
+++ b/.gitignore
@@ -109,3 +109,4 @@ dist
.vscode-test
server/quoteDBs/consolidated.sqlite3
server/quoteDBs/processedDBs
+server/quoteDBs/*.7z
diff --git a/client/css/optiTrainer.css b/client/css/optiTrainer.css
index ff97909..460f441 100644
--- a/client/css/optiTrainer.css
+++ b/client/css/optiTrainer.css
@@ -105,6 +105,8 @@ body {
#frmOrder ul li {
border-top:1px solid blue;
+ font-family: monospace;
+ font-size: 12px;
}
#frmOrder div.orderItemLine2 {
@@ -148,7 +150,12 @@ body {
position:absolute;
left:300;
top:80px;
- width:800px;
+ min-width:800px;
+}
+
+.btn-myColSelection {
+ padding-top: 0;
+ padding-bottom: 0;
}
.ralign { text-align:right; }
@@ -172,8 +179,8 @@ body {
}
.plusMinusContainer{
position: absolute;
- margin-top: -20;
- left: 250;
+ margin-top: -17;
+ left: 238;
}
.priceClick {
diff --git a/client/js/optiTrainer.js b/client/js/optiTrainer.js
index b476cfc..69b6ecf 100644
--- a/client/js/optiTrainer.js
+++ b/client/js/optiTrainer.js
@@ -31,7 +31,10 @@ let getCallArtifact=(callData,allColumns)=>{
let classes=(callData.delta < 0.5)?" otm":" itm";
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+=`
${cellValue} |
@@ -56,7 +59,10 @@ let getPutArtifact=(putData,allColumns)=>{
let classes=(putData.delta > -0.5)?" otm":" itm";
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+=`
${cellValue} |
@@ -86,7 +92,8 @@ let getStrikeArtifact=(strike)=>{
let fillChainRow=(rowData)=>{
let theTable=document.getElementById("tblOptionChain");
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);
}
@@ -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=`
+
+
+
+
+ `;
+
+ return(me);
+}
+
let displayOptionChain=()=>{
let app=window.document.getElementById('app');
$("#wrapperOptionChain").remove();
let newNode=document.createElement("div");
newNode.setAttribute("id","wrapperOptionChain");
newNode.innerHTML=`
-
+
${Object.keys(dta.callExpDateMap).map(datesOut).join('')}
@@ -140,7 +183,7 @@ let displayOptionChain=()=>{
| CALLS | | PUTS |
- | Delta | Theta | Vega | Bid | Ask | Strike | Delta | Theta | Vega | Bid | Ask |
+ ${getColumnSelection(1)} | ${getColumnSelection(2)} | ${getColumnSelection(3)} | Bid | Ask | Strike | ${getColumnSelection(1)} | ${getColumnSelection(2)} | ${getColumnSelection(3)} | Bid | Ask |
@@ -151,7 +194,20 @@ let displayOptionChain=()=>{
`;
+
+
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
if ($(".nav").find(".active").children().length > 0){
diff --git a/client/js/orderFrame.js b/client/js/orderFrame.js
index 594232e..5006f9b 100644
--- a/client/js/orderFrame.js
+++ b/client/js/orderFrame.js
@@ -55,13 +55,27 @@ let createOrderFrame=()=>{
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=`
- [X] ${myMasterFilter.selectedDate}|${myMasterFilter.selectedTime.substr(0,5)}|${openType}@${Math.abs(me.singleCostAmount).toLocaleString('en',{minimumFractionDigits: 0, maximumFractionDigits: 2})}|${me.quantity}
+ [X] ${myMasterFilter.selectedDate}|${myMasterFilter.selectedTime.substr(0,5)}|${((openType==="buy")?" ":"") + openType}@${Math.abs(me.singleCostAmount).toLocaleString('en',{minimumFractionDigits: 0, maximumFractionDigits: 2}).padStart(7,"\xa0")}|${me.quantity}
- ${optionData.symbol} => ${me.totalCostAmount.toLocaleString('en',{minimumFractionDigits: 0, maximumFractionDigits: 2})}
+ ${optionDetails.symbol} ${optionDetails.date} ${optionDetails.putCall} ${optionDetails.strike} => ${me.totalCostAmount.toLocaleString('en',{minimumFractionDigits: 0, maximumFractionDigits: 2})}
`;