market-data-analyzer 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of market-data-analyzer might be problematic. Click here for more details.
- package/README.md +159 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +267 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/analyze_portfolio.d.ts +14 -0
- package/dist/tools/analyze_portfolio.d.ts.map +1 -0
- package/dist/tools/analyze_portfolio.js +155 -0
- package/dist/tools/analyze_portfolio.js.map +1 -0
- package/dist/tools/analyze_stock.d.ts +8 -0
- package/dist/tools/analyze_stock.d.ts.map +1 -0
- package/dist/tools/analyze_stock.js +211 -0
- package/dist/tools/analyze_stock.js.map +1 -0
- package/dist/tools/compare_assets.d.ts +8 -0
- package/dist/tools/compare_assets.d.ts.map +1 -0
- package/dist/tools/compare_assets.js +138 -0
- package/dist/tools/compare_assets.js.map +1 -0
- package/dist/tools/crypto_analysis.d.ts +8 -0
- package/dist/tools/crypto_analysis.d.ts.map +1 -0
- package/dist/tools/crypto_analysis.js +192 -0
- package/dist/tools/crypto_analysis.js.map +1 -0
- package/dist/tools/market_overview.d.ts +8 -0
- package/dist/tools/market_overview.d.ts.map +1 -0
- package/dist/tools/market_overview.js +223 -0
- package/dist/tools/market_overview.js.map +1 -0
- package/dist/tools/screen_stocks.d.ts +19 -0
- package/dist/tools/screen_stocks.d.ts.map +1 -0
- package/dist/tools/screen_stocks.js +122 -0
- package/dist/tools/screen_stocks.js.map +1 -0
- package/dist/types.d.ts +158 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/api.d.ts +37 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +228 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/cache.d.ts +20 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +52 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/math.d.ts +30 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +300 -0
- package/dist/utils/math.js.map +1 -0
- package/package.json +30 -0
- package/src/index.ts +329 -0
- package/src/tools/analyze_portfolio.ts +204 -0
- package/src/tools/analyze_stock.ts +204 -0
- package/src/tools/compare_assets.ts +181 -0
- package/src/tools/crypto_analysis.ts +221 -0
- package/src/tools/market_overview.ts +236 -0
- package/src/tools/screen_stocks.ts +154 -0
- package/src/types.ts +175 -0
- package/src/utils/api.ts +262 -0
- package/src/utils/cache.ts +65 -0
- package/src/utils/math.ts +332 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* market_overview -- Current market snapshot.
|
|
3
|
+
*
|
|
4
|
+
* Fetches live data for major indices, sector ETFs, and VIX
|
|
5
|
+
* from Yahoo Finance to build a comprehensive market summary.
|
|
6
|
+
*/
|
|
7
|
+
import { yahooQuote } from "../utils/api.js";
|
|
8
|
+
/** Index/ETF symbols to track */
|
|
9
|
+
const INDEX_SYMBOLS = [
|
|
10
|
+
"^GSPC", // S&P 500
|
|
11
|
+
"^IXIC", // NASDAQ Composite
|
|
12
|
+
"^DJI", // Dow Jones
|
|
13
|
+
"^RUT", // Russell 2000
|
|
14
|
+
"^VIX", // VIX
|
|
15
|
+
"^TNX", // 10-Year Treasury Yield
|
|
16
|
+
];
|
|
17
|
+
/** Sector ETFs (SPDR Select Sector) */
|
|
18
|
+
const SECTOR_ETFS = [
|
|
19
|
+
{ symbol: "XLK", name: "Technology" },
|
|
20
|
+
{ symbol: "XLV", name: "Healthcare" },
|
|
21
|
+
{ symbol: "XLF", name: "Financials" },
|
|
22
|
+
{ symbol: "XLY", name: "Consumer Discretionary" },
|
|
23
|
+
{ symbol: "XLP", name: "Consumer Staples" },
|
|
24
|
+
{ symbol: "XLE", name: "Energy" },
|
|
25
|
+
{ symbol: "XLI", name: "Industrials" },
|
|
26
|
+
{ symbol: "XLU", name: "Utilities" },
|
|
27
|
+
{ symbol: "XLRE", name: "Real Estate" },
|
|
28
|
+
{ symbol: "XLB", name: "Materials" },
|
|
29
|
+
{ symbol: "XLC", name: "Communication Services" },
|
|
30
|
+
];
|
|
31
|
+
/** Other reference symbols */
|
|
32
|
+
const OTHER_SYMBOLS = [
|
|
33
|
+
"BTC-USD", // Bitcoin
|
|
34
|
+
"ETH-USD", // Ethereum
|
|
35
|
+
"GC=F", // Gold futures
|
|
36
|
+
"CL=F", // Crude oil WTI
|
|
37
|
+
];
|
|
38
|
+
export async function handleMarketOverview() {
|
|
39
|
+
// Fetch all data in parallel
|
|
40
|
+
const allSymbols = [
|
|
41
|
+
...INDEX_SYMBOLS,
|
|
42
|
+
...SECTOR_ETFS.map((s) => s.symbol),
|
|
43
|
+
...OTHER_SYMBOLS,
|
|
44
|
+
];
|
|
45
|
+
const quotes = await yahooQuote(allSymbols);
|
|
46
|
+
const quoteMap = new Map(quotes.map((q) => [q.symbol, q]));
|
|
47
|
+
const lines = [];
|
|
48
|
+
lines.push("# Market Overview");
|
|
49
|
+
lines.push("");
|
|
50
|
+
lines.push(`*Live data as of ${new Date().toISOString().slice(0, 16)} UTC*`);
|
|
51
|
+
lines.push("");
|
|
52
|
+
// Major Indices
|
|
53
|
+
lines.push("## Major Indices");
|
|
54
|
+
lines.push("");
|
|
55
|
+
lines.push("| Index | Value | Change | Change % |");
|
|
56
|
+
lines.push("|-------|-------|--------|----------|");
|
|
57
|
+
const indexNames = {
|
|
58
|
+
"^GSPC": "S&P 500",
|
|
59
|
+
"^IXIC": "NASDAQ Composite",
|
|
60
|
+
"^DJI": "Dow Jones Industrial",
|
|
61
|
+
"^RUT": "Russell 2000",
|
|
62
|
+
"^VIX": "CBOE Volatility (VIX)",
|
|
63
|
+
"^TNX": "10-Year Treasury Yield",
|
|
64
|
+
};
|
|
65
|
+
for (const sym of INDEX_SYMBOLS) {
|
|
66
|
+
const q = quoteMap.get(sym);
|
|
67
|
+
if (!q || q.regularMarketPrice == null)
|
|
68
|
+
continue;
|
|
69
|
+
const name = indexNames[sym] ?? q.shortName ?? sym;
|
|
70
|
+
const price = q.regularMarketPrice;
|
|
71
|
+
const change = q.regularMarketChange ?? 0;
|
|
72
|
+
const changePct = q.regularMarketChangePercent ?? 0;
|
|
73
|
+
const sign = change >= 0 ? "+" : "";
|
|
74
|
+
const fmtPrice = price > 100
|
|
75
|
+
? price.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })
|
|
76
|
+
: price.toFixed(2);
|
|
77
|
+
lines.push(`| ${name} | ${fmtPrice} | ${sign}${change.toFixed(2)} | ${sign}${changePct.toFixed(2)}% |`);
|
|
78
|
+
}
|
|
79
|
+
lines.push("");
|
|
80
|
+
// VIX interpretation
|
|
81
|
+
const vix = quoteMap.get("^VIX");
|
|
82
|
+
if (vix?.regularMarketPrice != null) {
|
|
83
|
+
const vixVal = vix.regularMarketPrice;
|
|
84
|
+
lines.push("### VIX Interpretation");
|
|
85
|
+
lines.push("");
|
|
86
|
+
if (vixVal < 15) {
|
|
87
|
+
lines.push(`VIX at ${vixVal.toFixed(2)} -- **Low volatility.** Market complacency; conditions are calm.`);
|
|
88
|
+
}
|
|
89
|
+
else if (vixVal < 20) {
|
|
90
|
+
lines.push(`VIX at ${vixVal.toFixed(2)} -- **Normal.** Typical market conditions.`);
|
|
91
|
+
}
|
|
92
|
+
else if (vixVal < 25) {
|
|
93
|
+
lines.push(`VIX at ${vixVal.toFixed(2)} -- **Elevated.** Increasing uncertainty and hedging activity.`);
|
|
94
|
+
}
|
|
95
|
+
else if (vixVal < 30) {
|
|
96
|
+
lines.push(`VIX at ${vixVal.toFixed(2)} -- **High.** Significant fear in the market.`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
lines.push(`VIX at ${vixVal.toFixed(2)} -- **Very high.** Extreme fear; possible market stress event.`);
|
|
100
|
+
}
|
|
101
|
+
lines.push("");
|
|
102
|
+
}
|
|
103
|
+
// Sector Performance
|
|
104
|
+
lines.push("## Sector Performance");
|
|
105
|
+
lines.push("");
|
|
106
|
+
lines.push("| Sector | ETF | Price | Change % |");
|
|
107
|
+
lines.push("|--------|-----|-------|----------|");
|
|
108
|
+
const sectorData = [];
|
|
109
|
+
for (const etf of SECTOR_ETFS) {
|
|
110
|
+
const q = quoteMap.get(etf.symbol);
|
|
111
|
+
if (!q || q.regularMarketPrice == null)
|
|
112
|
+
continue;
|
|
113
|
+
const changePct = q.regularMarketChangePercent ?? 0;
|
|
114
|
+
const sign = changePct >= 0 ? "+" : "";
|
|
115
|
+
lines.push(`| ${etf.name} | ${etf.symbol} | $${q.regularMarketPrice.toFixed(2)} | ${sign}${changePct.toFixed(2)}% |`);
|
|
116
|
+
sectorData.push({ name: etf.name, symbol: etf.symbol, changePct });
|
|
117
|
+
}
|
|
118
|
+
lines.push("");
|
|
119
|
+
// Sector breadth
|
|
120
|
+
if (sectorData.length > 0) {
|
|
121
|
+
const positive = sectorData.filter((s) => s.changePct > 0).length;
|
|
122
|
+
const negative = sectorData.filter((s) => s.changePct < 0).length;
|
|
123
|
+
const bestSector = [...sectorData].sort((a, b) => b.changePct - a.changePct)[0];
|
|
124
|
+
const worstSector = [...sectorData].sort((a, b) => a.changePct - b.changePct)[0];
|
|
125
|
+
lines.push("### Sector Breadth");
|
|
126
|
+
lines.push("");
|
|
127
|
+
lines.push(`- Sectors advancing: ${positive}/${sectorData.length}`);
|
|
128
|
+
lines.push(`- Sectors declining: ${negative}/${sectorData.length}`);
|
|
129
|
+
lines.push(`- Best: **${bestSector.name}** (${bestSector.changePct >= 0 ? "+" : ""}${bestSector.changePct.toFixed(2)}%)`);
|
|
130
|
+
lines.push(`- Worst: **${worstSector.name}** (${worstSector.changePct >= 0 ? "+" : ""}${worstSector.changePct.toFixed(2)}%)`);
|
|
131
|
+
lines.push("");
|
|
132
|
+
}
|
|
133
|
+
// Crypto & Commodities
|
|
134
|
+
lines.push("## Crypto & Commodities");
|
|
135
|
+
lines.push("");
|
|
136
|
+
lines.push("| Asset | Price | Change % |");
|
|
137
|
+
lines.push("|-------|-------|----------|");
|
|
138
|
+
const otherNames = {
|
|
139
|
+
"BTC-USD": "Bitcoin",
|
|
140
|
+
"ETH-USD": "Ethereum",
|
|
141
|
+
"GC=F": "Gold",
|
|
142
|
+
"CL=F": "Crude Oil WTI",
|
|
143
|
+
};
|
|
144
|
+
for (const sym of OTHER_SYMBOLS) {
|
|
145
|
+
const q = quoteMap.get(sym);
|
|
146
|
+
if (!q || q.regularMarketPrice == null)
|
|
147
|
+
continue;
|
|
148
|
+
const name = otherNames[sym] ?? q.shortName ?? sym;
|
|
149
|
+
const changePct = q.regularMarketChangePercent ?? 0;
|
|
150
|
+
const sign = changePct >= 0 ? "+" : "";
|
|
151
|
+
lines.push(`| ${name} | $${q.regularMarketPrice.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })} | ${sign}${changePct.toFixed(2)}% |`);
|
|
152
|
+
}
|
|
153
|
+
lines.push("");
|
|
154
|
+
// Market Breadth / Sentiment estimate
|
|
155
|
+
lines.push("## Market Sentiment");
|
|
156
|
+
lines.push("");
|
|
157
|
+
const spx = quoteMap.get("^GSPC");
|
|
158
|
+
const spxChange = spx?.regularMarketChangePercent ?? 0;
|
|
159
|
+
const vixVal = vix?.regularMarketPrice ?? 20;
|
|
160
|
+
let sentimentScore = 50;
|
|
161
|
+
// SPX contribution
|
|
162
|
+
if (spxChange > 1)
|
|
163
|
+
sentimentScore += 15;
|
|
164
|
+
else if (spxChange > 0.5)
|
|
165
|
+
sentimentScore += 10;
|
|
166
|
+
else if (spxChange > 0)
|
|
167
|
+
sentimentScore += 5;
|
|
168
|
+
else if (spxChange < -1)
|
|
169
|
+
sentimentScore -= 15;
|
|
170
|
+
else if (spxChange < -0.5)
|
|
171
|
+
sentimentScore -= 10;
|
|
172
|
+
else if (spxChange < 0)
|
|
173
|
+
sentimentScore -= 5;
|
|
174
|
+
// VIX contribution
|
|
175
|
+
if (vixVal < 15)
|
|
176
|
+
sentimentScore += 10;
|
|
177
|
+
else if (vixVal < 20)
|
|
178
|
+
sentimentScore += 5;
|
|
179
|
+
else if (vixVal > 30)
|
|
180
|
+
sentimentScore -= 15;
|
|
181
|
+
else if (vixVal > 25)
|
|
182
|
+
sentimentScore -= 10;
|
|
183
|
+
else if (vixVal > 20)
|
|
184
|
+
sentimentScore -= 5;
|
|
185
|
+
// Sector breadth
|
|
186
|
+
if (sectorData.length > 0) {
|
|
187
|
+
const posRatio = sectorData.filter((s) => s.changePct > 0).length / sectorData.length;
|
|
188
|
+
if (posRatio > 0.7)
|
|
189
|
+
sentimentScore += 10;
|
|
190
|
+
else if (posRatio > 0.5)
|
|
191
|
+
sentimentScore += 5;
|
|
192
|
+
else if (posRatio < 0.3)
|
|
193
|
+
sentimentScore -= 10;
|
|
194
|
+
}
|
|
195
|
+
sentimentScore = Math.max(0, Math.min(100, sentimentScore));
|
|
196
|
+
const sentiment = sentimentScore >= 60 ? "BULLISH" : sentimentScore <= 40 ? "BEARISH" : "NEUTRAL";
|
|
197
|
+
lines.push(`**Sentiment: ${sentiment}** (Score: ${sentimentScore}/100)`);
|
|
198
|
+
lines.push("");
|
|
199
|
+
// Key observations
|
|
200
|
+
lines.push("## Key Observations");
|
|
201
|
+
lines.push("");
|
|
202
|
+
if (spx) {
|
|
203
|
+
const val = spx.regularMarketPrice?.toLocaleString("en-US", { minimumFractionDigits: 2 }) ?? "N/A";
|
|
204
|
+
lines.push(`- S&P 500 at ${val} (${spxChange >= 0 ? "+" : ""}${spxChange.toFixed(2)}%).`);
|
|
205
|
+
}
|
|
206
|
+
const btc = quoteMap.get("BTC-USD");
|
|
207
|
+
if (btc && btc.regularMarketChangePercent != null && Math.abs(btc.regularMarketChangePercent) > 2) {
|
|
208
|
+
lines.push(`- Crypto ${btc.regularMarketChangePercent > 0 ? "rallying" : "selling off"}: Bitcoin ${btc.regularMarketChangePercent >= 0 ? "+" : ""}${btc.regularMarketChangePercent.toFixed(1)}%.`);
|
|
209
|
+
}
|
|
210
|
+
const oil = quoteMap.get("CL=F");
|
|
211
|
+
if (oil && oil.regularMarketChangePercent != null && Math.abs(oil.regularMarketChangePercent) > 1) {
|
|
212
|
+
lines.push(`- Oil ${oil.regularMarketChangePercent > 0 ? "rising" : "falling"} (${oil.regularMarketChangePercent >= 0 ? "+" : ""}${oil.regularMarketChangePercent.toFixed(1)}%).`);
|
|
213
|
+
}
|
|
214
|
+
const gold = quoteMap.get("GC=F");
|
|
215
|
+
if (gold && gold.regularMarketChangePercent != null && gold.regularMarketChangePercent > 0.5) {
|
|
216
|
+
lines.push(`- Gold up ${gold.regularMarketChangePercent.toFixed(1)}% -- possible flight to safety.`);
|
|
217
|
+
}
|
|
218
|
+
if (vixVal > 25) {
|
|
219
|
+
lines.push("- Elevated VIX suggests caution; hedging demand is high.");
|
|
220
|
+
}
|
|
221
|
+
return lines.join("\n");
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=market_overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market_overview.js","sourceRoot":"","sources":["../../src/tools/market_overview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* screen_stocks -- Screen stocks by criteria using Yahoo Finance data.
|
|
3
|
+
*
|
|
4
|
+
* Fetches live quotes for a universe of popular stocks and filters
|
|
5
|
+
* by market cap, P/E ratio, sector, volume, etc.
|
|
6
|
+
*/
|
|
7
|
+
export interface ScreenCriteria {
|
|
8
|
+
min_market_cap?: number;
|
|
9
|
+
max_market_cap?: number;
|
|
10
|
+
min_pe?: number;
|
|
11
|
+
max_pe?: number;
|
|
12
|
+
sector?: string;
|
|
13
|
+
min_volume?: number;
|
|
14
|
+
min_price?: number;
|
|
15
|
+
max_price?: number;
|
|
16
|
+
limit?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function handleScreenStocks(criteria: ScreenCriteria): Promise<string>;
|
|
19
|
+
//# sourceMappingURL=screen_stocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen_stocks.d.ts","sourceRoot":"","sources":["../../src/tools/screen_stocks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA2ClF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* screen_stocks -- Screen stocks by criteria using Yahoo Finance data.
|
|
3
|
+
*
|
|
4
|
+
* Fetches live quotes for a universe of popular stocks and filters
|
|
5
|
+
* by market cap, P/E ratio, sector, volume, etc.
|
|
6
|
+
*/
|
|
7
|
+
import { yahooScreener, POPULAR_SYMBOLS } from "../utils/api.js";
|
|
8
|
+
import { formatCurrency, formatVolume } from "../utils/math.js";
|
|
9
|
+
export async function handleScreenStocks(criteria) {
|
|
10
|
+
// Fetch quotes for the full symbol universe
|
|
11
|
+
let quotes = await yahooScreener(POPULAR_SYMBOLS);
|
|
12
|
+
// Apply filters
|
|
13
|
+
if (criteria.min_market_cap !== undefined) {
|
|
14
|
+
quotes = quotes.filter((q) => (q.marketCap ?? 0) >= criteria.min_market_cap);
|
|
15
|
+
}
|
|
16
|
+
if (criteria.max_market_cap !== undefined) {
|
|
17
|
+
quotes = quotes.filter((q) => (q.marketCap ?? Infinity) <= criteria.max_market_cap);
|
|
18
|
+
}
|
|
19
|
+
if (criteria.min_pe !== undefined) {
|
|
20
|
+
quotes = quotes.filter((q) => q.trailingPE != null && q.trailingPE >= criteria.min_pe);
|
|
21
|
+
}
|
|
22
|
+
if (criteria.max_pe !== undefined) {
|
|
23
|
+
quotes = quotes.filter((q) => q.trailingPE != null && q.trailingPE <= criteria.max_pe);
|
|
24
|
+
}
|
|
25
|
+
if (criteria.sector !== undefined) {
|
|
26
|
+
const sectorLower = criteria.sector.toLowerCase();
|
|
27
|
+
quotes = quotes.filter((q) => (q.sector ?? "").toLowerCase().includes(sectorLower) ||
|
|
28
|
+
(q.industry ?? "").toLowerCase().includes(sectorLower));
|
|
29
|
+
}
|
|
30
|
+
if (criteria.min_volume !== undefined) {
|
|
31
|
+
quotes = quotes.filter((q) => (q.regularMarketVolume ?? 0) >= criteria.min_volume);
|
|
32
|
+
}
|
|
33
|
+
if (criteria.min_price !== undefined) {
|
|
34
|
+
quotes = quotes.filter((q) => (q.regularMarketPrice ?? 0) >= criteria.min_price);
|
|
35
|
+
}
|
|
36
|
+
if (criteria.max_price !== undefined) {
|
|
37
|
+
quotes = quotes.filter((q) => (q.regularMarketPrice ?? Infinity) <= criteria.max_price);
|
|
38
|
+
}
|
|
39
|
+
// Sort by market cap descending
|
|
40
|
+
quotes.sort((a, b) => (b.marketCap ?? 0) - (a.marketCap ?? 0));
|
|
41
|
+
// Limit results
|
|
42
|
+
const limit = criteria.limit ?? 25;
|
|
43
|
+
const total = quotes.length;
|
|
44
|
+
quotes = quotes.slice(0, limit);
|
|
45
|
+
return formatScreenResults(quotes, criteria, total);
|
|
46
|
+
}
|
|
47
|
+
function formatScreenResults(quotes, criteria, totalMatches) {
|
|
48
|
+
const lines = [];
|
|
49
|
+
lines.push("# Stock Screener Results");
|
|
50
|
+
lines.push("");
|
|
51
|
+
// Filters applied
|
|
52
|
+
const filters = [];
|
|
53
|
+
if (criteria.min_market_cap)
|
|
54
|
+
filters.push(`Min Mkt Cap: ${formatCurrency(criteria.min_market_cap)}`);
|
|
55
|
+
if (criteria.max_market_cap)
|
|
56
|
+
filters.push(`Max Mkt Cap: ${formatCurrency(criteria.max_market_cap)}`);
|
|
57
|
+
if (criteria.min_pe)
|
|
58
|
+
filters.push(`Min P/E: ${criteria.min_pe}`);
|
|
59
|
+
if (criteria.max_pe)
|
|
60
|
+
filters.push(`Max P/E: ${criteria.max_pe}`);
|
|
61
|
+
if (criteria.sector)
|
|
62
|
+
filters.push(`Sector: ${criteria.sector}`);
|
|
63
|
+
if (criteria.min_volume)
|
|
64
|
+
filters.push(`Min Volume: ${formatVolume(criteria.min_volume)}`);
|
|
65
|
+
if (criteria.min_price)
|
|
66
|
+
filters.push(`Min Price: $${criteria.min_price}`);
|
|
67
|
+
if (criteria.max_price)
|
|
68
|
+
filters.push(`Max Price: $${criteria.max_price}`);
|
|
69
|
+
if (filters.length > 0) {
|
|
70
|
+
lines.push(`**Filters:** ${filters.join(" | ")}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
lines.push("**Filters:** None (showing full universe)");
|
|
74
|
+
}
|
|
75
|
+
lines.push(`**Matches:** ${totalMatches} stocks (showing top ${quotes.length})`);
|
|
76
|
+
lines.push("");
|
|
77
|
+
if (quotes.length === 0) {
|
|
78
|
+
lines.push("_No stocks match the specified criteria. Try broadening your filters._");
|
|
79
|
+
return lines.join("\n");
|
|
80
|
+
}
|
|
81
|
+
// Results table
|
|
82
|
+
lines.push("| Symbol | Name | Price | Chg% | Volume | Mkt Cap | P/E | Sector |");
|
|
83
|
+
lines.push("|--------|------|-------|------|--------|---------|-----|--------|");
|
|
84
|
+
for (const q of quotes) {
|
|
85
|
+
const price = q.regularMarketPrice?.toFixed(2) ?? "N/A";
|
|
86
|
+
const changePct = q.regularMarketChangePercent != null
|
|
87
|
+
? `${q.regularMarketChangePercent >= 0 ? "+" : ""}${q.regularMarketChangePercent.toFixed(2)}%`
|
|
88
|
+
: "N/A";
|
|
89
|
+
const vol = q.regularMarketVolume ? formatVolume(q.regularMarketVolume) : "N/A";
|
|
90
|
+
const cap = q.marketCap ? formatCurrency(q.marketCap) : "N/A";
|
|
91
|
+
const pe = q.trailingPE?.toFixed(1) ?? "N/A";
|
|
92
|
+
const name = (q.shortName ?? q.longName ?? q.symbol).slice(0, 25);
|
|
93
|
+
const sector = q.sector ?? "--";
|
|
94
|
+
lines.push(`| ${q.symbol} | ${name} | $${price} | ${changePct} | ${vol} | ${cap} | ${pe} | ${sector} |`);
|
|
95
|
+
}
|
|
96
|
+
lines.push("");
|
|
97
|
+
// Quick stats
|
|
98
|
+
const withPE = quotes.filter((q) => q.trailingPE != null);
|
|
99
|
+
if (withPE.length > 0) {
|
|
100
|
+
const avgPE = withPE.reduce((s, q) => s + q.trailingPE, 0) / withPE.length;
|
|
101
|
+
const minPE = Math.min(...withPE.map((q) => q.trailingPE));
|
|
102
|
+
const maxPE = Math.max(...withPE.map((q) => q.trailingPE));
|
|
103
|
+
lines.push("## P/E Statistics");
|
|
104
|
+
lines.push("");
|
|
105
|
+
lines.push(`- Average P/E: ${avgPE.toFixed(1)}`);
|
|
106
|
+
lines.push(`- P/E Range: ${minPE.toFixed(1)} - ${maxPE.toFixed(1)}`);
|
|
107
|
+
lines.push("");
|
|
108
|
+
}
|
|
109
|
+
// Top gainers/losers in results
|
|
110
|
+
const sorted = [...quotes].filter((q) => q.regularMarketChangePercent != null);
|
|
111
|
+
if (sorted.length >= 3) {
|
|
112
|
+
sorted.sort((a, b) => (b.regularMarketChangePercent ?? 0) - (a.regularMarketChangePercent ?? 0));
|
|
113
|
+
const top3 = sorted.slice(0, 3);
|
|
114
|
+
const bottom3 = sorted.slice(-3).reverse();
|
|
115
|
+
lines.push("## Notable Movers (within results)");
|
|
116
|
+
lines.push("");
|
|
117
|
+
lines.push("**Top gainers:** " + top3.map((q) => `${q.symbol} (${q.regularMarketChangePercent >= 0 ? "+" : ""}${q.regularMarketChangePercent.toFixed(2)}%)`).join(", "));
|
|
118
|
+
lines.push("**Top losers:** " + bottom3.map((q) => `${q.symbol} (${q.regularMarketChangePercent.toFixed(2)}%)`).join(", "));
|
|
119
|
+
}
|
|
120
|
+
return lines.join("\n");
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=screen_stocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen_stocks.js","sourceRoot":"","sources":["../../src/tools/screen_stocks.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the Market Data Analyzer MCP server.
|
|
3
|
+
*/
|
|
4
|
+
export interface YahooQuote {
|
|
5
|
+
symbol: string;
|
|
6
|
+
shortName?: string;
|
|
7
|
+
longName?: string;
|
|
8
|
+
regularMarketPrice?: number;
|
|
9
|
+
regularMarketChange?: number;
|
|
10
|
+
regularMarketChangePercent?: number;
|
|
11
|
+
regularMarketVolume?: number;
|
|
12
|
+
regularMarketDayHigh?: number;
|
|
13
|
+
regularMarketDayLow?: number;
|
|
14
|
+
regularMarketOpen?: number;
|
|
15
|
+
regularMarketPreviousClose?: number;
|
|
16
|
+
fiftyTwoWeekHigh?: number;
|
|
17
|
+
fiftyTwoWeekLow?: number;
|
|
18
|
+
fiftyDayAverage?: number;
|
|
19
|
+
twoHundredDayAverage?: number;
|
|
20
|
+
marketCap?: number;
|
|
21
|
+
trailingPE?: number;
|
|
22
|
+
forwardPE?: number;
|
|
23
|
+
priceToBook?: number;
|
|
24
|
+
trailingAnnualDividendYield?: number;
|
|
25
|
+
sector?: string;
|
|
26
|
+
industry?: string;
|
|
27
|
+
averageDailyVolume3Month?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface YahooChartPoint {
|
|
30
|
+
date: number;
|
|
31
|
+
open: number;
|
|
32
|
+
high: number;
|
|
33
|
+
low: number;
|
|
34
|
+
close: number;
|
|
35
|
+
volume: number;
|
|
36
|
+
}
|
|
37
|
+
export interface CoinGeckoMarketData {
|
|
38
|
+
id: string;
|
|
39
|
+
symbol: string;
|
|
40
|
+
name: string;
|
|
41
|
+
current_price: number;
|
|
42
|
+
market_cap: number;
|
|
43
|
+
market_cap_rank: number;
|
|
44
|
+
total_volume: number;
|
|
45
|
+
high_24h: number;
|
|
46
|
+
low_24h: number;
|
|
47
|
+
price_change_24h: number;
|
|
48
|
+
price_change_percentage_24h: number;
|
|
49
|
+
price_change_percentage_7d_in_currency?: number;
|
|
50
|
+
price_change_percentage_30d_in_currency?: number;
|
|
51
|
+
market_cap_change_percentage_24h: number;
|
|
52
|
+
circulating_supply: number;
|
|
53
|
+
total_supply: number | null;
|
|
54
|
+
max_supply: number | null;
|
|
55
|
+
ath: number;
|
|
56
|
+
ath_change_percentage: number;
|
|
57
|
+
ath_date: string;
|
|
58
|
+
atl: number;
|
|
59
|
+
atl_change_percentage: number;
|
|
60
|
+
atl_date: string;
|
|
61
|
+
}
|
|
62
|
+
export interface CoinGeckoGlobalData {
|
|
63
|
+
total_market_cap: Record<string, number>;
|
|
64
|
+
total_volume: Record<string, number>;
|
|
65
|
+
market_cap_percentage: Record<string, number>;
|
|
66
|
+
market_cap_change_percentage_24h_usd: number;
|
|
67
|
+
active_cryptocurrencies: number;
|
|
68
|
+
}
|
|
69
|
+
export interface StockAnalysis {
|
|
70
|
+
symbol: string;
|
|
71
|
+
name: string;
|
|
72
|
+
price: number;
|
|
73
|
+
change: number;
|
|
74
|
+
changePercent: number;
|
|
75
|
+
volume: number;
|
|
76
|
+
marketCap: number;
|
|
77
|
+
peRatio: number | null;
|
|
78
|
+
high52w: number;
|
|
79
|
+
low52w: number;
|
|
80
|
+
sma20: number | null;
|
|
81
|
+
sma50: number | null;
|
|
82
|
+
sma200: number | null;
|
|
83
|
+
rsi14: number | null;
|
|
84
|
+
macd: {
|
|
85
|
+
line: number;
|
|
86
|
+
signal: number;
|
|
87
|
+
histogram: number;
|
|
88
|
+
} | null;
|
|
89
|
+
supportLevels: number[];
|
|
90
|
+
resistanceLevels: number[];
|
|
91
|
+
priceHistory: YahooChartPoint[];
|
|
92
|
+
}
|
|
93
|
+
export interface PortfolioPosition {
|
|
94
|
+
symbol: string;
|
|
95
|
+
shares: number;
|
|
96
|
+
avgCost: number;
|
|
97
|
+
currentPrice: number;
|
|
98
|
+
marketValue: number;
|
|
99
|
+
costBasis: number;
|
|
100
|
+
pnl: number;
|
|
101
|
+
pnlPercent: number;
|
|
102
|
+
allocationPercent: number;
|
|
103
|
+
}
|
|
104
|
+
export interface PortfolioAnalysis {
|
|
105
|
+
totalValue: number;
|
|
106
|
+
totalCost: number;
|
|
107
|
+
totalPnl: number;
|
|
108
|
+
totalPnlPercent: number;
|
|
109
|
+
positions: PortfolioPosition[];
|
|
110
|
+
diversificationScore: number;
|
|
111
|
+
riskMetrics: {
|
|
112
|
+
concentrationRisk: string;
|
|
113
|
+
largestPosition: string;
|
|
114
|
+
largestPositionPct: number;
|
|
115
|
+
sectorBreakdown: Record<string, number>;
|
|
116
|
+
};
|
|
117
|
+
warnings: string[];
|
|
118
|
+
}
|
|
119
|
+
export interface ScreenerResult {
|
|
120
|
+
symbol: string;
|
|
121
|
+
name: string;
|
|
122
|
+
price: number;
|
|
123
|
+
changePercent: number;
|
|
124
|
+
marketCap: number;
|
|
125
|
+
peRatio: number | null;
|
|
126
|
+
volume: number;
|
|
127
|
+
sector?: string;
|
|
128
|
+
}
|
|
129
|
+
export interface AssetComparison {
|
|
130
|
+
symbol: string;
|
|
131
|
+
name: string;
|
|
132
|
+
totalReturn: number;
|
|
133
|
+
annualizedReturn: number;
|
|
134
|
+
volatility: number;
|
|
135
|
+
sharpeRatio: number;
|
|
136
|
+
maxDrawdown: number;
|
|
137
|
+
currentPrice: number;
|
|
138
|
+
}
|
|
139
|
+
export interface CryptoAnalysisResult {
|
|
140
|
+
id: string;
|
|
141
|
+
symbol: string;
|
|
142
|
+
name: string;
|
|
143
|
+
price: number;
|
|
144
|
+
change24h: number;
|
|
145
|
+
changePct24h: number;
|
|
146
|
+
volume24h: number;
|
|
147
|
+
marketCap: number;
|
|
148
|
+
marketCapRank: number;
|
|
149
|
+
circulatingSupply: number;
|
|
150
|
+
totalSupply: number | null;
|
|
151
|
+
maxSupply: number | null;
|
|
152
|
+
ath: number;
|
|
153
|
+
athChangePct: number;
|
|
154
|
+
athDate: string;
|
|
155
|
+
dominance: number | null;
|
|
156
|
+
fearGreedApprox: string;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,2BAA2B,EAAE,MAAM,CAAC;IACpC,sCAAsC,CAAC,EAAE,MAAM,CAAC;IAChD,uCAAuC,CAAC,EAAE,MAAM,CAAC;IACjD,gCAAgC,EAAE,MAAM,CAAC;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,oCAAoC,EAAE,MAAM,CAAC;IAC7C,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE;QACX,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACzC,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API helpers for Yahoo Finance and CoinGecko free endpoints.
|
|
3
|
+
*
|
|
4
|
+
* Yahoo Finance: Uses the v8 finance quote/chart endpoints (publicly accessible).
|
|
5
|
+
* CoinGecko: Uses the free /api/v3 endpoints (no API key needed, rate-limited).
|
|
6
|
+
*/
|
|
7
|
+
import type { YahooQuote, YahooChartPoint, CoinGeckoMarketData, CoinGeckoGlobalData } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Fetch a quote for one or more symbols via Yahoo Finance v6 quote endpoint.
|
|
10
|
+
*/
|
|
11
|
+
export declare function yahooQuote(symbols: string[]): Promise<YahooQuote[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Fetch historical chart data from Yahoo Finance.
|
|
14
|
+
* @param symbol Ticker symbol
|
|
15
|
+
* @param range "1mo", "3mo", "6mo", "1y", "5y"
|
|
16
|
+
* @param interval "1d", "1wk", "1mo"
|
|
17
|
+
*/
|
|
18
|
+
export declare function yahooChart(symbol: string, range?: string, interval?: string): Promise<YahooChartPoint[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Screen stocks using Yahoo Finance's screener or quote list.
|
|
21
|
+
* Fetches quotes for a predefined set of popular tickers and filters them.
|
|
22
|
+
*/
|
|
23
|
+
export declare function yahooScreener(symbols: string[]): Promise<YahooQuote[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Fetch market data for one or more coins by ID.
|
|
26
|
+
*/
|
|
27
|
+
export declare function coingeckoMarkets(ids: string[], vsCurrency?: string): Promise<CoinGeckoMarketData[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Fetch global crypto market data.
|
|
30
|
+
*/
|
|
31
|
+
export declare function coingeckoGlobal(): Promise<CoinGeckoGlobalData>;
|
|
32
|
+
/**
|
|
33
|
+
* Map common symbols to CoinGecko IDs.
|
|
34
|
+
*/
|
|
35
|
+
export declare function symbolToCoinGeckoId(symbol: string): string;
|
|
36
|
+
export declare const POPULAR_SYMBOLS: string[];
|
|
37
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AA0BrB;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAgCzE;AAqCD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAc,EACrB,QAAQ,GAAE,MAAa,GACtB,OAAO,CAAC,eAAe,EAAE,CAAC,CAgC5B;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,UAAU,EAAE,CAAC,CASvB;AAQD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EAAE,EACb,UAAU,GAAE,MAAc,GACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAShC;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAQpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAMD,eAAO,MAAM,eAAe,UAiB3B,CAAC"}
|