QA GATE · GOOD 18/18 automated ai-check.js · 18 readability, YMYL and image gates · mechanics verified against vike-indicators · live real-data chart embedded
Burstiness (sentence-length SD)10.9
Lexical diversity (MATTR-50)0.82
Consecutive similar sentences2
Repeated paragraph starts (≥3)0
AI-marker phrases0
Demonstrated experience2
Avg sentence length (words)18.5
Repeated 5-grams0
H2 section balance (50–500w)0 off
YMYL risk disclaimeryes
Mechanics verified vs codeyes
Primary keyword coverageyes
Internal links + CTA10
Content visuals11
Every figure has a caption11/11
Alt / caption text coverage100%
Distributed (≥1 per section)7/8 (88%)
Filenames sluggedn/a (inline)
Live interactive chart7 real
Detector inventory63 derived
Learn · Trading Indicators · Patterns

Candlestick Indicators: All 63 Detectors, and What They Returned

Candlestick indicators are what a pattern becomes once somebody writes it down as code. A shape you recognise by eye turns into a predicate over four numbers per bar, and the predicate is either satisfied or it is not. Our engine carries 63 of them, and this page is the whole list plus the measurements.

That translation is where the interesting things happen. Two patterns every textbook separates turn out to be one function. A clause sits in a detector doing nothing at all. And when you finally score the outputs, most of them land under the bar they have to clear. All of it comes out of the same place: reading crates/vike-indicators/src/indicators/patterns.rs and then running it.

What a candlestick indicator actually is

what you seebody ≤ 30% of rangelower shadow ≥ 2 × bodyupper shadow ≤ bodywhat batch_hammer checks+100one number, per barall three hold, or the bar returns zero
The whole translation. Three comparisons over four prices replace the paragraph a book would spend, and everything the paragraph knew about context is gone with it.
RAD/USDT daily — a real pattern detected 2026-08-04, long: 6% target hit in 6 days.

A pattern in a book is a drawing plus a paragraph. A pattern in an engine is a function that reads open, high, low and close, and returns one number for every bar you feed it.

Take the hammer. The drawing shows a small body perched above a long lower wick, and nothing else. The function says body <= 0.3 range && lower >= 2 body && upper <= body, and batch_hammer applies exactly that to each candle in turn. No trend context, no support level, no judgement about whether the wick "looks" convincing. Three comparisons, and the answer is yes or no.

Everything you gain and everything you lose follows from that swap. You gain scale — 364,147 bars in a few seconds, with no fatigue and no favourite setups. You lose every scrap of context the eye was quietly supplying, which is a much bigger loss than most people expect, and the scores further down are what it costs.

What a detector returns: plus one hundred, minus one hundred, zero

three values, and the third one is two different things+100bullish23 detectors can only ever be bullish−100bearish15 detectors can only ever be bearish0nothing — or not yet25 detectors emit both signs
Magnitude carries no information; only the sign does. And because the output line is initialised to zero rather than to NaN, a warm-up bar and a clean rejection return the same number — counts derived from patterns.rs.

Each of the 63 kernels returns one line of numbers, one value per bar, drawn from exactly three: +100 for bullish, -100 for bearish, 0 for nothing found.

Magnitude carries no meaning. A hundred is not a confidence score and never grows with how textbook the candle looked — it is a flag borrowed from the Python implementation this crate was ported from, where the patterns were plain integers. Only the sign matters, and only 25 of the detectors ever emit both signs. Another 23 can only ever return +100, and 15 only ever -100, so their polarity is fixed before any data arrives.

One detail deserves more attention than it usually gets. The output vector starts life filled with zeros, so a bar that produced no pattern and a bar the detector could not judge yet both read zero. Several kernels need a ten-bar average body before they can say anything, and during that warm-up they say 0 — which is indistinguishable from a confident no. The volume-profile kernel in the same engine does the opposite and warms up with NaN, and I trust that one more for exactly this reason: a missing value that admits it is missing cannot be mistaken for evidence.

The 63 detectors in the engine

