Bối cảnh kỹ thuật tính sẵn cho LLM, dạng JSON hoặc văn bản.
Thay vì đưa nến thô cho LLM, context() tính sẵn xu hướng, chỉ báo, mốc giá, khối lượng và hiệu suất; prompt() trả cùng nội dung ở dạng văn bản để dán thẳng vào prompt.
import { vn } from "vnstock-js";
const ctx = await vn.stock("FPT").context();
const text = await vn.stock("FPT").prompt({ lang: "vi" }); // hoặc "en"
const past = await vn.stock("FPT").context({ asOf: "2026-10-10" });
const vni = await vn.index("VNINDEX").context();
Tuỳ chọn: lookback (số phiên dùng để tính, mặc định 200), asOf (YYYY-MM-DD, chỉ dùng nến tới hết phiên đó, để backtest không nhìn trước).
{
symbol: "FPT",
asOf: "2026-10-20",
trend: { direction: "bearish", strength: 1, rationale: "EMA20 < EMA50 < EMA200, ..." },
indicators: {
rsi14: 33.46,
macd: { line, signal, histogram, crossover: "bullish" | "bearish" | "none" },
sma: { 20, 50, 200 }, ema: { 20, 50, 200 },
bollinger: { upper, middle, lower, percentB },
atr14,
superTrend: { value, direction },
ichimoku: { tenkanSen, kijunSen, cloudTop, cloudBottom, priceVsCloud, tkCross },
},
levels: { support: number[], resistance: number[] },
volume: { today, avg20, signal: "above_average" | "below_average" | "normal", zscore },
performance: { change1d, change7d, change30d, change90d },
}
levels) tính bằng đồng với cổ phiếu, điểm với chỉ số.trend.strength từ 0 tới 1, tính theo độ dốc EMA20 tính bằng phần trăm nên không phụ thuộc mức giá.performance.change* là phần trăm so với giá đóng cửa 1, 7, 30, 90 phiên trước, cùng quy ước với changePct (-5 là giảm 5%).prompt() in giá theo dạng dễ đọc (57.5k), phù hợp để LLM đọc.
const market = await vn.market.context({ index: "VNINDEX" });
console.log(market.regime, market.rationale, market.liquidity.signal, market.notes);
regime là một trong trending_up, trending_down, sideways. Với asOf, độ rộng và khối ngoại là null và notes giải thích lý do.
Tool get_ai_context và to_ai_prompt của MCP Server gọi đúng các hàm này, nên Claude hay Cursor nhận cùng dữ liệu.