Ora
All use cases All industries

Individuals

Retail investorActive day traderSwing traderOptions traderDividend investorLong-term passive investorCrypto traderFX traderCommodities traderSocial trading communityStudents and universities

Buy side

Financial advisor / RIAWealth managerFamily officeHedge fund PMQuant researcherPortfolio manager (long-only)Risk managerPrivate equityVC / growth investorFund-of-funds allocator

Sell side

Equity research analystSell-side sales traderExecution trader / deskMarket makerProp trading firmCompliance officer

Corporates

Investor relations teamCorporate treasuryCFO officeBank credit analystFinancial journalist / media

Builders

Quant developerFintech app builderRobo-advisorBroker appAlgo / bot developerData vendor / platformTrading educator / newsletter

Institutions

ETF issuerIndex providerInsurance investment officePension fundEndowmentSovereign wealth fund

Use cases · Builders

Data vendor / platform: 20 ways to use Ora

Derived signals and event flags as a product, delivered by webhook to clients. Each example is a complete, runnable request with the real answers it returned (49 requests, captured 2026-10-31), what they mean and, where it fits, the action it would send.

Answers were captured on ora-fin-0.1.1. Another model changes the request JSON and the Playground link; run it there to see its answers.
Rule functions and facts used by this player (64)

ref 10sma 8offset 6rsi 5ema 3avg 3abs 2pays_dividend 2adx 2atr_pct 2bblower 2bbmid 2days_since_split 2log 2sqrt 2std 2obv 2atr 2beat_eps_last 1beat_revenue_last 1beat_streak 1eps_growth_yoy 1eps_surprise_pct 1last_earnings_move 1cut_last 1days_to_ex_div 1div_yield_ttm 1raised_last 1years_of_growth 1doji 1engulfing_bear 1engulfing_bull 1evening_star 1hammer 1marubozu 1morning_star 1shooting_star 1bbupper 1macdhist 1days_to_split 1last_split_ratio 1reverse_split_last 1median 1percentrank 1swinghigh 1swinglow 1macd 1macdsignal 1stochd 1stochk 1diminus 1diplus 1linreg 1highest 1zscore 1days_to_earnings 1greatest 1hl2 1hlc3 1least 1ohlc4 1tr 1rec 1rma 1

Examples 1–10 of 20 · page 1 of 2

Data vendor / platform · example 1

An earnings event-flags feed for clients: NVDA, AAPL, MSFT, AMZN

Deliver a daily row per symbol with exact earnings flags (beat, streak, surprise, reaction) to a client's ingestion endpoint.

ora-fin-0.1.14 symbols, one request each6 questions1 actionworkflow · Mon–Fri at 18:00 ET
  1. ScheduleMon–Fri at 18:00 ET
  2. State4 symbols
  3. Questions6 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

{"symbol":"NVDA"} then AAPL, MSFT, AMZN, one request each. The server fills in the latest completed session.

Questions

beatEnglish → ruleDid the stock beat EPS estimates last quarter?
beat_revEnglish → ruleDid revenue beat estimates last quarter?
streakrulebeat_streak >= 4
Beat four quarters in a row
surpriseruleeps_surprise_pct > 5
EPS beat by more than 5%
reactionruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%
growthruleeps_growth_yoy > 10
EPS up more than 10% on the year

Answers

Symbolbeatrulebeat_revrulestreakrulesurpriserulereactionrulegrowthruleFired
NVDA0.85910.85910.94630.94630.94630.9463row
AAPL0.85910.85910.94630.94630.94630.9463row
MSFT0.85910.85910.94630.05370.05370.8327row
AMZN0.14090.14090.05370.05370.05370.0537row

true false not known for rules; forecasts are odds. Hover a column for its question.

Actions

Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.

beat >= 0→Webhookclient-feed
NVDA 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "earnings_flags_v1",
  "symbol": "NVDA",
  "as_of": "2026-10-30",
  "beat_eps": 0.8591,
  "beat_revenue": 0.8591,
  "beat_streak_4": 0.9463,
  "surprise_over_5": 0.9463,
  "reaction_over_5": 0.9463,
  "eps_growth_over_10": 0.9463
}
AAPL 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "earnings_flags_v1",
  "symbol": "AAPL",
  "as_of": "2026-10-30",
  "beat_eps": 0.8591,
  "beat_revenue": 0.8591,
  "beat_streak_4": 0.9463,
  "surprise_over_5": 0.9463,
  "reaction_over_5": 0.9463,
  "eps_growth_over_10": 0.9463
}
MSFT 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "earnings_flags_v1",
  "symbol": "MSFT",
  "as_of": "2026-10-30",
  "beat_eps": 0.8591,
  "beat_revenue": 0.8591,
  "beat_streak_4": 0.9463,
  "surprise_over_5": 0.0537,
  "reaction_over_5": 0.0537,
  "eps_growth_over_10": 0.8327
}
AMZN 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "earnings_flags_v1",
  "symbol": "AMZN",
  "as_of": "2026-10-30",
  "beat_eps": 0.1409,
  "beat_revenue": 0.1409,
  "beat_streak_4": 0.0537,
  "surprise_over_5": 0.0537,
  "reaction_over_5": 0.0537,
  "eps_growth_over_10": 0.0537
}

What it means