PatternDetectorBarsSign · columns read
One bar 18 detectors
Dojibatch_doji1OHLC
Hammerbatch_hammer1OHLC
Inverted Hammerbatch_inverted_hammer1OHLC
Hanging Manbatch_hanging_man1OHLC
Shooting Starbatch_shooting_star1OHLC
Dragonfly Dojibatch_dragonfly_doji1OHLC
Gravestone Dojibatch_gravestone_doji1OHLC
Long-Legged Dojibatch_longlegged_doji1OHLC
Rickshaw Manbatch_rickshaw_man1OHLC
Takuribatch_takuri1OHLC
Marubozubatch_marubozu1▲▼OHLC
Closing Marubozubatch_closing_marubozu1▲▼OHLC
Spinning Topbatch_spinning_top1OHLC
High Wavebatch_high_wave1OHLC
Long Linebatch_long_line1▲▼OC
Short Linebatch_short_line1OHLC
Belt Holdbatch_belt_hold1▲▼OHLC
Opening Marubozubatch_opening_marubozu1▲▼OHLC
Two bars 18 detectors
Engulfingbatch_engulfing2▲▼OC
Doji Starbatch_doji_star2▲▼OHLC
Haramibatch_harami2▲▼OC
Harami Crossbatch_harami_cross2▲▼OC
Piercingbatch_piercing2OLC
Dark Cloud Coverbatch_dark_cloud_cover2OHC
Counterattackbatch_counterattack2▲▼OC
Meeting Linesbatch_meeting_lines2▲▼OC
Separating Linesbatch_separating_lines2▲▼OC
Matching Lowbatch_matching_low2OC
On Neckbatch_on_neck2OLC
In Neckbatch_in_neck2OLC
Thrustingbatch_thrusting2OLC
Kickingbatch_kicking2▲▼OHLC
Kicking by Lengthbatch_kicking_by_length2▲▼OHLC
Homing Pigeonbatch_homing_pigeon2OC
Gapping Side-by-Side Whitebatch_gap_side_side_white2OC
Tasuki Gapbatch_tasuki_gap2▲▼OC
Three bars 19 detectors
Morning Starbatch_morning_star3OHC
Evening Starbatch_evening_star3OLC
Morning Doji Starbatch_morning_doji_star3OHC
Evening Doji Starbatch_evening_doji_star3OLC
Three White Soldiersbatch_three_white_soldiers3OHC
Three Black Crowsbatch_three_black_crows3OLC
Identical Three Crowsbatch_identical_three_crows3OC
Three Insidebatch_three_inside3▲▼OC
Three Outsidebatch_three_outside3▲▼OC
Three Stars in the Southbatch_three_stars_in_south3OHLC
Abandoned Babybatch_abandoned_baby3▲▼OHLC
Advance Blockbatch_advance_block3OHC
Stalled Patternbatch_stalled_pattern3OC
Two Crowsbatch_two_crows3OC
Upside Gap Two Crowsbatch_upside_gap_two_crows3OC
Tristarbatch_tristar3▲▼OHLC
Unique Three Riverbatch_unique_three_river3OLC
Stick Sandwichbatch_stick_sandwich3OC
Up/Down-side Gap Three Methodsbatch_xside_gap_three_methods3▲▼OC
Four bars 3 detectors
Three-Line Strikebatch_three_line_strike4▲▼OC
Concealing Baby Swallowbatch_concealing_baby_swallow4OHLC
Hikkakebatch_hikkake4▲▼HLC
Five bars 5 detectors
Ladder Bottombatch_ladder_bottom5OHC
Rising/Falling Three Methodsbatch_rise_fall_three_methods5▲▼OHLC
Mat Holdbatch_mat_hold5OLC
Modified Hikkakebatch_hikkake_mod5▲▼HLC
Breakawaybatch_breakaway5▲▼OC
All 63 candlestick kernels in vike-indicators, parsed straight out of the crate source — bar count, price columns and possible signs included. Linked names have a full breakdown here; the rest are listed because leaving them out would be the more flattering choice.

Nothing in the table below is typed. A script reads patterns.rs, pulls out every kernel, and records what the source says about each: how many bars it needs, which price columns it binds, and which signs it can emit. Rename a function in the crate and this page changes with it.

Eighteen have a full page here already, linked in the table. The rest are inventory, and being honest about that is the point — a page claiming deep coverage of all of them would be the exact kind of writing this section exists to replace.

