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

Rising/Falling Window

Install and import#

bash
npm install fintech-algorithms
ts
import { risingFallingWindow } from "fintech-algorithms/price-action-and-candlesticks/two-candle-patterns/rising-falling-window";

Signature#

risingFallingWindow(input)

Scans consecutive pairs of bars for a price gap, where the second bar's range clears the first bar's entirely in either direction.

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 pattern family validates tick_tolerance (default 0.01, at least 0) and doji_body_ratio (default 0.05, within 0..1) on every call, but this topic reads only tick_tolerance, the margin by which the second bar's low must clear the first bar's high, or its high fall below the first bar's low, for the gap to count.

Returns#

TopicResult

series.matched is the boolean verdict for the pair ending at that index, and series.label is "rising" for an upward gap, "falling" for a downward one, and "none" when the ranges overlap. latest carries the last value of each. The warm-up is the one leading bar that has no predecessor.

Warm-up#

The first 1 bar positions are null. The pattern needs a two-bar window, so both series hold null at index 0 and ready_at is 1. From index 1 onward matched is false or true, and false is a real verdict rather than a warm-up placeholder, so ready_at does not depend on any gap ever appearing. A one-bar input returns null throughout, with ready_at null and state "waiting".

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, or doji_body_ratio falls outside 0..1 — 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#

risingFallingWindow(input)

Returns#

object with 9 fields: topic_id, title, state, ready, ready_at, series, latest, parameters, …

{
  "topic_id": "D06-F03-A12",
  "title": "Rising/Falling Window",
  "state": "calculated",
  "ready": true,
  "ready_at": 1,
  "series": {
    "label": [null, "none", "none", "none", "none", "none"],
    "matched": [null, false, false, false, false, false]
  },
  "latest": {
    "label": "none",
    "matched": false
  },
  "parameters": {},
  "diagnostics": {
    "causal": true,
    "input_count": 96
  }
}

Diagrams#

Rising/Falling Window — article hero
Rising/Falling Window — concept map
Rising/Falling Window — decision comparison
Rising/Falling Window — worked example

Calculation flow#

Rising/Falling Window calculation flow
flowchart LR
    A["two consecutive closed OHLC candles, tick size, declared g"] --> B["Validate order, basis, and finite values"]
    B --> C["Apply the selected Rising/Falling Window 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"]
Rising/Falling Window 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 Two-Candle Patterns family#