Session of 2026-10-30, 4 symbols: Did the stock beat EPS estimates last quarter: true for NVDA, AAPL, MSFT of 4. Did revenue beat estimates last quarter: true for NVDA, AAPL, MSFT of 4. Beat four quarters in a row: true for NVDA, AAPL, MSFT of 4. EPS beat by more than 5%: true for NVDA, AAPL of 4. row fired for NVDA, AAPL, MSFT, AMZN.

Each field is an exact fact; a value near one half means not known (for example no estimate on record), which the client should store as null.

As a scheduled workflow (Mon–Fri at 18:00 ET)

Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.

{
  "name": "An earnings event-flags feed for clients: NVDA, AAPL, MSFT, AMZN",
  "symbols": "NVDA AAPL MSFT AMZN",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "18:00",
  "model": "ora-fin-0.1.1",
  "questions": {
    "beat": {
      "type": "yes_no",
      "instructions": "Did the stock beat EPS estimates last quarter?"
    },
    "beat_rev": {
      "type": "yes_no",
      "instructions": "Did revenue beat estimates last quarter?"
    },
    "streak": {
      "type": "yes_no",
      "ask": "beat_streak >= 4"
    },
    "surprise": {
      "type": "yes_no",
      "ask": "eps_surprise_pct > 5"
    },
    "reaction": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    },
    "growth": {
      "type": "yes_no",
      "ask": "eps_growth_yoy > 10"
    }
  },
  "actions": [
    {
      "id": "row",
      "when": "beat >= 0",
      "do": "webhook",
      "connection": "client-feed",
      "body": {
        "dataset": "earnings_flags_v1",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "beat_eps": "{{beat}}",
        "beat_revenue": "{{beat_rev}}",
        "beat_streak_4": "{{streak}}",
        "surprise_over_5": "{{surprise}}",
        "reaction_over_5": "{{reaction}}",
        "eps_growth_over_10": "{{growth}}"
      }
    }
  ]
}
Request JSON (NVDA; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "beat": {
      "type": "yes_no",
      "instructions": "Did the stock beat EPS estimates last quarter?"
    },
    "beat_rev": {
      "type": "yes_no",
      "instructions": "Did revenue beat estimates last quarter?"
    },
    "streak": {
      "type": "yes_no",
      "ask": "beat_streak >= 4"
    },
    "surprise": {
      "type": "yes_no",
      "ask": "eps_surprise_pct > 5"
    },
    "reaction": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    },
    "growth": {
      "type": "yes_no",
      "ask": "eps_growth_yoy > 10"
    }
  },
  "actions": [
    {
      "id": "row",
      "when": "beat >= 0",
      "do": "webhook",
      "connection": "client-feed",
      "body": {
        "dataset": "earnings_flags_v1",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "beat_eps": "{{beat}}",
        "beat_revenue": "{{beat_rev}}",
        "beat_streak_4": "{{streak}}",
        "surprise_over_5": "{{surprise}}",
        "reaction_over_5": "{{reaction}}",
        "eps_growth_over_10": "{{growth}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "beat": {
      "yes_no": 0.8591,
      "rule": "beat_eps_last > 0.5",
      "basis": "pattern"
    },
    "beat_rev": {
      "yes_no": 0.8591,
      "rule": "beat_revenue_last > 0.5",
      "basis": "pattern"
    },
    "streak": {
      "yes_no": 0.9463,
      "rule": "beat_streak >= 4",
      "basis": "rule"
    },
    "surprise": {
      "yes_no": 0.9463,
      "rule": "eps_surprise_pct > 5",
      "basis": "rule"
    },
    "reaction": {
      "yes_no": 0.9463,
      "rule": "abs(last_earnings_move) > 5",
      "basis": "rule"
    },
    "growth": {
      "yes_no": 0.9463,
      "rule": "eps_growth_yoy > 10",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "row",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "client-feed",
      "preview": {
        "body": {
          "dataset": "earnings_flags_v1",
          "symbol": "NVDA",
          "as_of": "2026-10-30",
          "beat_eps": 0.8591,
          "beat_revenue": 0.8591,
          "beat_streak_4": 0.9463,
          "surprise_over_5": 0.9463,
          "reaction_over_5": 0.9463,
          "eps_growth_over_10": 0.9463
        }
      }
    }
  ]
}

abs beat_eps_last beat_revenue_last beat_streak eps_growth_yoy eps_surprise_pct last_earnings_move

Data vendor / platform · example 2

Dividend flags dataset: payers, raisers, cutters and ex-dates

Package dividend facts for income-focused clients as a daily dataset.

ora-fin-0.1.14 symbols, one request each6 questions1 action
  1. State4 symbols
  2. Questions6 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

{"symbol":"KO"} then JNJ, PG, O, one request each. The server fills in the latest completed session.

Questions

paysrulepays_dividend > 0.5
Pays a dividend
raisedruleraised_last > 0.5
Raised its last dividend
cutEnglish → ruleDid the stock cut its dividend last time?
exruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
growerruleyears_of_growth >= 10
Ten years of dividend growth
yield3rulediv_yield_ttm > 3
Yield above 3%

Answers

Symbolpaysruleraisedrulecutruleexrulegrowerruleyield3ruleFired
KO0.85910.14090.14090.20490.94630.0537row
JNJ0.85910.14090.14090.91870.94630.0648row
PG0.85910.14090.14090.05370.94630.2091row
O0.85910.14090.14090.05370.05370.9463row

true false not known for rules; forecasts are odds. Hover a column for its question.

