fix: slot label literal, netqty filter, today-only closed, calcSD + SD wire

This commit is contained in:
Manohar 2026-05-15 10:37:27 +05:30
parent 2540a89bae
commit b3b1946ee6

View file

@ -330,7 +330,7 @@ async function loadMarket(){
const map=Object.fromEntries(data.map(q=>[q.key,q]));
if(!window._mktCache)window._mktCache={};(data||[]).forEach(function(q){window._mktCache[q.key]=q;});grid.innerHTML=SLOTS.map(slot=>{
const q=map[slot.key];
if(!q){var c=(window._mktCache||{})[slot.key];if(c){q=c;}else{return '<div class="card mcard"><div class="mlbl">+slot.label+"</div><div class="mprice" style="color:var(--text3)"></div><div class="mchg" style="color:var(--text3)"></div></div>';}}
if(!q){var c=(window._mktCache||{})[slot.key];if(c){q=c;}else{return '<div class="card mcard"><div class="mlbl">'+slot.label+'</div><div class="mprice" style="color:var(--text3)"></div><div class="mchg" style="color:var(--text3)"></div></div>';}}
const up=q.changePct>=0,cl=up?'up':'dn',arrow=up?'\u25b2':'\u25bc';
const price=q.price>10000?q.price.toLocaleString('en-IN',{maximumFractionDigits:0}):q.price.toFixed(2);
return '<div class="card mcard"><div class="mlbl">'+slot.label+'</div>'+
@ -341,7 +341,7 @@ async function loadMarket(){
}
async function loadPositions(){
const {data}=await fetch('/api/positions').then(r=>r.json());
const open=data.filter(p=>p.is_closed===0);
const open=data.filter(p=>p.is_closed===0 && +p.netqty!==0);
const tbody=document.getElementById('pos-body'),tfoot=document.getElementById('pos-foot');
if(!open.length){tbody.innerHTML='<tr><td colspan="7" style="text-align:center;padding:36px;color:var(--text3)">No open positions</td></tr>';tfoot.style.display='none';return;}
const sU=open.reduce((s,p)=>s+p.unrealised_pnl,0),sR=open.reduce((s,p)=>s+p.realised_pnl,0),sT=open.reduce((s,p)=>s+p.total_pnl,0);
@ -507,6 +507,8 @@ function detectStrategy(opts) {
return opts.length+'-Leg Strategy';
}
function calcSD(spot,dte,vix){var v=vix>1?vix/100:0.18;var dv=v/Math.sqrt(252);var move=spot*dv*Math.sqrt(Math.max(dte,1));return{sd1:move,sd2:move*2};}
async function loadPayoff() {
var canvas = document.getElementById('payoff-chart');
var emptyEl = document.getElementById('pf-empty');
@ -583,7 +585,7 @@ async function loadPayoff() {
var tc = dk?'#3D444D':'#C4B8B0';
if (payoffChartInst) payoffChartInst.destroy();
canvas._beLines = bes; canvas._spotLine = spot; canvas._chartXs = xs;
var vixV=(window._mktCache&&window._mktCache['INDIAVIX'])?window._mktCache['INDIAVIX'].price:0;canvas._sdInfo=calcSD(spot,typeof dte==='number'?dte:7,vixV);canvas._beLines=bes;canvas._spotLine=spot;canvas._chartXs=xs;
payoffChartInst = new Chart(canvas, {
type: 'line',
@ -634,7 +636,8 @@ async function loadClosedPositions() {
var staleEl = document.getElementById('closed-stale');
if (!tbody) return;
var data = res.data || [];
var tIST=new Date().toLocaleDateString('en-CA',{timeZone:'Asia/Kolkata'});
var data=(res.data||[]).filter(function(p){return p.updated_at&&p.updated_at.slice(0,10)>=tIST;});
var totalBooked = res.totalBooked || 0;
// Update collapsed header badge