ta_bollinger
Calculate Bollinger Bands for market analysis using SMA and population standard deviation. Input data arrays and customize period or multiplier for precise technical insights on token performance.
Instructions
Compute Bollinger Bands (SMA + population stdev). Inputs: values:number[] (oldest→newest), period?:number(20), mult?:number(2).
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| mult | No | ||
| period | No | ||
| values | Yes |
Implementation Reference
- mcp-server.js:238-247 (handler)MCP tool handler for ta_bollinger: validates args (values array, optional period/mult) and calls taBoll"ta_bollinger": async (args) => { const values = Array.isArray(args?.values) ? args.values : null; const period = Number.isFinite(Number(args?.period)) ? Number(args.period) : 20; const mult = Number.isFinite(Number(args?.mult)) ? Number(args.mult) : 2; if (!values || values.length === 0) { return { content: textContent({ error:true, message:"'values' must be a non-empty array of numbers (oldest → newest)" }), isError:true }; } const out = taBoll(values, period, mult); return { content: textContent({ ok:true, ...out, period, mult }) }; },
- mcp-server.js:336-344 (registration)Tool registration in tools list: defines name, description, inputSchema, annotations for MCP tools/list{ name:"ta_bollinger", description:"Compute Bollinger Bands (SMA + population stdev). Inputs: values:number[] (oldest→newest), period?:number(20), mult?:number(2).", inputSchema:{ type:"object", properties:{ values:{ type:"array", items:{ type:"number" } }, period:{ type:"number" }, mult:{ type:"number" } }, required:["values"] }, annotations:{ title:"TA: Bollinger Bands", readOnlyHint:true, openWorldHint:false } },
- mcp-server.js:338-342 (schema)Input schema defining parameters: values (required array of numbers), optional period and multinputSchema:{ type:"object", properties:{ values:{ type:"array", items:{ type:"number" } }, period:{ type:"number" }, mult:{ type:"number" } }, required:["values"] },
- services/ta.js:57-95 (helper)Core implementation of Bollinger Bands: computes SMA (mean), stdev, upper/lower bands, last price, %B, and bandwidth using pure math on values arrayexport function bollinger(values, period = 20, mult = 2) { const arr = normalize(values); if (arr.length < period) return null; const slice = arr.slice(-period); const mean = avg(slice); if (!isFiniteNum(mean)) return null; const variance = avg(slice.map(v => (v - mean) * (v - mean))); const stdev = Math.sqrt(variance); if (!isFiniteNum(stdev)) return null; const upper = mean + mult * stdev; const lower = mean - mult * stdev; const last = arr[arr.length - 1]; // Avoid division by zero in derived metrics const denomBands = upper - lower; const denomMean = mean; const percentB = isFiniteNum(denomBands) && denomBands !== 0 ? (last - lower) / denomBands : null; const bandwidth = isFiniteNum(denomMean) && denomMean !== 0 ? (upper - lower) / denomMean : null; return { mean, upper, lower, last, percentB: isFiniteNum(percentB) ? percentB : null, bandwidth: isFiniteNum(bandwidth) ? bandwidth : null }; }
- services/ta.js:99-108 (helper)Helper to normalize input values array to finite numbers onlyfunction normalize(values) { // Coerce to numbers and drop non-finite entries to keep math stable. if (!Array.isArray(values)) return []; const out = []; for (let i = 0; i < values.length; i++) { const x = Number(values[i]); if (Number.isFinite(x)) out.push(x); } return out; }