Four-Price Doji
Install and import#
npm install fintech-algorithmsimport { fourPriceDoji } from "fintech-algorithms/price-action-and-candlesticks/single-candle-patterns/four-price-doji";Signature#
fourPriceDoji(input)Marks each bar whose entire range and whose open-to-close distance both sit within a tick tolerance, the degenerate candle where all four prices are effectively the same.
Parameters#
| Name | Type | Notes |
|---|---|---|
input | TopicInput | bars is a chronologically ordered array of OHLCV rows; each needs a non-empty timestamp strictly greater than the previous row's and finite open, high, low, close and volume. The single-candle family validates body_ratio (default 0.05), shadow_ratio (default 0.35), shadow_body_multiple (default 2) and tick_tolerance (default 0.01) on every call, but this topic reads only tick_tolerance, the price distance at which a range and a body still count as zero. |
Returns#
TopicResult
series.label is "neutral" when both high minus low and the absolute open-to-close distance are within tick_tolerance, and "none" otherwise. series.score is tick_tolerance minus the larger of those two distances, so it is at or above zero exactly when the bar matches. latest carries the last value of each. There is no warm-up: unlike its siblings this topic has no positive-span guard, so both series hold a value for every bar and ready_at is 0.
Warm-up#
The first 0 bars positions are null. Purely per-bar arithmetic with no smoothing state and no span guard, so neither label nor score is ever null and ready_at is 0.
Errors#
- When a bar has a non-finite price or volume, a negative volume, a
highbelow its own open/low/close, alowabove them, or atimestampthat does not advance — throws Error - When
tick_toleranceis not a finite number or is negative — throws Error - When
inputis not an object,input.parametersis not an object, orbarsis not an array holding at least one bar — throws Error
Complexity: time O(n),
space O(n).
Worked example#
executed Captured by running this function on the input its own test provides. Real output of real code — but not asserted against a published figure.
Input#
{
"bars": [
{
"timestamp": "2024-01-02",
"basis": "synthetic-unadjusted",
"open": 100,
"high": 101.45,
"low": 98.695,
"close": 100,
"volume": 750000,
"benchmark": 200
},
{
"timestamp": "2024-01-03",
"basis": "synthetic-unadjusted",
"open": 101.49111452,
"high": 103.38381693,
"low": 100.05480022,
"close": 101.78791214,
"volume": 795117,
"benchmark": 200.56326135
},
{
"timestamp": "2024-01-04",
"basis": "synthetic-unadjusted",
"open": 102.45519048,
"high": 104.6701838,
"low": 100.91147007,
"close": 102.9549389,
"volume": 840234,
"benchmark": 201.11020913
}
],
"parameters": {}
}Call#
fourPriceDoji(input)Returns#
object with 9 fields: topic_id, title, state, ready, ready_at, series, latest, parameters, …
{
"topic_id": "D06-F02-A11",
"title": "Four-Price Doji",
"state": "calculated",
"ready": true,
"ready_at": 0,
"series": {
"label": ["none", "none", "none", "none", "none", "none"],
"score": [
-2.74500000000001,
-3.3190167099999908,
-3.748713730000011,
-3.928635059999996,
-3.819996080000001,
-3.4596505999999945
]
},
"latest": {
"label": "none",
"score": -3.1108633100000045
},
"parameters": {},
"diagnostics": {
"causal": true,
"input_count": 96
}
}Diagrams#
Calculation flow#
Four-Price Doji calculation flow
flowchart LR
A["one closed OHLC candle, tick size, prior-only reference sc"] --> B["Validate order, basis, and finite values"]
B --> C["Apply the selected Four-Price Doji convention"]
C --> D["Emit value, readiness, and diagnostics"]
D --> E["Interpret descriptively; test outcomes separately"]
B -->|invalid or insufficient| X["Withhold output with a reason"]
Four-Price Doji readiness and evidence states
stateDiagram-v2
[*] --> Waiting
Waiting --> Ready: enough valid causal observations
Waiting --> Rejected: malformed or unsupported input
Ready --> Calculated: selected formula applied
Calculated --> Interpreted: diagnostic and limitation retained
Interpreted --> Ready: next observation arrives
Rejected --> Waiting: corrected input and deterministic reset
How it works#
This page states the contract — how to call it correctly. The article explains the concept: why it works, and where it breaks.
References#
- TA-Lib pattern-recognition catalog — see linked primary or authoritative record
- CME Group candlestick chart lesson — see linked primary or authoritative record
- Japanese Candlestick Charting Techniques — see linked primary or authoritative record
- Evidence decision
- Level 1 evidence map