Actions

Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.

pays >= 0→Webhookclient-feed
KO 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "dividend_flags_v1",
  "symbol": "KO",
  "as_of": "2026-10-30",
  "pays": 0.8591,
  "raised_last": 0.1409,
  "cut_last": 0.1409,
  "ex_within_30d": 0.2049,
  "growth_10y": 0.9463,
  "yield_over_3": 0.0537
}
JNJ 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "dividend_flags_v1",
  "symbol": "JNJ",
  "as_of": "2026-10-30",
  "pays": 0.8591,
  "raised_last": 0.1409,
  "cut_last": 0.1409,
  "ex_within_30d": 0.9187,
  "growth_10y": 0.9463,
  "yield_over_3": 0.0648
}
PG 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "dividend_flags_v1",
  "symbol": "PG",
  "as_of": "2026-10-30",
  "pays": 0.8591,
  "raised_last": 0.1409,
  "cut_last": 0.1409,
  "ex_within_30d": 0.0537,
  "growth_10y": 0.9463,
  "yield_over_3": 0.2091
}
O 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "dividend_flags_v1",
  "symbol": "O",
  "as_of": "2026-10-30",
  "pays": 0.8591,
  "raised_last": 0.1409,
  "cut_last": 0.1409,
  "ex_within_30d": 0.0537,
  "growth_10y": 0.0537,
  "yield_over_3": 0.9463
}

What it means

Session of 2026-10-30, 4 symbols: Pays a dividend: true for KO, JNJ, PG, O of 4. Raised its last dividend: true for none of 4. Did the stock cut its dividend last time: true for none of 4. Goes ex-dividend within 30 days: true for JNJ of 4. row fired for KO, JNJ, PG, O.

One row per symbol per session, all from the dividend record; clients join it to their own holdings.

Request JSON (KO; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "KO"
  },
  "questions": {
    "pays": {
      "type": "yes_no",
      "ask": "pays_dividend > 0.5"
    },
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "cut": {
      "type": "yes_no",
      "instructions": "Did the stock cut its dividend last time?"
    },
    "ex": {
      "type": "yes_no",
      "ask": "days_to_ex_div <= 30"
    },
    "grower": {
      "type": "yes_no",
      "ask": "years_of_growth >= 10"
    },
    "yield3": {
      "type": "yes_no",
      "ask": "div_yield_ttm > 3"
    }
  },
  "actions": [
    {
      "id": "row",
      "when": "pays >= 0",
      "do": "webhook",
      "connection": "client-feed",
      "body": {
        "dataset": "dividend_flags_v1",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "pays": "{{pays}}",
        "raised_last": "{{raised}}",
        "cut_last": "{{cut}}",
        "ex_within_30d": "{{ex}}",
        "growth_10y": "{{grower}}",
        "yield_over_3": "{{yield3}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (KO, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "pays": {
      "yes_no": 0.8591,
      "rule": "pays_dividend > 0.5",
      "basis": "rule"
    },
    "raised": {
      "yes_no": 0.1409,
      "rule": "raised_last > 0.5",
      "basis": "rule"
    },
    "cut": {
      "yes_no": 0.1409,
      "rule": "cut_last > 0.5",
      "basis": "pattern"
    },
    "ex": {
      "yes_no": 0.2049,
      "rule": "days_to_ex_div <= 30",
      "basis": "rule"
    },
    "grower": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 10",
      "basis": "rule"
    },
    "yield3": {
      "yes_no": 0.0537,
      "rule": "div_yield_ttm > 3",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "KO",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "row",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "client-feed",
      "preview": {
        "body": {
          "dataset": "dividend_flags_v1",
          "symbol": "KO",
          "as_of": "2026-10-30",
          "pays": 0.8591,
          "raised_last": 0.1409,
          "cut_last": 0.1409,
          "ex_within_30d": 0.2049,
          "growth_10y": 0.9463,
          "yield_over_3": 0.0537
        }
      }
    }
  ]
}

cut_last days_to_ex_div div_yield_ttm pays_dividend raised_last years_of_growth

Data vendor / platform · example 3

Candlestick pattern signals as a product on SPY constituents (AAPL)

Sell a pattern-detection feed: every named pattern, evaluated exactly on the latest bar, for each symbol.

ora-fin-0.1.1AAPL8 questions
  1. StateAAPL
  2. Questions8 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"AAPL"} The server fills in the latest completed session.

Questions

engulf_bullruleengulfing_bull()
engulfing bull candle: A green body that engulfs yesterday's red body.
engulf_bearruleengulfing_bear()
engulfing bear candle: A red body that engulfs yesterday's green body.
hammerrulehammer()
hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back.
starruleshooting_star()
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
morningrulemorning_star()
morning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first.
eveningruleevening_star()
evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.
dojiruledoji()
doji candle: Body at most 10% of the day's range.
marubozurulemarubozu()
marubozu candle: Body at least 90% of the range: almost no wicks.

Answers

QuestionAnswerReading
engulf_bull
engulfing bull candle: A green body that engulfs yesterday's red body.
0.2066false
engulf_bear
engulfing bear candle: A red body that engulfs yesterday's green body.
0.1532false
hammer
hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back.
0.1795false
star
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
0.0537false
morning
morning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first.
0.0805false
evening
evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.
0.1612false
doji
doji candle: Body at most 10% of the day's range.
0.3343false
marubozu
marubozu candle: Body at least 90% of the range: almost no wicks.
0.0537false

