Market Breadth Snapshot Analyzer

Manually input daily market data to calculate basic breadth indicators.

** VERY IMPORTANT - PLEASE READ **
  • This tool is for educational and illustrative purposes ONLY. It analyzes single-period, manually inputted data.
  • Market breadth analysis often requires observing trends over time. This tool **DOES NOT provide live data or historical tracking.**
  • The interpretations are generalized and **NOT financial or investment advice.**
  • Always use breadth indicators with other analysis methods and consult qualified financial professionals.

Enter Market Data (for a specific index/market, e.g., today's session)

${adRatio === Infinity ? 'Infinite' : this.formatNumber(adRatio)}

`; if (totalIssues > 0) { resultsHtml += `

Total Issues Traded

${this.formatNumber(totalIssues, 0)}

`; } if (!isNaN(newHighs) && !isNaN(newLows) && (newHighs > 0 || newLows > 0)) { // Only show if user entered these resultsHtml += `

New Highs - New Lows

${this.formatNumber(nhNl, 0)}

`; } this.elements.resultsGridDisplay.innerHTML = resultsHtml; // General Interpretation let interpretationHtml = '

General Observations (for this period):

    '; if (netAdvances > 0 && adRatio > 2) { interpretationHtml += '
  • Strong positive Net Advances and a high A/D Ratio (above 2:1) typically suggest broad market strength and strong participation in the upward move.
  • '; } else if (netAdvances > 0 && adRatio > 1) { interpretationHtml += '
  • Positive Net Advances and an A/D Ratio above 1:1 suggest more stocks advanced than declined, indicating positive market breadth.
  • '; } else if (netAdvances < 0 && adRatio < 0.5 && !isNaN(adRatio)) { interpretationHtml += '
  • Significant negative Net Advances and a low A/D Ratio (below 0.5:1) often indicate broad market weakness and strong selling pressure.
  • '; } else if (netAdvances < 0 && adRatio < 1 && !isNaN(adRatio)) { interpretationHtml += '
  • Negative Net Advances and an A/D Ratio below 1:1 suggest more stocks declined than advanced, indicating negative market breadth.
  • '; } else if (netAdvances === 0 || (adRatio === 1 && !isNaN(adRatio))) { interpretationHtml += '
  • Net Advances near zero and an A/D Ratio around 1:1 suggest a mixed or neutral market breadth, with advancing and declining issues roughly balanced.
  • '; } else if (adRatio === Infinity) { interpretationHtml += '
  • Advancing issues were present with zero declining issues, indicating very strong upward momentum for this period.
  • '; } else if (isNaN(adRatio) && advancing === 0 && declining === 0) { interpretationHtml += '
  • No advancing or declining issues reported; breadth is neutral or data is insufficient.
  • '; } if (!isNaN(newHighs) && !isNaN(newLows) && (newHighs > 0 || newLows > 0)) { if (nhNl > 0 && newHighs > newLows * 2) { interpretationHtml += '
  • A significantly positive New Highs - New Lows (NH-NL) value suggests bullish sentiment, with more stocks reaching new peaks than troughs.
  • '; } else if (nhNl < 0 && newLows > newHighs * 2) { interpretationHtml += '
  • A significantly negative NH-NL value suggests bearish sentiment, with more stocks hitting new lows.
  • '; } else if (nhNl !== 0) { interpretationHtml += `
  • The New Highs - New Lows difference is ${nhNl > 0 ? 'positive' : 'negative'}, indicating ${nhNl > 0 ? 'more new highs' : 'more new lows'}.
  • `; } else { interpretationHtml += `
  • New Highs and New Lows are balanced, suggesting indecision in terms of extreme price movements.
  • `; } } interpretationHtml += '
  • This is a snapshot for a single period. Consistent readings over multiple periods are more indicative of a trend. Always use in conjunction with other market indicators.
'; this.elements.interpretationDisplay.innerHTML = interpretationHtml; this.elements.resultsSection.style.display = 'block'; }, generatePDF: async function() { if (!window.jspdf || !window.html2canvas || Object.keys(this.resultsData).length === 0) { alert('Please analyze market breadth first to generate a PDF.'); return; } await new Promise(resolve => setTimeout(resolve, 50)); const i = this.resultsData.inputs; const o = this.resultsData.outputs; const pdfExportContainer = document.createElement('div'); pdfExportContainer.classList.add('mba-pdf-export-content'); pdfExportContainer.style.width = '800px'; let pdfHtml = `

Market Breadth Snapshot Report

`; pdfHtml += `
** Disclaimer **
This report is based on manually inputted data for a single period and is for educational/illustrative purposes ONLY. It does NOT provide investment advice. Market breadth should be analyzed over time with other indicators. Consult financial professionals.
`; pdfHtml += `

Input Data (for the period)

`; pdfHtml += `
Advancing Issues: ${this.formatNumber(i.advancing,0)}
`; pdfHtml += `
Declining Issues: ${this.formatNumber(i.declining,0)}
`; if(i.unchanged !== undefined && i.unchanged > 0) pdfHtml += `
Unchanged Issues: ${this.formatNumber(i.unchanged,0)}
`; if(i.newHighs !== undefined && i.newHighs > 0) pdfHtml += `
New 52-Week Highs: ${this.formatNumber(i.newHighs,0)}
`; if(i.newLows !== undefined && i.newLows > 0) pdfHtml += `
New 52-Week Lows: ${this.formatNumber(i.newLows,0)}
`; pdfHtml += `
`; pdfHtml += `

Calculated Breadth Statistics

`; pdfHtml += `
Net Advances: ${this.formatNumber(o.netAdvances,0)}
`; pdfHtml += `
Advance/Decline Ratio: ${o.adRatio === Infinity ? 'Infinite' : this.formatNumber(o.adRatio)}
`; if (o.totalIssues > 0) pdfHtml += `
Total Issues Traded: ${this.formatNumber(o.totalIssues,0)}
`; if (!isNaN(o.nhNl) && (i.newHighs > 0 || i.newLows > 0)) pdfHtml += `
New Highs - New Lows: ${this.formatNumber(o.nhNl,0)}
`; pdfHtml += `
`; const interpretationEl = this.elements.interpretationDisplay.cloneNode(true); interpretationEl.querySelector('h4').remove(); // Remove H4 for PDF pdfHtml += `

General Observations

${interpretationEl.innerHTML}
`; pdfExportContainer.innerHTML = pdfHtml; document.body.appendChild(pdfExportContainer); try { const canvas = await html2canvas(pdfExportContainer, { scale: 1.5, useCORS: true, logging: false, windowWidth: pdfExportContainer.scrollWidth }); document.body.removeChild(pdfExportContainer); const imgData = canvas.toDataURL('image/png'); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'p', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const imgProps = pdf.getImageProperties(imgData); let imgFinalWidth = pdfWidth - 40; let imgFinalHeight = (imgProps.height * imgFinalWidth) / imgProps.width; if (imgFinalHeight > pdfHeight - 40) { imgFinalHeight = pdfHeight - 40; imgFinalWidth = (imgProps.width * imgFinalHeight) / imgProps.height; } let currentY = 20; let heightProcessed = 0; const pageMargin = 20; const pageHeightAvailable = pdfHeight - 2 * pageMargin; while(heightProcessed < canvas.height) { let pageSegmentHeightOnCanvas = Math.min(canvas.height - heightProcessed, (pageHeightAvailable / imgFinalHeight) * canvas.height ); if (pageSegmentHeightOnCanvas <=0) break; const segmentCanvas = document.createElement('canvas'); segmentCanvas.width = canvas.width; segmentCanvas.height = pageSegmentHeightOnCanvas; const sctx = segmentCanvas.getContext('2d'); sctx.drawImage(canvas, 0, heightProcessed, canvas.width, pageSegmentHeightOnCanvas, 0, 0, canvas.width, pageSegmentHeightOnCanvas); const segmentImgData = segmentCanvas.toDataURL('image/png'); const segmentImgPropsPdf = pdf.getImageProperties(segmentImgData); let segmentRenderWidth = pdfWidth - 2 * pageMargin; let segmentRenderHeight = (segmentImgPropsPdf.height * segmentRenderWidth) / segmentImgPropsPdf.width; if(segmentRenderHeight > pageHeightAvailable) { segmentRenderHeight = pageHeightAvailable; segmentRenderWidth = (segmentImgPropsPdf.width * segmentRenderHeight) / segmentImgPropsPdf.height; } if(heightProcessed > 0) pdf.addPage(); pdf.addImage(segmentImgData, 'PNG', pageMargin, pageMargin, segmentRenderWidth, segmentRenderHeight); heightProcessed += pageSegmentHeightOnCanvas; } pdf.save('Market_Breadth_Snapshot.pdf'); } catch (error) { console.error("Error generating PDF:", error); alert("An error occurred while generating PDF."); if (document.body.contains(pdfExportContainer)) document.body.removeChild(pdfExportContainer); } } }; document.addEventListener('DOMContentLoaded', function() { mbaApp.init(); });
Scroll to Top