Files
OptiTrainer/client/js/optiTrainer.js

161 lines
5.2 KiB
JavaScript
Raw Normal View History

var allCombinations;
var optionChainContext={};
2020-02-27 18:38:52 -06:00
$(document).ready(_=>{
dta={};
2020-02-27 18:38:52 -06:00
createOrderFrame();
createMasterFilterFrame();
let selectDataFirst=_=>{
return {enabled:false, tooltip:"Select a Ticker!"};
}
$("#datePicker").datepicker({beforeShowDay:selectDataFirst});
2020-02-27 18:38:52 -06:00
});
2020-02-27 18:38:52 -06:00
let dta={};
let datesOut=(dateInp)=>{
let date=dateInp.split(':')[0];
let dte=dateInp.split(':')[1];
let attrActive="";
if (optionChainContext.selectedDate === date) {
attrActive="active";
//fillChainTable(dateInp,date);
}
return `<li class="nav-item ${attrActive}"><a href="#" id="TAB_${date}" role="tab" class="nav-link" onclick="fillChainTable('${dateInp}','${date}')">${date}<br><center>(DTE: ${dte})</center></a></li>`
2020-02-27 18:38:52 -06:00
}
let getCallArtifact=(callData,allColumns)=>{
let artifact="";
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});
artifact+=`
<td class="${classes} ralign">${cellValue}</td>
`;
}
let strCallJSON=JSON.stringify(callData).replace(/"/g,"\\'");
bidFrm=Number(callData.bid).toLocaleString('en',{minimumFractionDigits: 2, maximumFractionDigits: 2});
askFrm=Number(callData.ask).toLocaleString('en',{minimumFractionDigits: 2, maximumFractionDigits: 2});
2020-02-27 18:38:52 -06:00
classes += " priceClick";
2020-02-27 18:38:52 -06:00
artifact+=`
<td class="${classes} ralign" onclick="myOrderFrame.addToOrder('sell','${strCallJSON}')"><a title="Sell">${bidFrm}</a></td>
<td class="${classes} ralign" onclick="myOrderFrame.addToOrder('buy','${strCallJSON}')"><a title="Buy">${askFrm}</a></td>
2020-02-27 18:38:52 -06:00
`;
return artifact;
}
let getPutArtifact=(putData,allColumns)=>{
let artifact="";
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});
artifact+=`
<td class="${classes} ralign">${cellValue}</td>
`;
}
let strPutJSON=JSON.stringify(putData).replace(/"/g,"\\'");
bidFrm=Number(putData.bid).toLocaleString('en',{minimumFractionDigits: 2, maximumFractionDigits: 2});
askFrm=Number(putData.ask).toLocaleString('en',{minimumFractionDigits: 2, maximumFractionDigits: 2});
2020-04-25 13:12:12 -05:00
classes += " priceClick";
2020-02-27 18:38:52 -06:00
artifact+=`
<td class="${classes} ralign" onclick="myOrderFrame.addToOrder('sell','${strPutJSON}')"><a title="Sell">${bidFrm}</a></td>
<td class="${classes} ralign" onclick="myOrderFrame.addToOrder('buy','${strPutJSON}')"><a title="Buy">${askFrm}</a></td>
2020-02-27 18:38:52 -06:00
`;
return artifact;
}
let getStrikeArtifact=(strike)=>{
return `
<th class="center bold ">${strike}</th>
`;
}
let fillChainRow=(rowData)=>{
let theTable=document.getElementById("tblOptionChain");
let theNewRow=theTable.insertRow(-1);
let allColumns=["delta","theta","vega"];
2020-02-27 18:38:52 -06:00
theNewRow.innerHTML=getCallArtifact(rowData.call,allColumns) + getStrikeArtifact(rowData.strike) + getPutArtifact(rowData.put,allColumns);
}
let clearChainTable=()=>{
let theTable=document.getElementById("tblOptionChain");
for (let i=theTable.rows.length;i>3;i--){
theTable.deleteRow(-1);
}
}
let fillChainTable=(expirationDate,dateOnly)=>{
// Maintain Active Tab
$(".nav a").on("click", function(){
$(".nav").find(".active").removeClass("active");
$(this).parent().addClass("active");
});
2020-02-27 18:38:52 -06:00
clearChainTable();
optionChainContext.selectedDate=dateOnly;
2020-02-27 18:38:52 -06:00
let allCalls=dta.callExpDateMap[expirationDate];
let allPuts=dta.putExpDateMap[expirationDate];
//console.log(expirationDate,allCalls,allPuts);
2020-02-27 18:38:52 -06:00
let allStrikes=Object.keys(allCalls);
for (let i=0;i<allStrikes.length;i++){
let theStrike=allStrikes[i];
let singleStrikeCall=allCalls[theStrike][0];
let singleStrikePut=allPuts[theStrike][0];
let rowData={strike:theStrike,call:singleStrikeCall,put:singleStrikePut}
fillChainRow(rowData);
}
2020-02-27 18:38:52 -06:00
}
let displayOptionChain=()=>{
let app=window.document.getElementById('app');
$("#wrapperOptionChain").remove();
let newNode=document.createElement("div");
newNode.setAttribute("id","wrapperOptionChain");
newNode.innerHTML=`
<div class="container-fluid " id="frmOptionChainMain">
<div class="col-md-12">
<ul class="nav nav-tabs">
${Object.keys(dta.callExpDateMap).map(datesOut).join('')}
</ul>
</div>
<div class="col-md-12">
<table id='tblOptionChain' class="table table-sm table-hover">
<thead>
<tr>
<th colspan="4" class='center'>CALLS</th><th></th><th colspan="4" class='center'>PUTS</th>
</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>
</tr>
</thead>
<tbody>
<tr><!-- Dummy row --></tr>
</tbody>
</table>
</div>
</div>
`;
app.appendChild(newNode)
// "click" the date if it's the context dte
if ($(".nav").find(".active").children().length > 0){
$(".nav").find(".active").children()[0].click();
}
2020-02-27 18:38:52 -06:00
}