What it means

For AAPL on the session of 2026-10-30: Not true: engulfing bull candle: A green body that engulfs yesterday's red body.; engulfing bear candle: A red body that engulfs yesterday's green body.; hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back.; shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.; morning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first.; evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.; doji candle: Body at most 10% of the day's range.; marubozu candle: Body at least 90% of the range: almost no wicks..

Pattern answers are exact, so the feed can document each definition once; clients get the same answer the rule engine gives anyone.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "engulf_bull": {
      "type": "yes_no",
      "ask": "engulfing_bull()"
    },
    "engulf_bear": {
      "type": "yes_no",
      "ask": "engulfing_bear()"
    },
    "hammer": {
      "type": "yes_no",
      "ask": "hammer()"
    },
    "star": {
      "type": "yes_no",
      "ask": "shooting_star()"
    },
    "morning": {
      "type": "yes_no",
      "ask": "morning_star()"
    },
    "evening": {
      "type": "yes_no",
      "ask": "evening_star()"
    },
    "doji": {
      "type": "yes_no",
      "ask": "doji()"
    },
    "marubozu": {
      "type": "yes_no",
      "ask": "marubozu()"
    }
  }
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "engulf_bull": {
      "yes_no": 0.2066,
      "rule": "engulfing_bull()",
      "basis": "rule"
    },
    "engulf_bear": {
      "yes_no": 0.1532,
      "rule": "engulfing_bear()",
      "basis": "rule"
    },
    "hammer": {
      "yes_no": 0.1795,
      "rule": "hammer()",
      "basis": "rule"
    },
    "star": {
      "yes_no": 0.0537,
      "rule": "shooting_star()",
      "basis": "rule"
    },
    "morning": {
      "yes_no": 0.0805,
      "rule": "morning_star()",
      "basis": "rule"
    },
    "evening": {
      "yes_no": 0.1612,
      "rule": "evening_star()",
      "basis": "rule"
    },
    "doji": {
      "yes_no": 0.3343,
      "rule": "doji()",
      "basis": "rule"
    },
    "marubozu": {
      "yes_no": 0.0537,
      "rule": "marubozu()",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  }
}

doji engulfing_bear engulfing_bull evening_star hammer marubozu morning_star shooting_star

Data vendor / platform · example 4

A technical snapshot API response for MSFT

Answer a client API call with a compact set of trend, momentum and volatility states for one symbol.

ora-fin-0.1.1MSFT6 questions1 action
  1. StateMSFT
  2. Questions6 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

{"symbol":"MSFT"} The server fills in the latest completed session.

Questions

trendruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
adxruleadx(14) > 25
Trending (ADX above 25)
rsirulersi(C, 14) > 50
RSI above 50
macdrulemacdhist(C) > ref(macdhist(C), -1)
MACD histogram rising
atrruleatr_pct(14) > 3
A typical day moves more than 3%
bbrule(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06
Bollinger bands narrower than 6% of price

Answers

QuestionAnswerReading
trend
Stacked averages: close > 20 EMA > 50 > 200
0.3192false
adx
Trending (ADX above 25)
0.3124false
rsi
RSI above 50
0.4101on the line (false)
macd
MACD histogram rising
0.2073false
atr
A typical day moves more than 3%
0.0563false
bb
Bollinger bands narrower than 6% of price
0.5745on the line (true)

Actions

Rules on the answers decide what to send.

trend >= 0→Webhooksnapshot-cache
What each action would send 1 of 1 fired · dry run, nothing sent
cachewould send (dry run)Webhook → snapshot-cache
{
  "symbol": "MSFT",
  "as_of": "2026-10-30",
  "stacked": 0.3192,
  "adx_over_25": 0.3124,
  "rsi_over_50": 0.4101,
  "macd_hist_rising": 0.2073,
  "atr_over_3pct": 0.0563,
  "bb_squeeze": 0.5745
}

What it means

For MSFT on the session of 2026-10-30: Not true: Stacked averages: close > 20 EMA > 50 > 200; Trending (ADX above 25); MACD histogram rising; A typical day moves more than 3%. On the line: RSI above 50; Bollinger bands narrower than 6% of price. Fired: cache (Webhook → snapshot-cache).

The snapshot is deterministic for a given session; caching it per as_of date is safe.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MSFT"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
    },
    "adx": {
      "type": "yes_no",
      "ask": "adx(14) > 25"
    },
    "rsi": {
      "type": "yes_no",
      "ask": "rsi(C, 14) > 50"
    },
    "macd": {
      "type": "yes_no",
      "ask": "macdhist(C) > ref(macdhist(C), -1)"
    },
    "atr": {
      "type": "yes_no",
      "ask": "atr_pct(14) > 3"
    },
    "bb": {
      "type": "yes_no",
      "ask": "(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06"
    }
  },
  "actions": [
    {
      "id": "cache",
      "when": "trend >= 0",
      "do": "webhook",
      "connection": "snapshot-cache",
      "body": {
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "stacked": "{{trend}}",
        "adx_over_25": "{{adx}}",
        "rsi_over_50": "{{rsi}}",
        "macd_hist_rising": "{{macd}}",
        "atr_over_3pct": "{{atr}}",
        "bb_squeeze": "{{bb}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (MSFT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.3192,
      "rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "adx": {
      "yes_no": 0.3124,
      "rule": "adx(14) > 25",
      "basis": "rule"
    },
    "rsi": {
      "yes_no": 0.4101,
      "rule": "rsi(C, 14) > 50",
      "basis": "rule"
    },
    "macd": {
      "yes_no": 0.2073,
      "rule": "macdhist(C) > ref(macdhist(C), -1)",
      "basis": "rule"
    },
    "atr": {
      "yes_no": 0.0563,
      "rule": "atr_pct(14) > 3",
      "basis": "rule"
    },
    "bb": {
      "yes_no": 0.5745,
      "rule": "(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "MSFT",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "cache",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "snapshot-cache",
      "preview": {
        "body": {
          "symbol": "MSFT",
          "as_of": "2026-10-30",
          "stacked": 0.3192,
          "adx_over_25": 0.3124,
          "rsi_over_50": 0.4101,
          "macd_hist_rising": 0.2073,
          "atr_over_3pct": 0.0563,
          "bb_squeeze": 0.5745
        }
      }
    }
  ]
}