Two of the names are not Japanese at all. batch_hikkake and batch_hikkake_mod come from Daniel Chesler's 2003 work on false breakouts, and they are also the only two kernels in the file that never bind the open column. Everything else traces back to the Sakata and Nison lineage, whatever the English rendering.

The families the source gives away

Same rule, opposite signbatch_hammer / batch_hanging_man2 pairsSame rule, one constant movedbatch_counterattack / batch_meeting_lines1 pairSame rule, mirrored price columnsoldiers read the high, crows the low17 kernels
Found by normalising each kernel — comments, whitespace and the function’s own name removed — and comparing the results, so these groups are a measurement of the source rather than a taxonomy laid over it.
ADX/USDT daily — a real pattern detected 2026-08-05, long: 6% target hit in 1 day.
ADX/USDT daily — a real pattern detected 2026-08-05, short: 8% stop hit in 1 day.

Read the file top to bottom and the 63 stop looking like 63 separate ideas. They fall into families, and the families are visible in the code rather than in any taxonomy somebody imposed afterwards.

Same rule, opposite sign. Strip comments and whitespace from batch_hammer and batch_hanging_man and the two functions are identical apart from the constant they write out. Same for batch_inverted_hammer and batch_shooting_star. The detector cannot tell a hammer from a hanging man, because there is nothing in the candle to tell them apart — the difference lives in the trend that preceded it, and no single-bar kernel reads that.

One constant apart. batch_counterattack and batch_meeting_lines share every line; one accepts closes within 3% of the average body, the other within 2%. Meeting lines is counterattack with a tighter tolerance, nothing more.

Mirrored across a price column. This one is easy to miss and changes what a detector can even see. batch_three_white_soldiers binds open, high and close; its mirror batch_three_black_crows binds open, low and close. So a soldier may carry a lower wick of any length whatsoever and pass, while a crow can hide an upper wick just as freely. Fifteen kernels are half-blind this way, and the two charts below are one bar read by both members of a sign twin — the same candle scored long, then scored short.

Where a detector disagrees with the eye

long-legged doji|body mid − range mid| = |lower − upper| ÷ 2both shadows ≥ 30% ⇒ their gap ≤ 40%so the distance never passes 20% of rangeand the clause tolerates 25%measured: 13,141 long-legged dojis, 13,141 rickshaw men, identical bars
Half a page of algebra says the rickshaw man’s extra clause is unreachable, and a scan of every daily bar on the tape agrees — two named patterns, one detector.

Now the part you only find by reading source. batch_rickshaw_man and batch_longlegged_doji are separate functions in the crate, and separate patterns in every book, and they flag identical bars.

The rickshaw man is the long-legged doji's three clauses plus a fourth: the body's midpoint must sit within 25% of the range's midpoint. That clause can never bind. The distance between those two midpoints always equals half the difference between the shadows, and once both shadows are at least 30% of the range, their difference cannot exceed 40% of it — so the distance tops out at 20%, comfortably inside a 25% tolerance. Across my scan the long-legged doji fired 13,141 times and the rickshaw man fired 13,141 times, on the same bars, with no exceptions. The long-legged doji page works through the algebra in full.

A second dead clause turned up in batch_three_white_soldiers. After the colour, size, containment and shadow tests, the kernel checks that the three closes ascend. Over the same 364,147 bars, 23 candidates reached that final test and 23 survived it. The clause is not redundant as logic — you can construct a triple that breaks it — but on this tape it never once made a decision. When I first saw that I assumed a bug in my port, so I re-ran it against the source clause by clause before writing it down.

Every ported detector, scored

