JavaScript library for candlestick patterns detection.
npm install candlestick








A modern, modular JavaScript library for candlestick pattern detection. Detects classic reversal and continuation patterns in OHLC data, with a clean API and no native dependencies.
---
---
---
---
``bash`
npm install candlestick
`js
const { isHammer, hammer, patternChain } = require('candlestick');
const candle = { open: 10, high: 15, low: 8, close: 14 };
console.log(isHammer(candle)); // true or false
const candles = [/ array of OHLC objects /];
console.log(hammer(candles)); // [indices]
const results = patternChain(candles);
console.log(results); // [{ index, pattern, match }]
`
---
`js
// Import all patterns (CommonJS)
const candlestick = require('candlestick');
// Or import only what you need (recommended for tree-shaking in ESM)
const { isHammer, hammer, patternChain } = require('candlestick');
`
js
{
open: Number,
high: Number,
low: Number,
close: Number
}
`---
Pattern Detection Functions
$3
- isHammer(candle)
- isBullishHammer(candle) / isBearishHammer(candle)
- isInvertedHammer(candle)
- isBullishInvertedHammer(candle) / isBearishInvertedHammer(candle)
- isDoji(candle)
- isBullishEngulfing(prev, curr) / isBearishEngulfing(prev, curr)
- isBullishHarami(prev, curr) / isBearishHarami(prev, curr)
- isBullishKicker(prev, curr) / isBearishKicker(prev, curr)
- isHangingMan(prev, curr)
- isShootingStar(prev, curr)$3
- hammer(dataArray) / bullishHammer(dataArray) / bearishHammer(dataArray)
- invertedHammer(dataArray) / bullishInvertedHammer(dataArray) / bearishInvertedHammer(dataArray)
- doji(dataArray)
- bullishEngulfing(dataArray) / bearishEngulfing(dataArray)
- bullishHarami(dataArray) / bearishHarami(dataArray)
- bullishKicker(dataArray) / bearishKicker(dataArray)
- hangingMan(dataArray) / shootingStar(dataArray)All array functions return an array of indices where the pattern occurs.
---
High-Level Pattern Chaining
Scan a series for multiple patterns in one pass:
`js
const { patternChain, allPatterns } = require('candlestick');const matches = patternChain(dataArray, allPatterns);
// matches: [
// { index: 3, pattern: 'hammer', match: [candleObj] },
// { index: 7, pattern: 'bullishEngulfing', match: [candleObj, candleObj] },
// ...
// ]
`You can also pass a custom list of patterns:
`js
const matches = patternChain(dataArray, [
{ name: 'doji', fn: candlestick.doji },
{ name: 'bullishEngulfing', fn: candlestick.bullishEngulfing, paramCount: 2 },
]);
`> Multi-candle patterns: Patterns like Engulfing, Harami, Kicker, Hanging Man, and Shooting Star span two candles. The
match array in the result will contain both candles (length 2), thanks to the paramCount property. Single-candle patterns return a single-element array.---
Pattern Descriptions
- Hammer: Small body near the top (body < 1/3 of range), long lower shadow (tail ≥ 2× body), small upper shadow. Signals possible bullish reversal.
- Inverted Hammer: Small body near the bottom, long upper shadow (wick ≥ 2× body), small lower shadow. Bullish reversal signal.
- Doji: Very small body (body < 10% of range), open ≈ close. Indicates indecision. Candle must have range (high > low).
- Engulfing: Second candle's body fully engulfs the previous (body range covers previous body). Bullish or bearish.
- Harami: Second candle's body is inside the previous (body range within previous body). Bullish or bearish.
- Kicker: Strong reversal with a gap and opposite color. Bullish or bearish.
- Hanging Man: Bullish candle followed by a bearish hammer with a gap up. Bearish reversal.
- Shooting Star: Bullish candle followed by a bearish inverted hammer with a gap up. Bearish reversal.
> Note: The library does not mutate your input data. All pattern functions return new objects with precomputed properties (e.g.,
bodyLen, wickLen, etc.) as needed. If you plan to run many pattern detectors on the same data, you can precompute properties once using precomputeCandleProps from the utilities for better performance.---
Examples
$3
`js
const { isBullishKicker, isBearishKicker } = require('candlestick');const prev = { open: 40.18, high: 41.03, low: 40.09, close: 40.86 };
const curr = { open: 39.61, high: 39.35, low: 38.71, close: 38.92 };
console.log(isBullishKicker(prev, curr)); // false
console.log(isBearishKicker(prev, curr)); // true
`$3
`js
const { shootingStar } = require('candlestick');const data = [
{ open: 29.01, high: 29.03, low: 28.56, close: 28.64 },
// ...
];
console.log(shootingStar(data)); // [index, ...]
`$3
`js
const { patternChain, allPatterns } = require('candlestick');
const matches = patternChain(data, allPatterns);
console.log(matches);
// [ { index: 3, pattern: 'hammer', match: [Object] }, ... ]
`---
Full Example Files
examples/ directory for runnable, copy-pasteable usage of every pattern and utility:examples/hammer.js — Hammer pattern detection
- examples/invertedHammer.js — Inverted Hammer pattern detection
- examples/doji.js — Doji pattern detection
- examples/engulfing.js — Engulfing pattern detection
- examples/harami.js — Harami pattern detection
- examples/kicker.js — Kicker pattern detection
- examples/reversal.js — Hanging Man and Shooting Star
- examples/patternChain.js — Multi-pattern detection with patternChain
- examples/utils.js — Utility functions: bodyLen, wickLen, tailLen, isBullish, isBearish, hasGapUp, hasGapDown, findPatternexamples/README.md for more details and instructions.---
Linting & Formatting
- ESLint: Modern flat config (eslint.config.js)
- Prettier: For code formatting
- Run npm run lint and npm run format (if configured)---
Running Tests
`bash
npm test
`---
Contributing
- Please open issues or pull requests for bugs, features, or questions.
- Add tests for new patterns or utilities.
- Follow the code style enforced by ESLint and Prettier.
- See CONTRIBUTING.md for full guidelines.
---
Changelog
See CHANGELOG.md for release history and major changes.
---
FAQ
Q: Why is my pattern not detected?
- Ensure your candle objects have all required fields (
open, high, low, close`).Q: Does this library mutate my data?
- No. All computations are done on copies; your input data is never changed.
Q: Can I use this with TypeScript?
- The library is written in JS, but JSDoc comments provide some type hints. TypeScript support is planned (see ROADMAP.md).
Q: Are there visual examples of patterns?
- Not yet, but this is planned (see ROADMAP.md). For now, see the pattern descriptions and links to external resources.
---
See ROADMAP.md for planned features and future directions.
---
See CODE_OF_CONDUCT.md for community standards and enforcement.
---
MIT. See LICENSE.