adx atr_pct bblower bbmid bbupper ema macdhist ref rsi sma

Data vendor / platform · example 5

Forecast overlay dataset: odds of moves for index ETFs

Offer clients a separate, clearly labeled forecast dataset next to the exact-signal feed.

ora-fin-0.1.14 symbols, one request each5 questions1 actionworkflow · Mon–Fri at 18:15 ET
  1. ScheduleMon–Fri at 18:15 ET
  2. State4 symbols
  3. Questions5 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

{"symbol":"SPY"} then QQQ, IWM, DIA, one request each. The server fills in the latest completed session.

Questions

up_weekforecastWill the stock be higher in a week?
Higher in a week
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month
vol_upforecastWill volatility be higher over the next month?
Higher volatility next month
bigforecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

Symbolup_weekforecastdrop5forecastrally5forecastvol_upforecastbigforecastFired
SPY0.5980.2030.2290.690.425row
QQQ0.5610.4430.5010.5230.355row
IWM0.5260.2340.2850.5080.342row
DIA0.5670.1570.1860.6840.412row

true false not known for rules; forecasts are odds. Hover a column for its question.

Actions

Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.

up_week >= 0→Webhookclient-feed
SPY 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "forecast_overlay_v1",
  "symbol": "SPY",
  "as_of": "2026-10-30",
  "p_up_week": 0.598,
  "p_drop5_month": 0.203,
  "p_rally5_month": 0.229,
  "p_vol_up_month": 0.69,
  "p_big_move_5d": 0.425
}
QQQ 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "forecast_overlay_v1",
  "symbol": "QQQ",
  "as_of": "2026-10-30",
  "p_up_week": 0.561,
  "p_drop5_month": 0.443,
  "p_rally5_month": 0.501,
  "p_vol_up_month": 0.523,
  "p_big_move_5d": 0.355
}
IWM 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "forecast_overlay_v1",
  "symbol": "IWM",
  "as_of": "2026-10-30",
  "p_up_week": 0.526,
  "p_drop5_month": 0.234,
  "p_rally5_month": 0.285,
  "p_vol_up_month": 0.508,
  "p_big_move_5d": 0.342
}
DIA 1 of 1 fired · dry run, nothing sent
rowwould send (dry run)Webhook → client-feed
{
  "dataset": "forecast_overlay_v1",
  "symbol": "DIA",
  "as_of": "2026-10-30",
  "p_up_week": 0.567,
  "p_drop5_month": 0.157,
  "p_rally5_month": 0.186,
  "p_vol_up_month": 0.684,
  "p_big_move_5d": 0.412
}

What it means

Session of 2026-10-30, 4 symbols: Highest odds for “Higher in a week”: SPY at 60%. row fired for SPY, QQQ, IWM, DIA.

Forecast fields are probabilities and are shipped in their own dataset so no client mistakes them for exact signals.

As a scheduled workflow (Mon–Fri at 18:15 ET)

Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.

{
  "name": "Forecast overlay dataset: odds of moves for index ETFs",
  "symbols": "SPY QQQ IWM DIA",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "18:15",
  "model": "ora-fin-0.1.1",
  "questions": {
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    },
    "vol_up": {
      "type": "yes_no",
      "instructions": "Will volatility be higher over the next month?"
    },
    "big": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "row",
      "when": "up_week >= 0",
      "do": "webhook",
      "connection": "client-feed",
      "body": {
        "dataset": "forecast_overlay_v1",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "p_up_week": "{{up_week}}",
        "p_drop5_month": "{{drop5}}",
        "p_rally5_month": "{{rally5}}",
        "p_vol_up_month": "{{vol_up}}",
        "p_big_move_5d": "{{big}}"
      }
    }
  ]
}
Request JSON (SPY; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    },
    "vol_up": {
      "type": "yes_no",
      "instructions": "Will volatility be higher over the next month?"
    },
    "big": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "row",
      "when": "up_week >= 0",
      "do": "webhook",
      "connection": "client-feed",
      "body": {
        "dataset": "forecast_overlay_v1",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "p_up_week": "{{up_week}}",
        "p_drop5_month": "{{drop5}}",
        "p_rally5_month": "{{rally5}}",
        "p_vol_up_month": "{{vol_up}}",
        "p_big_move_5d": "{{big}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "up_week": {
      "yes_no": 0.598
    },
    "drop5": {
      "yes_no": 0.203
    },
    "rally5": {
      "yes_no": 0.229
    },
    "vol_up": {
      "yes_no": 0.69
    },
    "big": {
      "yes_no": 0.425
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "row",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "client-feed",
      "preview": {
        "body": {
          "dataset": "forecast_overlay_v1",
          "symbol": "SPY",
          "as_of": "2026-10-30",
          "p_up_week": 0.598,
          "p_drop5_month": 0.203,
          "p_rally5_month": 0.229,
          "p_vol_up_month": 0.69,
          "p_big_move_5d": 0.425
        }
      }
    }
  ]
}

