@lacspace/patterns 0.0.0-stage → 1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core.ts","../src/patterns.ts","../src/altCharts.ts","../src/index.ts"],"names":["bars","a","z"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Shared bar type and the few series helpers the detectors need (Wilder ATR, volume profile). */\n\nexport interface Bar {\n /** Unix seconds (bar open). */\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\nexport type Series = (number | null)[];\n\n/** A horizontal box / line on the price pane. */\nexport interface StudyZone {\n /** First bar index. */\n from: number;\n /** Last bar index; null = runs to the right edge. */\n to: number | null;\n top: number;\n bottom: number;\n color: string;\n label?: string;\n /** Dashed outline / line instead of solid. */\n dashed?: boolean;\n}\n\nconst nulls = (n: number): Series => new Array(n).fill(null);\n\n/** Wilder's moving average (RMA), seeded with the SMA of the first `n` values. */\nexport function rma(values: Series, n: number): Series {\n const out = nulls(values.length);\n if (n < 1) return out;\n let prev: number | null = null;\n let seed = 0;\n let seen = 0;\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (v == null) continue;\n if (prev == null) {\n seed += v;\n seen++;\n if (seen === n) {\n prev = seed / n;\n out[i] = prev;\n }\n continue;\n }\n prev = (prev * (n - 1) + v) / n;\n out[i] = prev;\n }\n return out;\n}\n\nexport function trueRange(bars: Bar[]): Series {\n return bars.map((b, i) => {\n if (i === 0) return b.high - b.low;\n const pc = bars[i - 1].close;\n return Math.max(b.high - b.low, Math.abs(b.high - pc), Math.abs(b.low - pc));\n });\n}\n\n/** Average true range (Wilder). */\nexport function atr(bars: Bar[], n = 14): Series {\n return rma(trueRange(bars), n);\n}\n\n/** Volume by price: `rows` buckets, each with up and down volume, plus POC and the 70% value area. */\nexport function volumeProfile(bars: Bar[], rows = 24) {\n if (!bars.length) return null;\n let lo = Infinity, hi = -Infinity;\n for (const b of bars) { lo = Math.min(lo, b.low); hi = Math.max(hi, b.high); }\n if (!(hi > lo)) return null;\n const step = (hi - lo) / rows;\n const buckets = Array.from({ length: rows }, (_, k) => ({ lo: lo + k * step, hi: lo + (k + 1) * step, up: 0, down: 0 }));\n for (const b of bars) {\n if (!b.volume) continue;\n // Spread each bar's volume evenly over the price range it covered.\n const a = Math.max(0, Math.floor((b.low - lo) / step));\n const z = Math.min(rows - 1, Math.floor((b.high - lo) / step));\n const share = b.volume / (z - a + 1);\n for (let k = a; k <= z; k++) {\n if (b.close >= b.open) buckets[k].up += share; else buckets[k].down += share;\n }\n }\n let poc = 0;\n buckets.forEach((x, k) => { if (x.up + x.down > buckets[poc].up + buckets[poc].down) poc = k; });\n const total = buckets.reduce((s, x) => s + x.up + x.down, 0);\n let inVa = buckets[poc].up + buckets[poc].down, a = poc, z = poc;\n while (inVa < total * 0.7 && (a > 0 || z < rows - 1)) {\n const below = a > 0 ? buckets[a - 1].up + buckets[a - 1].down : -1;\n const above = z < rows - 1 ? buckets[z + 1].up + buckets[z + 1].down : -1;\n if (above >= below) { z++; inVa += above; } else { a--; inVa += below; }\n }\n return { buckets, poc, vaLow: buckets[a].lo, vaHigh: buckets[z].hi, max: Math.max(...buckets.map((x) => x.up + x.down)) };\n}\n","/**\n * Pattern recognition on recorded bars: harmonic patterns (Gartley, Bat,\n * Butterfly, Crab, Cypher, AB=CD), an Elliott-wave impulse count, classic chart\n * patterns (double tops/bottoms, head & shoulders, triangles, wedges,\n * channels) and per-session market / volume profiles.\n *\n * Everything is found from ATR-sized swings, so the same settings work on a\n * 5-minute chart and a weekly one. These are rule-based detections of\n * geometry already on the chart — descriptive, never a forecast. Wave counts\n * in particular are subjective; this shows one count that obeys the rules.\n */\nimport { atr, volumeProfile, type Bar, type StudyZone } from \"./core\";\n\n/** A polyline on the price pane. `i` is a bar index (may run past the last bar for projections). */\nexport interface StudyPath {\n pts: { i: number; p: number; label?: string }[];\n color: string;\n width?: number;\n dashed?: boolean;\n /** Fill the closed polygon with this colour at low opacity. */\n fill?: boolean;\n /** Name drawn beside the last point (or `labelAt`). */\n label?: string;\n labelAt?: number;\n}\n\n/** A histogram drawn inside one session (TPO letters or volume). */\nexport interface StudyProfile {\n from: number;\n to: number;\n rows: { lo: number; hi: number; v: number; up?: number; letters?: string }[];\n poc: number;\n vaLow: number;\n vaHigh: number;\n /** Initial balance (first hour) for TPO profiles. */\n ib?: { lo: number; hi: number };\n kind: \"tpo\" | \"vol\";\n color: string;\n}\n\nexport interface Pivot {\n i: number;\n p: number;\n hi: boolean;\n}\n\n/* ── swings ─────────────────────────────────────────────────────────────── */\n\n/**\n * Alternating swing highs and lows: a swing is confirmed once price moves\n * `k` × ATR(14) away from it. The last, still-forming extreme is returned as\n * `tail` (not yet confirmed).\n */\nexport function swings(bars: Bar[], k = 2): { piv: Pivot[]; tail: Pivot | null; atr: number[] } {\n const n = bars.length;\n const a = atr(bars, 14);\n const at: number[] = new Array(n);\n let rs = 0;\n for (let i = 0; i < n; i++) {\n rs += bars[i].high - bars[i].low;\n at[i] = a[i] ?? rs / (i + 1);\n }\n const piv: Pivot[] = [];\n if (n < 3) return { piv, tail: null, atr: at };\n let trend = 0;\n let hiI = 0;\n let loI = 0;\n for (let i = 1; i < n; i++) {\n const t = at[i] * k;\n const b = bars[i];\n if (trend === 0) {\n if (b.high >= bars[hiI].high) hiI = i;\n if (b.low <= bars[loI].low) loI = i;\n if (bars[hiI].high - bars[loI].low >= t) {\n if (hiI > loI) { piv.push({ i: loI, p: bars[loI].low, hi: false }); trend = 1; }\n else { piv.push({ i: hiI, p: bars[hiI].high, hi: true }); trend = -1; }\n }\n } else if (trend === 1) {\n if (b.high >= bars[hiI].high) hiI = i;\n else if (bars[hiI].high - b.low >= t) { piv.push({ i: hiI, p: bars[hiI].high, hi: true }); trend = -1; loI = i; }\n } else {\n if (b.low <= bars[loI].low) loI = i;\n else if (b.high - bars[loI].low >= t) { piv.push({ i: loI, p: bars[loI].low, hi: false }); trend = 1; hiI = i; }\n }\n }\n const tail = trend === 1 ? { i: hiI, p: bars[hiI].high, hi: true } : trend === -1 ? { i: loI, p: bars[loI].low, hi: false } : null;\n return { piv, tail, atr: at };\n}\n\nconst r2 = (n: number) => Math.round(n * 100) / 100;\nconst fmt = (n: number) => (Math.abs(n) >= 1000 ? n.toFixed(0) : n.toFixed(2));\n\n/* ── harmonic patterns ──────────────────────────────────────────────────── */\n\ntype Range = [number, number];\ninterface HarmDef {\n name: string;\n ab: Range;\n bc: Range;\n cd: Range;\n /** D as a retracement / extension of XA. */\n xd: Range;\n}\nconst HARMONICS: HarmDef[] = [\n { name: \"Gartley\", ab: [0.618, 0.618], bc: [0.382, 0.886], cd: [1.13, 1.618], xd: [0.786, 0.786] },\n { name: \"Bat\", ab: [0.382, 0.5], bc: [0.382, 0.886], cd: [1.618, 2.618], xd: [0.886, 0.886] },\n { name: \"Alt Bat\", ab: [0.382, 0.382], bc: [0.382, 0.886], cd: [2, 3.618], xd: [1.13, 1.13] },\n { name: \"Butterfly\", ab: [0.786, 0.786], bc: [0.382, 0.886], cd: [1.618, 2.618], xd: [1.27, 1.618] },\n { name: \"Crab\", ab: [0.382, 0.618], bc: [0.382, 0.886], cd: [2.24, 3.618], xd: [1.618, 1.618] },\n { name: \"Deep Crab\", ab: [0.886, 0.886], bc: [0.382, 0.886], cd: [2, 3.618], xd: [1.618, 1.618] },\n];\nconst inR = (v: number, r: Range, tol: number) => v >= r[0] * (1 - tol) && v <= r[1] * (1 + tol);\n\nexport interface HarmonicHit {\n name: string;\n bull: boolean;\n pts: Pivot[];\n /** D not yet confirmed as a swing. */\n forming: boolean;\n}\n\n/**\n * Harmonic XABCD patterns on the swings. Completed ones (D already reached)\n * are drawn as two triangles; a pattern still waiting for D shows its\n * potential reversal zone (where D would complete) as a dashed box.\n */\nexport function harmonics(bars: Bar[], k = 2, tolPct = 6, show = 3, up = \"#16A34A\", down = \"#DC2626\") {\n const { piv, tail } = swings(bars, k);\n const all = tail ? [...piv, tail] : piv;\n const tol = tolPct / 100;\n const hits: HarmonicHit[] = [];\n const legLen = (a: Pivot, b: Pivot) => Math.abs(b.p - a.p);\n\n for (let s = 0; s + 4 < all.length; s++) {\n const [X, A, B, C, D] = all.slice(s, s + 5);\n const XA = legLen(X, A), AB = legLen(A, B), BC = legLen(B, C), CD = legLen(C, D);\n if (!XA || !AB || !BC) continue;\n const bull = !X.hi; // X low → A high → … → D low: a bullish (buy-side) pattern\n const ab = AB / XA, bc = BC / AB, cd = CD / BC, xd = Math.abs(A.p - D.p) / XA;\n let name: string | null = null;\n for (const h of HARMONICS) {\n if (bc > 1.0 * (1 + tol)) break; // C past A: not these shapes\n if (inR(ab, h.ab, tol) && inR(bc, h.bc, tol) && inR(cd, h.cd, tol) && inR(xd, h.xd, tol)) { name = h.name; break; }\n }\n if (!name) {\n // Cypher: C extends beyond A (1.13–1.414 of XA), D retraces 0.786 of XC.\n const xc = Math.abs(C.p - X.p) / XA;\n const xcD = Math.abs(C.p - D.p) / Math.abs(C.p - X.p);\n const beyondA = bull ? C.p > A.p : C.p < A.p;\n if (beyondA && inR(ab, [0.382, 0.618], tol) && inR(xc, [1.13, 1.414], tol) && inR(xcD, [0.786, 0.786], tol)) name = \"Cypher\";\n }\n if (name) hits.push({ name, bull, pts: [X, A, B, C, D], forming: D === tail });\n }\n\n // AB = CD on the last four swings, if no XABCD shape fits there.\n for (let s = Math.max(0, all.length - 6); s + 3 < all.length; s++) {\n const [A, B, C, D] = all.slice(s, s + 4);\n const AB = legLen(A, B), BC = legLen(B, C), CD = legLen(C, D);\n if (!AB || !BC) continue;\n const bc = BC / AB;\n if (inR(bc, [0.382, 0.886], tol) && Math.abs(CD / AB - 1) <= tol * 2) {\n if (!hits.some((h) => h.pts[4] === D)) hits.push({ name: \"AB=CD\", bull: A.hi, pts: [A, B, C, D], forming: D === tail });\n }\n }\n\n const paths: StudyPath[] = [];\n const zones: StudyZone[] = [];\n const shown = hits.slice(-show);\n for (const h of shown) {\n const color = h.bull ? up : down;\n const tag = `${h.bull ? \"Bullish\" : \"Bearish\"} ${h.name}${h.forming ? \" (forming)\" : \"\"}`;\n if (h.pts.length === 5) {\n const [X, A, B, C, D] = h.pts;\n paths.push({ pts: [{ i: X.i, p: X.p, label: \"X\" }, { i: A.i, p: A.p, label: \"A\" }, { i: B.i, p: B.p, label: \"B\" }], color, fill: true, width: 1.5 });\n paths.push({ pts: [{ i: B.i, p: B.p }, { i: C.i, p: C.p, label: \"C\" }, { i: D.i, p: D.p, label: \"D\" }], color, fill: true, width: 1.5, label: tag });\n paths.push({ pts: [{ i: X.i, p: X.p }, { i: B.i, p: B.p }], color, dashed: true, width: 1, label: (Math.abs(A.p - B.p) / Math.abs(A.p - X.p)).toFixed(3), labelAt: 0.5 });\n paths.push({ pts: [{ i: B.i, p: B.p }, { i: D.i, p: D.p }], color, dashed: true, width: 1, label: (Math.abs(C.p - D.p) / Math.abs(C.p - B.p)).toFixed(3), labelAt: 0.5 });\n paths.push({ pts: [{ i: X.i, p: X.p }, { i: D.i, p: D.p }], color, dashed: true, width: 1, label: (Math.abs(A.p - D.p) / Math.abs(A.p - X.p)).toFixed(3), labelAt: 0.5 });\n } else {\n const [A, B, C, D] = h.pts;\n paths.push({ pts: [{ i: A.i, p: A.p, label: \"A\" }, { i: B.i, p: B.p, label: \"B\" }, { i: C.i, p: C.p, label: \"C\" }, { i: D.i, p: D.p, label: \"D\" }], color, width: 1.5, label: tag });\n }\n }\n\n // Potential reversal zone for a pattern still waiting on D: the last four\n // confirmed swings as X, A, B, C, and where each pattern's D would land.\n if (piv.length >= 4) {\n const [X, A, B, C] = piv.slice(-4);\n const XA = legLen(X, A), AB = legLen(A, B), BC = legLen(B, C);\n if (XA && AB && BC) {\n const bull = !X.hi;\n const dir = bull ? -1 : 1; // D lies below C for a bullish pattern\n const ab = AB / XA, bc = BC / AB;\n for (const h of HARMONICS) {\n if (!inR(ab, h.ab, tol) || !inR(bc, h.bc, tol)) continue;\n // D must satisfy both the XA and BC projections — their overlap.\n const xd1 = A.p + dir * h.xd[0] * XA, xd2 = A.p + dir * h.xd[1] * XA;\n const cd1 = C.p + dir * h.cd[0] * BC, cd2 = C.p + dir * h.cd[1] * BC;\n const loX = Math.min(xd1, xd2) - XA * tol * 0.5, hiX = Math.max(xd1, xd2) + XA * tol * 0.5;\n const lo = Math.max(loX, Math.min(cd1, cd2)), hi = Math.min(hiX, Math.max(cd1, cd2));\n if (!(hi >= lo)) continue;\n const done = tail && tail.i > C.i && (bull ? tail.p <= hi : tail.p >= lo);\n zones.push({ from: C.i, to: null, top: r2(hi + (hi === lo ? XA * 0.01 : 0)), bottom: r2(lo), color: bull ? up : down, dashed: true, label: `${bull ? \"Bullish\" : \"Bearish\"} ${h.name} D zone ${fmt(lo)}–${fmt(hi)}${done ? \" · reached\" : \"\"}` });\n paths.push({ pts: [{ i: X.i, p: X.p, label: \"X\" }, { i: A.i, p: A.p, label: \"A\" }, { i: B.i, p: B.p, label: \"B\" }, { i: C.i, p: C.p, label: \"C\" }], color: bull ? up : down, dashed: true, width: 1 });\n break;\n }\n }\n }\n return { paths, zones, hits };\n}\n\n/* ── Elliott waves ──────────────────────────────────────────────────────── */\n\n/**\n * The most recent five-wave impulse whose swings obey the three hard rules:\n * wave 2 never retraces past the start of wave 1, wave 3 is never the shortest\n * of 1/3/5, and wave 4 never enters wave 1's territory. Swings after wave 5\n * are labelled a-b-c. If the latest four swings form waves 1–4, the wave 5\n * target zone (wave 1 equality to 0.618 × waves 0→3) is shown instead.\n */\nexport function elliott(bars: Bar[], k = 2, up = \"#16A34A\", down = \"#DC2626\", neutral = \"#94A3B8\") {\n const { piv, tail } = swings(bars, k);\n const all = tail ? [...piv, tail] : piv;\n const paths: StudyPath[] = [];\n const zones: StudyZone[] = [];\n\n const valid = (w: Pivot[], upTrend: boolean, upTo = 5) => {\n const s = upTrend ? 1 : -1;\n const v = w.map((x) => s * x.p);\n const w1 = v[1] - v[0], w3 = upTo >= 3 ? v[3] - v[2] : 0;\n if (!(w1 > 0)) return false;\n if (!(v[2] > v[0])) return false; // rule 1\n if (upTo >= 3 && !(v[3] > v[1])) return false;\n if (upTo >= 4 && !(v[4] > v[1])) return false; // rule 3: no overlap with wave 1\n if (upTo >= 5) {\n const w5 = v[5] - v[4];\n if (!(w5 > 0)) return false;\n if (w3 < w1 && w3 < w5) return false; // rule 2\n }\n return true;\n };\n\n let found: { start: number; upTrend: boolean } | null = null;\n for (let s = all.length - 6; s >= 0; s--) {\n const w = all.slice(s, s + 6);\n const upTrend = !w[0].hi;\n if (valid(w, upTrend)) { found = { start: s, upTrend }; break; }\n }\n\n if (found) {\n const w = all.slice(found.start, found.start + 6);\n const color = found.upTrend ? up : down;\n paths.push({ pts: w.map((x, j) => ({ i: x.i, p: x.p, label: j === 0 ? \"0\" : `(${j})` })), color, width: 2, label: `Impulse ${found.upTrend ? \"up\" : \"down\"}${w[5] === tail ? \" · wave 5 forming\" : \"\"}` });\n const after = all.slice(found.start + 5, found.start + 9);\n if (after.length >= 2) {\n const lab = [\"\", \"(a)\", \"(b)\", \"(c)\"];\n paths.push({ pts: after.map((x, j) => ({ i: x.i, p: x.p, label: lab[j] || undefined })), color: neutral, width: 1.5, dashed: true, label: \"Correction\" });\n }\n }\n\n // Waves 1–4 in place and no completed impulse after them → project wave 5.\n const last5 = all.slice(-5);\n if (last5.length === 5 && (!found || found.start + 5 < all.length - 5)) {\n const upTrend = !last5[0].hi;\n if (valid(last5, upTrend, 4) && (last5[4] !== tail || piv.length >= 5)) {\n const s = upTrend ? 1 : -1;\n const [p0, p1, , p3, p4] = last5;\n const w1 = Math.abs(p1.p - p0.p);\n const t1 = p4.p + s * w1;\n const t2 = p4.p + s * 0.618 * Math.abs(p3.p - p0.p);\n const color = upTrend ? up : down;\n paths.push({ pts: last5.map((x, j) => ({ i: x.i, p: x.p, label: j === 0 ? \"0\" : `(${j})` })), color, width: 1.5, dashed: true, label: \"Waves 1–4 (possible)\" });\n zones.push({ from: p4.i, to: null, top: r2(Math.max(t1, t2)), bottom: r2(Math.min(t1, t2)), color, dashed: true, label: `Wave 5 target ${fmt(Math.min(t1, t2))}–${fmt(Math.max(t1, t2))}` });\n }\n }\n return { paths, zones };\n}\n\n/* ── chart patterns ─────────────────────────────────────────────────────── */\n\nfunction fit(pts: Pivot[]) {\n const n = pts.length;\n const mx = pts.reduce((s, q) => s + q.i, 0) / n;\n const my = pts.reduce((s, q) => s + q.p, 0) / n;\n let sxy = 0, sxx = 0;\n for (const q of pts) { sxy += (q.i - mx) * (q.p - my); sxx += (q.i - mx) ** 2; }\n const m = sxx ? sxy / sxx : 0;\n const b = my - m * mx;\n const err = Math.max(...pts.map((q) => Math.abs(q.p - (m * q.i + b))));\n return { m, b, at: (i: number) => m * i + b, err };\n}\n\n/**\n * Double tops/bottoms, head & shoulders (and inverse), and the latest\n * converging / parallel structure (triangles, wedges, channels, ranges).\n * `look` limits patterns to the last N bars. Tolerances scale with ATR.\n */\nexport function chartPatterns(bars: Bar[], k = 1.5, look = 200, up = \"#16A34A\", down = \"#DC2626\", neutral = \"#94A3B8\", show = 2) {\n const n = bars.length;\n const { piv, tail, atr: at } = swings(bars, k);\n const paths: StudyPath[] = [];\n const zones: StudyZone[] = [];\n if (n < 20 || piv.length < 3) return { paths, zones, found: [] as string[] };\n const found: string[] = [];\n const from = n - look;\n const A = (i: number) => at[Math.min(n - 1, Math.max(0, i))];\n const lastClose = bars[n - 1].close;\n const firstClose = (i: number, test: (j: number) => boolean) => {\n for (let j = i + 1; j < n; j++) if (test(j)) return j;\n return -1;\n };\n // A pattern still waiting for its break is only worth showing while it is\n // one of the latest swings; an old one that never broke is history.\n const liveFrom = piv.length >= 3 ? piv[piv.length - 3].i : 0;\n\n interface Cand { start: number; end: number; name: string; paths: StudyPath[]; zones: StudyZone[] }\n const cands: Cand[] = [];\n\n // Double top / bottom: two equal swings with a real trough / peak between.\n for (let s = 0; s + 2 < piv.length; s++) {\n const [p1, mid, p2] = piv.slice(s, s + 3);\n if (p2.i < from) continue;\n const a = A(p2.i);\n if (Math.abs(p1.p - p2.p) > 0.6 * a) continue;\n const top = p1.hi;\n const sg = top ? 1 : -1;\n const peak = top ? Math.max(p1.p, p2.p) : Math.min(p1.p, p2.p);\n const h = Math.abs(peak - mid.p);\n if (h < 2 * a) continue;\n const brk = firstClose(p2.i, (j) => sg * (mid.p - bars[j].close) > 0);\n // Invalid if price closed beyond the peaks before breaking the neckline.\n const fail = firstClose(p2.i, (j) => sg * (bars[j].close - peak) > 0);\n if (fail >= 0 && (brk < 0 || fail < brk)) continue;\n if (brk < 0 && p2.i < liveFrom) continue;\n const color = top ? down : up;\n const name = top ? \"Double top\" : \"Double bottom\";\n const target = mid.p - sg * h;\n const c: Cand = { start: p1.i, end: brk >= 0 ? brk : p2.i, name, paths: [], zones: [] };\n c.paths.push({ pts: [{ i: p1.i, p: p1.p, label: top ? \"T1\" : \"B1\" }, { i: mid.i, p: mid.p }, { i: p2.i, p: p2.p, label: top ? \"T2\" : \"B2\" }], color, width: 1.5, label: `${name}${brk >= 0 ? \" · confirmed\" : \" · watching neckline\"}`, labelAt: 1 });\n c.zones.push({ from: p1.i, to: brk >= 0 ? brk : null, top: mid.p, bottom: mid.p, color: neutral, dashed: true, label: \"Neckline\" });\n if (brk >= 0) c.zones.push({ from: brk, to: Math.min(n - 1, brk + (p2.i - p1.i)), top: target, bottom: target, color, dashed: true, label: `Measured move ${fmt(target)}` });\n cands.push(c);\n }\n\n // Head & shoulders: three peaks, the middle highest, shoulders level.\n for (let s = 0; s + 4 < piv.length; s++) {\n const [l, t1, h, t2, r] = piv.slice(s, s + 5);\n if (r.i < from) continue;\n const top = h.hi;\n const sg = top ? 1 : -1;\n const a = A(r.i);\n if (!(sg * (h.p - l.p) > 0.5 * a && sg * (h.p - r.p) > 0.5 * a)) continue;\n if (Math.abs(l.p - r.p) > 1.25 * a) continue;\n const neck = fit([t1, t2]);\n const depth = Math.abs(h.p - neck.at(h.i));\n if (depth < 2 * a) continue;\n const brk = firstClose(r.i, (j) => sg * (neck.at(j) - bars[j].close) > 0);\n const fail = firstClose(r.i, (j) => sg * (bars[j].close - h.p) > 0);\n if (fail >= 0 && (brk < 0 || fail < brk)) continue;\n if (brk < 0 && r.i < liveFrom) continue;\n const color = top ? down : up;\n const name = top ? \"Head & shoulders\" : \"Inverse head & shoulders\";\n const c: Cand = { start: l.i, end: brk >= 0 ? brk : r.i, name, paths: [], zones: [] };\n c.paths.push({ pts: [{ i: l.i, p: l.p, label: \"LS\" }, { i: t1.i, p: t1.p }, { i: h.i, p: h.p, label: \"H\" }, { i: t2.i, p: t2.p }, { i: r.i, p: r.p, label: \"RS\" }], color, width: 1.5, label: `${name}${brk >= 0 ? \" · confirmed\" : \" · watching neckline\"}`, labelAt: 2 });\n const e = brk >= 0 ? brk : n - 1;\n c.paths.push({ pts: [{ i: t1.i, p: neck.at(t1.i) }, { i: e, p: neck.at(e) }], color: neutral, dashed: true, width: 1, label: \"Neckline\", labelAt: 0 });\n if (brk >= 0) {\n const target = neck.at(brk) - sg * depth;\n c.zones.push({ from: brk, to: Math.min(n - 1, brk + (r.i - l.i)), top: target, bottom: target, color, dashed: true, label: `Measured move ${fmt(target)}` });\n }\n cands.push(c);\n }\n\n // The latest few, preferring head & shoulders over a double top on the same swings.\n cands.sort((x, y) => y.end - x.end || (y.name.includes(\"shoulders\") ? 1 : 0) - (x.name.includes(\"shoulders\") ? 1 : 0));\n const kept: Cand[] = [];\n for (const c of cands) {\n if (kept.length >= show) break;\n if (kept.some((q) => c.start < q.end && q.start < c.end)) continue; // overlapping\n kept.push(c);\n }\n for (const c of kept) {\n paths.push(...c.paths);\n zones.push(...c.zones);\n found.push(c.name);\n }\n\n // Latest structure: fit lines through the recent swing highs and lows.\n const conf = tail ? [...piv, tail] : piv;\n for (const m of [6, 5, 4]) {\n if (conf.length < m) continue;\n const w = conf.slice(-m);\n if (w[0].i < from) continue;\n const hs = w.filter((q) => q.hi), ls = w.filter((q) => !q.hi);\n if (hs.length < 2 || ls.length < 2) continue;\n const U = fit(hs), Lo = fit(ls);\n const a = A(w[w.length - 1].i);\n if (U.err > 0.6 * a || Lo.err > 0.6 * a) continue;\n const i0 = w[0].i, i1 = n - 1;\n const span = i1 - i0;\n const du = U.m * span, dl = Lo.m * span; // change of each line across the pattern\n const flat = (d: number) => Math.abs(d) <= 1.0 * a;\n const w0 = U.at(i0) - Lo.at(i0), w1 = U.at(i1) - Lo.at(i1);\n if (!(w0 > 0)) continue;\n const conv = w1 < w0 * 0.75, par = Math.abs(w1 - w0) <= w0 * 0.25;\n let name = \"\";\n if (flat(du) && dl > a && conv) name = \"Ascending triangle\";\n else if (flat(dl) && du < -a && conv) name = \"Descending triangle\";\n else if (du < -a && dl > a) name = \"Symmetrical triangle\";\n else if (du > 0 && dl > 0 && conv && !flat(dl)) name = \"Rising wedge\";\n else if (du < 0 && dl < 0 && conv && !flat(du)) name = \"Falling wedge\";\n else if (flat(du) && flat(dl) && par) name = \"Range (rectangle)\";\n else if (du > a && dl > a && par) name = \"Rising channel\";\n else if (du < -a && dl < -a && par) name = \"Falling channel\";\n else if (w1 > w0 * 1.25) name = \"Broadening formation\";\n if (!name) continue;\n const brokeUp = lastClose > U.at(i1);\n const brokeDn = lastClose < Lo.at(i1);\n const color = brokeUp ? up : brokeDn ? down : neutral;\n const st = brokeUp ? \" · broke up\" : brokeDn ? \" · broke down\" : \"\";\n paths.push({ pts: [{ i: i0, p: U.at(i0) }, { i: i1, p: U.at(i1) }], color, width: 1.5, label: `${name}${st}`, labelAt: 1 });\n paths.push({ pts: [{ i: i0, p: Lo.at(i0) }, { i: i1, p: Lo.at(i1) }], color, width: 1.5 });\n found.push(name);\n break;\n }\n return { paths, zones, found };\n}\n\n/* ── market profile & session volume profile ────────────────────────────── */\n\nconst LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nfunction niceStep(v: number) {\n if (!(v > 0)) return 0;\n const mag = Math.pow(10, Math.floor(Math.log10(v)));\n const f = v / mag;\n return (f < 1.5 ? 1 : f < 3.5 ? 2 : f < 7.5 ? 5 : 10) * mag;\n}\n\nfunction sessions(bars: Bar[]) {\n const out: { from: number; to: number }[] = [];\n let cur = -1;\n bars.forEach((b, i) => {\n const d = Math.floor(b.time / 86400);\n if (d !== cur) { out.push({ from: i, to: i }); cur = d; }\n else out[out.length - 1].to = i;\n });\n return out;\n}\n\nfunction valueArea(counts: number[], poc: number, share = 0.7) {\n const total = counts.reduce((s, x) => s + x, 0);\n let inVa = counts[poc], a = poc, z = poc;\n while (inVa < total * share && (a > 0 || z < counts.length - 1)) {\n const below = a > 0 ? counts[a - 1] : -1;\n const above = z < counts.length - 1 ? counts[z + 1] : -1;\n if (above >= below) { z++; inVa += above; } else { a--; inVa += below; }\n }\n return { a, z };\n}\n\n/**\n * Market profile (TPO): each 30-minute period of a session gets a letter\n * (A = 11:00, B = 11:30 …) and every price row it traded through gets that\n * letter. Shows the point of control, the 70% value area and the initial\n * balance (first hour). Hourly bars use one letter per hour.\n */\nexport function tpoProfiles(bars: Bar[], rowsWanted = 24, sessionsShown = 5, color = \"#6366F1\"): StudyProfile[] {\n const ss = sessions(bars).slice(-sessionsShown);\n if (!ss.length) return [];\n const ranges = ss.map((s) => {\n let hi = -Infinity, lo = Infinity;\n for (let i = s.from; i <= s.to; i++) { hi = Math.max(hi, bars[i].high); lo = Math.min(lo, bars[i].low); }\n return hi - lo;\n }).filter((r) => r > 0).sort((x, y) => x - y);\n const step = niceStep((ranges[Math.floor(ranges.length / 2)] || 0) / rowsWanted);\n if (!step) return [];\n const out: StudyProfile[] = [];\n for (const s of ss) {\n const t0 = bars[s.from].time;\n const period = bars.length > 1 && bars[s.from + 1] && bars[s.from + 1].time - t0 >= 3600 ? 3600 : 1800;\n let lo = Infinity, hi = -Infinity;\n for (let i = s.from; i <= s.to; i++) { hi = Math.max(hi, bars[i].high); lo = Math.min(lo, bars[i].low); }\n if (!(hi >= lo)) continue;\n const base = Math.floor(lo / step + 1e-9);\n const top = Math.floor(hi / step + 1e-9);\n const nRows = top - base + 1;\n if (nRows > 200) continue;\n const letters: string[] = new Array(nRows).fill(\"\");\n const marked: Set<number>[] = Array.from({ length: nRows }, () => new Set<number>());\n let ibLo = Infinity, ibHi = -Infinity;\n for (let i = s.from; i <= s.to; i++) {\n const b = bars[i];\n const per = Math.min(LETTERS.length - 1, Math.floor((b.time - t0) / period));\n if (b.time - t0 < 3600) { ibLo = Math.min(ibLo, b.low); ibHi = Math.max(ibHi, b.high); }\n const a = Math.floor(b.low / step + 1e-9) - base, z = Math.floor(b.high / step + 1e-9) - base;\n for (let r = Math.max(0, a); r <= Math.min(nRows - 1, z); r++) {\n if (!marked[r].has(per)) { marked[r].add(per); letters[r] += LETTERS[per]; }\n }\n }\n const counts = marked.map((m) => m.size);\n let poc = 0;\n const mid = (nRows - 1) / 2;\n counts.forEach((c, r) => { if (c > counts[poc] || (c === counts[poc] && Math.abs(r - mid) < Math.abs(poc - mid))) poc = r; });\n const { a, z } = valueArea(counts, poc);\n out.push({\n from: s.from,\n to: s.to,\n kind: \"tpo\",\n color,\n rows: counts.map((v, r) => ({ lo: (base + r) * step, hi: (base + r + 1) * step, v, letters: letters[r] })),\n poc,\n vaLow: (base + a) * step,\n vaHigh: (base + z + 1) * step,\n ib: ibHi >= ibLo ? { lo: ibLo, hi: ibHi } : undefined,\n });\n }\n return out;\n}\n\n/** A volume profile for each of the last N sessions, drawn inside that session. */\nexport function sessionVolumeProfiles(bars: Bar[], rows = 20, sessionsShown = 5, color = \"#0EA5E9\"): StudyProfile[] {\n const out: StudyProfile[] = [];\n for (const s of sessions(bars).slice(-sessionsShown)) {\n const vp = volumeProfile(bars.slice(s.from, s.to + 1), rows);\n if (!vp || !vp.max) continue;\n out.push({\n from: s.from,\n to: s.to,\n kind: \"vol\",\n color,\n rows: vp.buckets.map((b) => ({ lo: b.lo, hi: b.hi, v: b.up + b.down, up: b.up })),\n poc: vp.poc,\n vaLow: vp.vaLow,\n vaHigh: vp.vaHigh,\n });\n }\n return out;\n}\n","/**\n * Time-independent chart types built from closes: Kagi and Point & Figure.\n * Like Renko and line break, each returns ordinary bars (so the price scale,\n * crosshair and studies keep working) plus the extra shape the chart's\n * overlay needs to draw them properly. Pure arithmetic on recorded bars.\n */\nimport type { Bar } from \"./core\";\n\n/* ── Kagi ───────────────────────────────────────────────────────────────── */\n\nexport interface KagiLine {\n /** Thick (yang) at the start of this line. */\n yang: boolean;\n /** Price where the line changes thickness (passing the last shoulder / waist), if it does. */\n flipAt: number | null;\n}\n\n/**\n * Kagi: a line keeps going in one direction until price reverses by `rev`;\n * then it steps across and turns. It turns thick (yang) when it rises above the\n * previous shoulder (top) and thin (yin) when it falls below the previous\n * waist (bottom). Each line becomes one bar: open = where it starts, close =\n * where it ends.\n */\nexport function kagi(bars: Bar[], rev: number): { bars: Bar[]; lines: KagiLine[] } {\n const out: Bar[] = [];\n const lines: KagiLine[] = [];\n if (bars.length < 2 || !(rev > 0)) return { bars: out, lines };\n let dir = 0;\n let start = bars[0].close;\n let end = start;\n let t = bars[0].time;\n let vol = 0;\n let lastT = -Infinity;\n let shoulder: number | null = null; // top of the last up line\n let waist: number | null = null; // bottom of the last down line\n let yang = true;\n\n const close = () => {\n const time = Math.max(t, lastT + 1);\n lastT = time;\n let flipAt: number | null = null;\n const startYang = yang;\n if (dir > 0 && !yang && shoulder != null && end > shoulder) { flipAt = shoulder; yang = true; }\n if (dir < 0 && yang && waist != null && end < waist) { flipAt = waist; yang = false; }\n out.push({ time, open: start, high: Math.max(start, end), low: Math.min(start, end), close: end, volume: vol });\n lines.push({ yang: startYang, flipAt });\n if (dir > 0) shoulder = end;\n else waist = end;\n vol = 0;\n };\n\n for (let i = 0; i < bars.length; i++) {\n const b = bars[i];\n const c = b.close;\n vol += b.volume || 0;\n if (dir === 0) {\n if (c >= start + rev || c <= start - rev) {\n dir = c > start ? 1 : -1;\n yang = dir > 0;\n end = c;\n }\n continue;\n }\n if (dir * (c - end) > 0) {\n end = c;\n } else if (dir * (end - c) >= rev) {\n close();\n start = end;\n end = c;\n dir = -dir;\n t = b.time;\n }\n }\n if (dir !== 0) close();\n return { bars: out, lines };\n}\n\n/* ── Point & Figure ─────────────────────────────────────────────────────── */\n\nexport interface PnfColumn {\n /** true = a column of X (rising), false = O (falling). */\n up: boolean;\n /** Lowest and highest box, as multiples of the box size. */\n lo: number;\n hi: number;\n}\n\n/**\n * Point & Figure (close method): X columns while price rises a box at a time,\n * O columns while it falls; a new column only after a reversal of `rev` boxes.\n * Box k sits at price k × box.\n */\nexport function pointFigure(bars: Bar[], box: number, rev = 3): { bars: Bar[]; cols: PnfColumn[] } {\n const out: Bar[] = [];\n const cols: PnfColumn[] = [];\n if (bars.length < 2 || !(box > 0)) return { bars: out, cols };\n const times: number[] = [];\n const vols: number[] = [];\n let lastT = -Infinity;\n let vol = 0;\n const k0 = Math.round(bars[0].close / box);\n let cur: PnfColumn | null = null;\n const open = (c: PnfColumn, time: number) => {\n const t = Math.max(time, lastT + 1);\n lastT = t;\n cols.push(c);\n times.push(t);\n vols.push(0);\n cur = c;\n };\n\n for (const b of bars) {\n const c = b.close;\n vol += b.volume || 0;\n const up = Math.floor(c / box + 1e-9);\n const dn = Math.ceil(c / box - 1e-9);\n if (!cur) {\n if (up >= k0 + 1) open({ up: true, lo: k0, hi: up }, b.time);\n else if (dn <= k0 - 1) open({ up: false, lo: dn, hi: k0 }, b.time);\n } else {\n const col: PnfColumn = cur;\n if (col.up) {\n if (up > col.hi) col.hi = up;\n else if (dn <= col.hi - rev) open({ up: false, lo: dn, hi: col.hi - 1 }, b.time);\n } else {\n if (dn < col.lo) col.lo = dn;\n else if (up >= col.lo + rev) open({ up: true, lo: col.lo + 1, hi: up }, b.time);\n }\n }\n if (cols.length) {\n vols[cols.length - 1] += vol;\n vol = 0;\n }\n }\n cols.forEach((c, k) => {\n const lo = c.lo * box - box / 2;\n const hi = c.hi * box + box / 2;\n out.push({ time: times[k], open: c.up ? lo : hi, high: hi, low: lo, close: c.up ? hi : lo, volume: vols[k] });\n });\n return { bars: out, cols };\n}\n","/**\n * @lacspace/patterns — rule-based chart-pattern detection on OHLCV bars.\n *\n * ATR-sized swings (zigzag), harmonic XABCD patterns (Gartley, Bat, Alt Bat, Butterfly,\n * Crab, Deep Crab, Cypher, AB=CD) with potential-reversal zones, an Elliott impulse count\n * that obeys the three hard rules, classic chart patterns (double tops/bottoms, head &\n * shoulders, triangles, wedges, channels, ranges), per-session TPO market profiles and\n * volume profiles, plus Kagi and Point & Figure transforms.\n *\n * Descriptive geometry of what is already on the chart — never a forecast or advice.\n * Results are drawing-ready (`paths`, `zones`, `profiles`) and also returned as data\n * (`hits`, `found`). Contributed by the ShareRocketPro team; zero-dependency.\n */\n\nexport type { Bar, Series, StudyZone } from \"./core.js\";\nexport { atr, rma, trueRange, volumeProfile } from \"./core.js\";\nexport {\n swings,\n harmonics,\n elliott,\n chartPatterns,\n tpoProfiles,\n sessionVolumeProfiles,\n type StudyPath,\n type StudyProfile,\n type Pivot,\n type HarmonicHit,\n} from \"./patterns.js\";\nexport { kagi, pointFigure, type KagiLine, type PnfColumn } from \"./altCharts.js\";\n\nconst VERSION = \"1.0.0\";\nconst bars = { type: \"array\", description: \"OHLCV bars: { time (unix s), open, high, low, close, volume }[]\" };\n\n/** describe() for agents/conductors. */\nexport function describe() {\n return {\n name: \"@lacspace/patterns\",\n version: VERSION,\n summary: \"Rule-based chart-pattern detection on OHLCV: ATR swings, harmonics, Elliott impulse count, double tops/bottoms, head & shoulders, triangles/wedges/channels, TPO and session volume profiles, Kagi and Point & Figure. Descriptive only.\",\n commands: [\n { name: \"swings\", input: { type: \"object\", properties: { bars, k: { type: \"number\", default: 2 } }, required: [\"bars\"] }, output: \"{ piv: Pivot[], tail: Pivot|null, atr: number[] }\" },\n { name: \"harmonics\", input: { type: \"object\", properties: { bars, k: { type: \"number\", default: 2 }, tolPct: { type: \"number\", default: 6 }, show: { type: \"integer\", default: 3 } }, required: [\"bars\"] }, output: \"{ paths, zones, hits: HarmonicHit[] }\" },\n { name: \"elliott\", input: { type: \"object\", properties: { bars, k: { type: \"number\", default: 2 } }, required: [\"bars\"] }, output: \"{ paths, zones }\" },\n { name: \"chartPatterns\", input: { type: \"object\", properties: { bars, k: { type: \"number\", default: 1.5 }, look: { type: \"integer\", default: 200 }, show: { type: \"integer\", default: 2 } }, required: [\"bars\"] }, output: \"{ paths, zones, found: string[] }\" },\n { name: \"tpoProfiles\", input: { type: \"object\", properties: { bars, rowsWanted: { type: \"integer\", default: 24 }, sessionsShown: { type: \"integer\", default: 5 } }, required: [\"bars\"] }, output: \"StudyProfile[]\" },\n { name: \"sessionVolumeProfiles\", input: { type: \"object\", properties: { bars, rows: { type: \"integer\", default: 20 }, sessionsShown: { type: \"integer\", default: 5 } }, required: [\"bars\"] }, output: \"StudyProfile[]\" },\n { name: \"kagi\", input: { type: \"object\", properties: { bars, rev: { type: \"number\" } }, required: [\"bars\", \"rev\"] }, output: \"{ bars, lines }\" },\n { name: \"pointFigure\", input: { type: \"object\", properties: { bars, box: { type: \"number\" }, rev: { type: \"integer\", default: 3 } }, required: [\"bars\", \"box\"] }, output: \"{ bars, cols }\" },\n ],\n };\n}\n"]}
@@ -0,0 +1,415 @@
1
+ /** Shared bar type and the few series helpers the detectors need (Wilder ATR, volume profile). */
2
+ interface Bar {
3
+ /** Unix seconds (bar open). */
4
+ time: number;
5
+ open: number;
6
+ high: number;
7
+ low: number;
8
+ close: number;
9
+ volume: number;
10
+ }
11
+ type Series = (number | null)[];
12
+ /** A horizontal box / line on the price pane. */
13
+ interface StudyZone {
14
+ /** First bar index. */
15
+ from: number;
16
+ /** Last bar index; null = runs to the right edge. */
17
+ to: number | null;
18
+ top: number;
19
+ bottom: number;
20
+ color: string;
21
+ label?: string;
22
+ /** Dashed outline / line instead of solid. */
23
+ dashed?: boolean;
24
+ }
25
+ /** Wilder's moving average (RMA), seeded with the SMA of the first `n` values. */
26
+ declare function rma(values: Series, n: number): Series;
27
+ declare function trueRange(bars: Bar[]): Series;
28
+ /** Average true range (Wilder). */
29
+ declare function atr(bars: Bar[], n?: number): Series;
30
+ /** Volume by price: `rows` buckets, each with up and down volume, plus POC and the 70% value area. */
31
+ declare function volumeProfile(bars: Bar[], rows?: number): {
32
+ buckets: {
33
+ lo: number;
34
+ hi: number;
35
+ up: number;
36
+ down: number;
37
+ }[];
38
+ poc: number;
39
+ vaLow: number;
40
+ vaHigh: number;
41
+ max: number;
42
+ } | null;
43
+
44
+ /**
45
+ * Pattern recognition on recorded bars: harmonic patterns (Gartley, Bat,
46
+ * Butterfly, Crab, Cypher, AB=CD), an Elliott-wave impulse count, classic chart
47
+ * patterns (double tops/bottoms, head & shoulders, triangles, wedges,
48
+ * channels) and per-session market / volume profiles.
49
+ *
50
+ * Everything is found from ATR-sized swings, so the same settings work on a
51
+ * 5-minute chart and a weekly one. These are rule-based detections of
52
+ * geometry already on the chart — descriptive, never a forecast. Wave counts
53
+ * in particular are subjective; this shows one count that obeys the rules.
54
+ */
55
+
56
+ /** A polyline on the price pane. `i` is a bar index (may run past the last bar for projections). */
57
+ interface StudyPath {
58
+ pts: {
59
+ i: number;
60
+ p: number;
61
+ label?: string;
62
+ }[];
63
+ color: string;
64
+ width?: number;
65
+ dashed?: boolean;
66
+ /** Fill the closed polygon with this colour at low opacity. */
67
+ fill?: boolean;
68
+ /** Name drawn beside the last point (or `labelAt`). */
69
+ label?: string;
70
+ labelAt?: number;
71
+ }
72
+ /** A histogram drawn inside one session (TPO letters or volume). */
73
+ interface StudyProfile {
74
+ from: number;
75
+ to: number;
76
+ rows: {
77
+ lo: number;
78
+ hi: number;
79
+ v: number;
80
+ up?: number;
81
+ letters?: string;
82
+ }[];
83
+ poc: number;
84
+ vaLow: number;
85
+ vaHigh: number;
86
+ /** Initial balance (first hour) for TPO profiles. */
87
+ ib?: {
88
+ lo: number;
89
+ hi: number;
90
+ };
91
+ kind: "tpo" | "vol";
92
+ color: string;
93
+ }
94
+ interface Pivot {
95
+ i: number;
96
+ p: number;
97
+ hi: boolean;
98
+ }
99
+ /**
100
+ * Alternating swing highs and lows: a swing is confirmed once price moves
101
+ * `k` × ATR(14) away from it. The last, still-forming extreme is returned as
102
+ * `tail` (not yet confirmed).
103
+ */
104
+ declare function swings(bars: Bar[], k?: number): {
105
+ piv: Pivot[];
106
+ tail: Pivot | null;
107
+ atr: number[];
108
+ };
109
+ interface HarmonicHit {
110
+ name: string;
111
+ bull: boolean;
112
+ pts: Pivot[];
113
+ /** D not yet confirmed as a swing. */
114
+ forming: boolean;
115
+ }
116
+ /**
117
+ * Harmonic XABCD patterns on the swings. Completed ones (D already reached)
118
+ * are drawn as two triangles; a pattern still waiting for D shows its
119
+ * potential reversal zone (where D would complete) as a dashed box.
120
+ */
121
+ declare function harmonics(bars: Bar[], k?: number, tolPct?: number, show?: number, up?: string, down?: string): {
122
+ paths: StudyPath[];
123
+ zones: StudyZone[];
124
+ hits: HarmonicHit[];
125
+ };
126
+ /**
127
+ * The most recent five-wave impulse whose swings obey the three hard rules:
128
+ * wave 2 never retraces past the start of wave 1, wave 3 is never the shortest
129
+ * of 1/3/5, and wave 4 never enters wave 1's territory. Swings after wave 5
130
+ * are labelled a-b-c. If the latest four swings form waves 1–4, the wave 5
131
+ * target zone (wave 1 equality to 0.618 × waves 0→3) is shown instead.
132
+ */
133
+ declare function elliott(bars: Bar[], k?: number, up?: string, down?: string, neutral?: string): {
134
+ paths: StudyPath[];
135
+ zones: StudyZone[];
136
+ };
137
+ /**
138
+ * Double tops/bottoms, head & shoulders (and inverse), and the latest
139
+ * converging / parallel structure (triangles, wedges, channels, ranges).
140
+ * `look` limits patterns to the last N bars. Tolerances scale with ATR.
141
+ */
142
+ declare function chartPatterns(bars: Bar[], k?: number, look?: number, up?: string, down?: string, neutral?: string, show?: number): {
143
+ paths: StudyPath[];
144
+ zones: StudyZone[];
145
+ found: string[];
146
+ };
147
+ /**
148
+ * Market profile (TPO): each 30-minute period of a session gets a letter
149
+ * (A = 11:00, B = 11:30 …) and every price row it traded through gets that
150
+ * letter. Shows the point of control, the 70% value area and the initial
151
+ * balance (first hour). Hourly bars use one letter per hour.
152
+ */
153
+ declare function tpoProfiles(bars: Bar[], rowsWanted?: number, sessionsShown?: number, color?: string): StudyProfile[];
154
+ /** A volume profile for each of the last N sessions, drawn inside that session. */
155
+ declare function sessionVolumeProfiles(bars: Bar[], rows?: number, sessionsShown?: number, color?: string): StudyProfile[];
156
+
157
+ /**
158
+ * Time-independent chart types built from closes: Kagi and Point & Figure.
159
+ * Like Renko and line break, each returns ordinary bars (so the price scale,
160
+ * crosshair and studies keep working) plus the extra shape the chart's
161
+ * overlay needs to draw them properly. Pure arithmetic on recorded bars.
162
+ */
163
+
164
+ interface KagiLine {
165
+ /** Thick (yang) at the start of this line. */
166
+ yang: boolean;
167
+ /** Price where the line changes thickness (passing the last shoulder / waist), if it does. */
168
+ flipAt: number | null;
169
+ }
170
+ /**
171
+ * Kagi: a line keeps going in one direction until price reverses by `rev`;
172
+ * then it steps across and turns. It turns thick (yang) when it rises above the
173
+ * previous shoulder (top) and thin (yin) when it falls below the previous
174
+ * waist (bottom). Each line becomes one bar: open = where it starts, close =
175
+ * where it ends.
176
+ */
177
+ declare function kagi(bars: Bar[], rev: number): {
178
+ bars: Bar[];
179
+ lines: KagiLine[];
180
+ };
181
+ interface PnfColumn {
182
+ /** true = a column of X (rising), false = O (falling). */
183
+ up: boolean;
184
+ /** Lowest and highest box, as multiples of the box size. */
185
+ lo: number;
186
+ hi: number;
187
+ }
188
+ /**
189
+ * Point & Figure (close method): X columns while price rises a box at a time,
190
+ * O columns while it falls; a new column only after a reversal of `rev` boxes.
191
+ * Box k sits at price k × box.
192
+ */
193
+ declare function pointFigure(bars: Bar[], box: number, rev?: number): {
194
+ bars: Bar[];
195
+ cols: PnfColumn[];
196
+ };
197
+
198
+ /**
199
+ * @lacspace/patterns — rule-based chart-pattern detection on OHLCV bars.
200
+ *
201
+ * ATR-sized swings (zigzag), harmonic XABCD patterns (Gartley, Bat, Alt Bat, Butterfly,
202
+ * Crab, Deep Crab, Cypher, AB=CD) with potential-reversal zones, an Elliott impulse count
203
+ * that obeys the three hard rules, classic chart patterns (double tops/bottoms, head &
204
+ * shoulders, triangles, wedges, channels, ranges), per-session TPO market profiles and
205
+ * volume profiles, plus Kagi and Point & Figure transforms.
206
+ *
207
+ * Descriptive geometry of what is already on the chart — never a forecast or advice.
208
+ * Results are drawing-ready (`paths`, `zones`, `profiles`) and also returned as data
209
+ * (`hits`, `found`). Contributed by the ShareRocketPro team; zero-dependency.
210
+ */
211
+
212
+ /** describe() for agents/conductors. */
213
+ declare function describe(): {
214
+ name: string;
215
+ version: string;
216
+ summary: string;
217
+ commands: ({
218
+ name: string;
219
+ input: {
220
+ type: string;
221
+ properties: {
222
+ bars: {
223
+ type: string;
224
+ description: string;
225
+ };
226
+ k: {
227
+ type: string;
228
+ default: number;
229
+ };
230
+ tolPct?: undefined;
231
+ show?: undefined;
232
+ look?: undefined;
233
+ rowsWanted?: undefined;
234
+ sessionsShown?: undefined;
235
+ rows?: undefined;
236
+ rev?: undefined;
237
+ box?: undefined;
238
+ };
239
+ required: string[];
240
+ };
241
+ output: string;
242
+ } | {
243
+ name: string;
244
+ input: {
245
+ type: string;
246
+ properties: {
247
+ bars: {
248
+ type: string;
249
+ description: string;
250
+ };
251
+ k: {
252
+ type: string;
253
+ default: number;
254
+ };
255
+ tolPct: {
256
+ type: string;
257
+ default: number;
258
+ };
259
+ show: {
260
+ type: string;
261
+ default: number;
262
+ };
263
+ look?: undefined;
264
+ rowsWanted?: undefined;
265
+ sessionsShown?: undefined;
266
+ rows?: undefined;
267
+ rev?: undefined;
268
+ box?: undefined;
269
+ };
270
+ required: string[];
271
+ };
272
+ output: string;
273
+ } | {
274
+ name: string;
275
+ input: {
276
+ type: string;
277
+ properties: {
278
+ bars: {
279
+ type: string;
280
+ description: string;
281
+ };
282
+ k: {
283
+ type: string;
284
+ default: number;
285
+ };
286
+ look: {
287
+ type: string;
288
+ default: number;
289
+ };
290
+ show: {
291
+ type: string;
292
+ default: number;
293
+ };
294
+ tolPct?: undefined;
295
+ rowsWanted?: undefined;
296
+ sessionsShown?: undefined;
297
+ rows?: undefined;
298
+ rev?: undefined;
299
+ box?: undefined;
300
+ };
301
+ required: string[];
302
+ };
303
+ output: string;
304
+ } | {
305
+ name: string;
306
+ input: {
307
+ type: string;
308
+ properties: {
309
+ bars: {
310
+ type: string;
311
+ description: string;
312
+ };
313
+ rowsWanted: {
314
+ type: string;
315
+ default: number;
316
+ };
317
+ sessionsShown: {
318
+ type: string;
319
+ default: number;
320
+ };
321
+ k?: undefined;
322
+ tolPct?: undefined;
323
+ show?: undefined;
324
+ look?: undefined;
325
+ rows?: undefined;
326
+ rev?: undefined;
327
+ box?: undefined;
328
+ };
329
+ required: string[];
330
+ };
331
+ output: string;
332
+ } | {
333
+ name: string;
334
+ input: {
335
+ type: string;
336
+ properties: {
337
+ bars: {
338
+ type: string;
339
+ description: string;
340
+ };
341
+ rows: {
342
+ type: string;
343
+ default: number;
344
+ };
345
+ sessionsShown: {
346
+ type: string;
347
+ default: number;
348
+ };
349
+ k?: undefined;
350
+ tolPct?: undefined;
351
+ show?: undefined;
352
+ look?: undefined;
353
+ rowsWanted?: undefined;
354
+ rev?: undefined;
355
+ box?: undefined;
356
+ };
357
+ required: string[];
358
+ };
359
+ output: string;
360
+ } | {
361
+ name: string;
362
+ input: {
363
+ type: string;
364
+ properties: {
365
+ bars: {
366
+ type: string;
367
+ description: string;
368
+ };
369
+ rev: {
370
+ type: string;
371
+ default?: undefined;
372
+ };
373
+ k?: undefined;
374
+ tolPct?: undefined;
375
+ show?: undefined;
376
+ look?: undefined;
377
+ rowsWanted?: undefined;
378
+ sessionsShown?: undefined;
379
+ rows?: undefined;
380
+ box?: undefined;
381
+ };
382
+ required: string[];
383
+ };
384
+ output: string;
385
+ } | {
386
+ name: string;
387
+ input: {
388
+ type: string;
389
+ properties: {
390
+ bars: {
391
+ type: string;
392
+ description: string;
393
+ };
394
+ box: {
395
+ type: string;
396
+ };
397
+ rev: {
398
+ type: string;
399
+ default: number;
400
+ };
401
+ k?: undefined;
402
+ tolPct?: undefined;
403
+ show?: undefined;
404
+ look?: undefined;
405
+ rowsWanted?: undefined;
406
+ sessionsShown?: undefined;
407
+ rows?: undefined;
408
+ };
409
+ required: string[];
410
+ };
411
+ output: string;
412
+ })[];
413
+ };
414
+
415
+ export { type Bar, type HarmonicHit, type KagiLine, type Pivot, type PnfColumn, type Series, type StudyPath, type StudyProfile, type StudyZone, atr, chartPatterns, describe, elliott, harmonics, kagi, pointFigure, rma, sessionVolumeProfiles, swings, tpoProfiles, trueRange, volumeProfile };