DetectorFired1 perResolvedWin rate
Evening Star1364,147.01100.0%
Three Black Crows448,276.14180.5%
Piercing1622,759.21464.3%
Dark Cloud Cover2813,005.22864.3%
Inverted Hammer18,76919.416,99057.2%
Engulfing63,6715.758,54556.8%
Spinning Top83,0514.476,88556.5%
Hanging Man15,21923.914,01656.3%
Hammer15,21923.913,89456.0%
Marubozu2,861127.32,53155.8%
Gravestone Doji785463.961455.7%
Doji24,14415.121,53755.3%
Long-Legged Doji13,14127.711,66555.3%
Rickshaw Man13,14127.711,66555.3%
Harami26,88313.525,47454.9%
Dragonfly Doji820444.170754.7%
Shooting Star18,76919.417,00453.9%
Morning Star2182,073.5250.0%
Three White Soldiers2315,832.52339.1%
364,147 daily bars, 6% target against an 8% stop over 10 bars, a bar touching both scored a loss. Green clears the 57.1% break-even on a real sample; amber clears it on under a hundred resolved signals, which is not the same claim.
PUNDIX/USDT daily — a real pattern detected 2026-01-12, short: 6% target hit in 9 days.
VANA/USDT daily — a real pattern detected 2026-08-05, long: 6% target hit in 5 days.
Read the hit rates against the hurdle, never on their own: paying 8 to win 6 needs 57.1% before fees. Seventeen of the nineteen finished below it, and the one with a large sample cleared it by a tenth of a point.

Nineteen of the kernels are ported into Python here, verified column-for-column against the crate, and run over 299 Binance spot pairs — 364,147 daily bars from August 2017 onward.

Every firing was resolved the same way: enter at the close, take the first touch over the next ten bars of a 6% target or an 8% stop, and score a bar that touched both as a loss. Long for +100, short for -100. That bracket is the one our MACD and ichimoku pages use, so these numbers sit next to those, and it carries the same hurdle: paying eight to win six needs a 57.1% hit rate before a cent of fees.

Two of the nineteen clear it. batch_inverted_hammer came in at 57.2% across 16,990 resolved signals, which beats the hurdle by a tenth of a point and dies to the first taker fee. batch_three_black_crows scored 80.5% — on 41 resolved signals in nine years of tape, a sample far too thin to plan around, which is itself the finding. The other seventeen finished under water.

Where candlestick indicators fail

BARD/USDT daily — a real pattern detected 2026-04-10, long: 8% stop hit in 5 days.
LAZIO/USDT daily — a real pattern detected 2026-07-12, short: 8% stop hit in 2 days.

The failure mode is not that these detectors are wrong. It is that they are right about the geometry and the geometry was never the edge.

Look at what happens to a sign twin. batch_hammer and batch_hanging_man flag the identical 15,219 bars; scored long the set returns 56.0%, scored short 56.3%. Both sit under the hurdle. A rule whose bullish and bearish readings both lose money is not describing direction — it is describing a wick, and paying the spread for the privilege.

Rarity is the other trap, and it runs the opposite way from intuition. batch_evening_star fired once in 364,147 bars. batch_morning_star managed two. Those detectors demand a gap that a venue trading every second of the year almost never leaves, so a scanner built on them will sit silent for years and then hand you a sample of one. The three examples below are real detections that lost: a dragonfly doji stopped out in five days, a marubozu stopped out in two.

None of this argues for abandoning the shapes. It argues for knowing which question a detector answers, which is always "did this geometry occur", and never "will price go up". The candlestick patterns hub breaks the shapes down one at a time, and volume profile is the same treatment applied to a very different input.

Frequently asked questions

Can candlestick patterns be used as indicators? Yes, and they already are — a detector is just an indicator whose output happens to be three-valued. What changes is that you can measure it, which is how you find out that most of them do not clear their break-even.

How many candlestick patterns can be detected automatically? Our engine ships 63. Counted by how many bars each kernel actually reads, 18 need one, 18 need two, 19 need three, and 8 stretch to four or five. Other libraries land near the same total because they mostly descend from one original list.

Which candlestick indicator is the most reliable? On our tape, none of them reliably. batch_inverted_hammer was the only high-sample detector to clear the 6-for-8 hurdle, and it cleared by 0.1 points. Treat any page ranking patterns by "reliability" without publishing its bracket and its sample size as decoration.

Why do two patterns share one detector? Because the candle is identical and only the preceding trend differs. The shooting star and the inverted hammer are one function with two names, and any tool telling you it distinguished them from the bar alone is guessing.

Do I still need to read charts if the detection is automated? More than before. The detector supplies the geometry cheaply and reliably; every scrap of context — level, regime, what the market did to get here — is still entirely yours to supply.

This is educational material, not financial advice. Every figure above was measured on past bars under one fixed bracket, past results generalise poorly, and trading carries real risk of loss — size positions so that being wrong stays survivable.

Read the volume profile breakdown