Data vendor / platform · example 6

Corporate-action alerts for split adjustments

Tell downstream clients when a symbol split recently or has one announced, so they re-adjust history.

ora-fin-0.1.13 symbols, one request each4 questions1 action
  1. State3 symbols
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

{"symbol":"NVDA"} then WMT, AAPL, one request each. The server fills in the latest completed session.

Questions

recentruledays_since_split <= 30
split in the last 30 days
announcedruledays_to_split <= 365
A split is announced
ratioEnglish → ruleWas the last split at least 2-for-1?
reverserulereverse_split_last > 0.5
Last split was a reverse split

Answers

SymbolrecentruleannouncedruleratiorulereverseruleFired
NVDA0.05370.05370.94630.1409none
WMT0.05370.05370.93170.1409none
AAPL0.05370.05370.94630.1409none

true false not known for rules; forecasts are odds. Hover a column for its question.

Actions

Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.

recent >= 0.6 or announced >= 0.6→Emailclient-ops
NVDA 0 of 1 fired · dry run, nothing sent
WMT 0 of 1 fired · dry run, nothing sent
AAPL 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 3 symbols: split in the last 30 days: true for none of 3. A split is announced: true for none of 3. Was the last split at least 2-for-1: true for NVDA, WMT, AAPL of 3. Last split was a reverse split: true for none of 3. adjust fired for none.

The notice only goes out when a split is recent or announced, and it says which; quiet symbols need no action.

Request JSON (NVDA; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "recent": {
      "type": "yes_no",
      "ask": "days_since_split <= 30"
    },
    "announced": {
      "type": "yes_no",
      "ask": "days_to_split <= 365"
    },
    "ratio": {
      "type": "yes_no",
      "instructions": "Was the last split at least 2-for-1?"
    },
    "reverse": {
      "type": "yes_no",
      "ask": "reverse_split_last > 0.5"
    }
  },
  "actions": [
    {
      "id": "adjust",
      "when": "recent >= 0.6 or announced >= 0.6",
      "do": "email",
      "connection": "client-ops",
      "subject": "Split adjustment notice: {{symbol}}",
      "message": "{{symbol}} ({{as_of}}): split in the last 30 days {{recent|pct}}, split announced {{announced|pct}}. Re-adjust stored history."
    }
  ],
  "dry_run": true
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "recent": {
      "yes_no": 0.0537,
      "rule": "days_since_split <= 30",
      "basis": "rule"
    },
    "announced": {
      "yes_no": 0.0537,
      "rule": "days_to_split <= 365",
      "basis": "rule"
    },
    "ratio": {
      "yes_no": 0.9463,
      "rule": "last_split_ratio >= 2",
      "basis": "pattern"
    },
    "reverse": {
      "yes_no": 0.1409,
      "rule": "reverse_split_last > 0.5",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "adjust",
      "fired": false,
      "status": "skipped"
    }
  ]
}

days_since_split days_to_split last_split_ratio reverse_split_last

Data vendor / platform · example 7

Market regime labels: trend and volatility for SPY

Publish a daily regime label (trend up or down, volatility calm or high) that clients use to condition their models.

ora-fin-0.1.1SPY5 questions1 action
  1. StateSPY
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

{"symbol":"SPY"} The server fills in the latest completed session.

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
sma_uprulesma(C, 200) > ref(sma(C, 200), -20)
The 200-day average is rising
vol_highEnglish → ruleIs 20-day historical volatility above 25%?
vol5English → ruleIs 5-day volatility higher than 20-day volatility?
vol_nextforecastWill volatility be higher over the next month?
Higher volatility next month

Answers

QuestionAnswerReading
trend
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.9451true
sma_up
The 200-day average is rising
0.9463true
vol_high
Is 20-day historical volatility above 25%
compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.25
0.0537false
vol5
Is 5-day volatility higher than 20-day volatility
compiled to std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19)
0.8872true
vol_next
Higher volatility next month
0.6969% · likely

Actions

Rules on the answers decide what to send.

trend >= 0→Webhookclient-feed
What each action would send 1 of 1 fired · dry run, nothing sent
labelwould send (dry run)Webhook → client-feed
{
  "dataset": "regime_labels_v1",
  "symbol": "SPY",
  "as_of": "2026-10-30",
  "trend_up": 0.9451,
  "sma200_rising": 0.9463,
  "vol_high": 0.0537,
  "vol_expanding": 0.8872,
  "p_vol_up_month": 0.69
}

What it means

For SPY on the session of 2026-10-30: True now: Is the stock above its 200-day moving average; The 200-day average is rising; Is 5-day volatility higher than 20-day volatility. Not true: Is 20-day historical volatility above 25%. Forecasts: Higher volatility next month 69%. Fired: label (Webhook → client-feed).

