fintech-algorithms
Using a coding agent? Give it the skill: npx skills add IslamBaraka90/Fintech-Algorithms-Library What it does →

Four-Price Doji

Install and import#

bash
npm install fintech-algorithms
ts
import { 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#

NameTypeNotes
inputTopicInputbars 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 high below its own open/low/close, a low above them, or a timestamp that does not advance — throws Error
  • When tick_tolerance is not a finite number or is negative — throws Error
  • When input is not an object, input.parameters is not an object, or bars is 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#

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#

Four-Price Doji — article hero
Four-Price Doji — concept map
Four-Price Doji — decision comparison
Four-Price Doji — worked example

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.

Read the article →

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

The rest of the Single-Candle Patterns family#