Clients map the probabilities to labels with their own cutoffs; the vendor ships the raw values so nothing is lost.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "sma_up": {
      "type": "yes_no",
      "ask": "sma(C, 200) > ref(sma(C, 200), -20)"
    },
    "vol_high": {
      "type": "yes_no",
      "instructions": "Is 20-day historical volatility above 25%?"
    },
    "vol5": {
      "type": "yes_no",
      "instructions": "Is 5-day volatility higher than 20-day volatility?"
    },
    "vol_next": {
      "type": "yes_no",
      "instructions": "Will volatility be higher over the next month?"
    }
  },
  "actions": [
    {
      "id": "label",
      "when": "trend >= 0",
      "do": "webhook",
      "connection": "client-feed",
      "body": {
        "dataset": "regime_labels_v1",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "trend_up": "{{trend}}",
        "sma200_rising": "{{sma_up}}",
        "vol_high": "{{vol_high}}",
        "vol_expanding": "{{vol5}}",
        "p_vol_up_month": "{{vol_next}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.9451,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "sma_up": {
      "yes_no": 0.9463,
      "rule": "sma(C, 200) > ref(sma(C, 200), -20)",
      "basis": "rule"
    },
    "vol_high": {
      "yes_no": 0.0537,
      "rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.25",
      "basis": "pattern"
    },
    "vol5": {
      "yes_no": 0.8872,
      "rule": "std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19)",
      "basis": "pattern"
    },
    "vol_next": {
      "yes_no": 0.69
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "label",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "client-feed",
      "preview": {
        "body": {
          "dataset": "regime_labels_v1",
          "symbol": "SPY",
          "as_of": "2026-10-30",
          "trend_up": 0.9451,
          "sma200_rising": 0.9463,
          "vol_high": 0.0537,
          "vol_expanding": 0.8872,
          "p_vol_up_month": 0.69
        }
      }
    }
  ]
}

log offset ref sma sqrt std

Data vendor / platform · example 8

Sector breadth proxy across four sector ETFs

Build a breadth number for clients: how many sectors are above their 50-day average today.

ora-fin-0.1.14 symbols, one request each3 questions
  1. State4 symbols
  2. Questions3 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"XLK"} then XLF, XLE, XLV, one request each. The server fills in the latest completed session.

Questions

above50ruleC > sma(C, 50)
Above the 50-day average
above200English → ruleIs the stock above its 200-day moving average?
momentumruleC > C[-63]
Higher than three months ago

Answers

Symbolabove50ruleabove200rulemomentumrule
XLK0.07760.920.6105
XLF0.66920.9190.3514
XLE0.94320.94630.9463
XLV0.94470.94630.9463

true false not known for rules; forecasts are odds. Hover a column for its question.

What it means

Session of 2026-10-30, 4 symbols: Above the 50-day average: true for XLF, XLE, XLV of 4. Is the stock above its 200-day moving average: true for XLK, XLF, XLE, XLV of 4. Higher than three months ago: true for XLK, XLE, XLV of 4.

Counting true answers across sectors gives breadth; the vendor publishes the count and the per-sector answers behind it.

Request JSON (XLK; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLK"
  },
  "questions": {
    "above50": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "above200": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "momentum": {
      "type": "yes_no",
      "ask": "C > C[-63]"
    }
  }
}
Response JSON (XLK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "above50": {
      "yes_no": 0.0776,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "above200": {
      "yes_no": 0.92,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "momentum": {
      "yes_no": 0.6105,
      "rule": "C > C[-63]",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "XLK",
    "as_of": "2026-10-30"
  }
}

offset sma

Data vendor / platform · example 9

Unusual volume feed for large caps

Ship a list of symbols with unusual volume today, with the direction of the day.

ora-fin-0.1.13 symbols, one request each5 questions1 action
  1. State3 symbols
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

{"symbol":"AAPL"} then TSLA, AMD, one request each. The server fills in the latest completed session.

Questions

spikeruleV > 2 * ref(avg(V, 20), -1)
Volume more than twice the previous 20-day average
rankrulepercentrank(V, 50) > 90
Volume in the top tenth of 50 sessions
up_volruleC > C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Up on heavy volume
down_volruleC < C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Down on heavy volume
medianruleV > 2 * median(V, 20)
volume over twice its 20-day median

Answers

Symbolspikerulerankruleup_volruledown_volrulemedianruleFired
AAPL0.24730.62320.1270.78410.2151none
TSLA0.05890.2190.13090.13090.0586none
AMD0.53940.65460.05370.8820.6441unusual

true false not known for rules; forecasts are odds. Hover a column for its question.

Actions

Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.

spike >= 0.6 or median >= 0.6→Webhookclient-feed
AAPL 0 of 1 fired · dry run, nothing sent
TSLA 0 of 1 fired · dry run, nothing sent
AMD 1 of 1 fired · dry run, nothing sent
unusualwould send (dry run)Webhook → client-feed
{
  "dataset": "unusual_volume_v1",
  "symbol": "AMD",
  "as_of": "2026-10-30",
  "spike_vs_mean": 0.5394,
  "spike_vs_median": 0.6441,
  "up_on_volume": 0.0537,
  "down_on_volume": 0.882
}

What it means

Session of 2026-10-30, 3 symbols: Volume more than twice the previous 20-day average: true for none of 3. Volume in the top tenth of 50 sessions: true for AAPL, AMD of 3. Up on heavy volume: true for none of 3. Down on heavy volume: true for AAPL, AMD of 3. unusual fired for AMD.

Only symbols with a true spike rule are delivered; using both mean and median avoids one outlier day hiding the next.

Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "spike": {
      "type": "yes_no",
      "ask": "V > 2 * ref(avg(V, 20), -1)"
    },
    "rank": {
      "type": "yes_no",
      "ask": "percentrank(V, 50) > 90"
    },
    "up_vol": {
      "type": "yes_no",
      "ask": "C > C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "down_vol": {
      "type": "yes_no",
      "ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "median": {
      "type": "yes_no",
      "ask": "V > 2 * median(V, 20)"
    }
  },
  "actions": [
    {
      "id": "unusual",
      "when": "spike >= 0.6 or median >= 0.6",
      "do": "webhook",
      "connection": "client-feed",
      "body": {
        "dataset": "unusual_volume_v1",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "spike_vs_mean": "{{spike}}",
        "spike_vs_median": "{{median}}",
        "up_on_volume": "{{up_vol}}",
        "down_on_volume": "{{down_vol}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "spike": {
      "yes_no": 0.2473,
      "rule": "V > 2 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "rank": {
      "yes_no": 0.6232,
      "rule": "percentrank(V, 50) > 90",
      "basis": "rule"
    },
    "up_vol": {
      "yes_no": 0.127,
      "rule": "C > C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "down_vol": {
      "yes_no": 0.7841,
      "rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "median": {
      "yes_no": 0.2151,
      "rule": "V > 2 * median(V, 20)",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "unusual",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg median offset percentrank ref

Data vendor / platform · example 10

Support and resistance proximity flags for TSLA

Deliver whether price sits near its last swing high or low, computed from confirmed pivots only.

ora-fin-0.1.1TSLA5 questions
  1. StateTSLA
  2. Questions5 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"TSLA"} The server fills in the latest completed session.

Questions

near_resruleC <= swinghigh(5) and C >= 0.97 * swinghigh(5)
Within 3% under the last swing high
near_supruleC >= swinglow(5) and C <= 1.03 * swinglow(5)
Within 3% above the last swing low
break_resruleC > swinghigh(5) and C[-1] <= ref(swinghigh(5), -1)
Closed above the last swing high today
hh_hlrule(swinghigh(3) > swinghigh(3, 2)) and (swinglow(3) > swinglow(3, 2))
Higher swing highs and higher swing lows
lower_shruleswinghigh(3, 1) < swinghigh(3, 2)
latest swing high lower than the one before

Answers

QuestionAnswerReading
near_res
Within 3% under the last swing high
0.3262false
near_sup
Within 3% above the last swing low
0.0751false
break_res
Closed above the last swing high today
0.2918false
hh_hl
Higher swing highs and higher swing lows
0.5414on the line (true)
lower_sh
latest swing high lower than the one before
0.4586on the line (false)

What it means

For TSLA on the session of 2026-10-30: Not true: Within 3% under the last swing high; Within 3% above the last swing low; Closed above the last swing high today. On the line: Higher swing highs and higher swing lows; latest swing high lower than the one before.

Pivots are confirmed bars later, so the feed never contains a level that only hindsight could see.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "TSLA"
  },
  "questions": {
    "near_res": {
      "type": "yes_no",
      "ask": "C <= swinghigh(5) and C >= 0.97 * swinghigh(5)"
    },
    "near_sup": {
      "type": "yes_no",
      "ask": "C >= swinglow(5) and C <= 1.03 * swinglow(5)"
    },
    "break_res": {
      "type": "yes_no",
      "ask": "C > swinghigh(5) and C[-1] <= ref(swinghigh(5), -1)"
    },
    "hh_hl": {
      "type": "yes_no",
      "ask": "(swinghigh(3) > swinghigh(3, 2)) and (swinglow(3) > swinglow(3, 2))"
    },
    "lower_sh": {
      "type": "yes_no",
      "ask": "swinghigh(3, 1) < swinghigh(3, 2)"
    }
  }
}
Response JSON (TSLA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "near_res": {
      "yes_no": 0.3262,
      "rule": "C <= swinghigh(5) and C >= 0.97 * swinghigh(5)",
      "basis": "rule"
    },
    "near_sup": {
      "yes_no": 0.0751,
      "rule": "C >= swinglow(5) and C <= 1.03 * swinglow(5)",
      "basis": "rule"
    },
    "break_res": {
      "yes_no": 0.2918,
      "rule": "C > swinghigh(5) and C[-1] <= ref(swinghigh(5), -1)",
      "basis": "rule"
    },
    "hh_hl": {
      "yes_no": 0.5414,
      "rule": "(swinghigh(3) > swinghigh(3, 2)) and (swinglow(3) > swinglow(3, 2))",
      "basis": "rule"
    },
    "lower_sh": {
      "yes_no": 0.4586,
      "rule": "swinghigh(3, 1) < swinghigh(3, 2)",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "TSLA",
    "as_of": "2026-10-30"
  }
}

offset ref swinghigh swinglow

Information, not investment advice. Rules answer from the latest completed daily session; forecasts are probabilities. Actions ran as dry runs: nothing was sent. More in Builders: Quant developer, Fintech app builder, Robo-advisor, Broker app, Algo / bot developer, Trading educator / newsletter.

Create an account Open the Playground Everything here also lives in the console, next to your keys and usage.