Use cases · Corporates
Financial journalist / media: 20 ways to use Ora
Fact-checked market color: what is true today, in plain words, with the rule behind it. Each example is a complete, runnable request with the real answers it returned (43 requests, captured 2026-10-31), what they mean and, where it fits, the action it would send.
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 (51)
offset 11ref 7abs 5sma 5max 4avg 4beat_eps_last 3beat_revenue_last 3atr 3highest 2last_earnings_move 2years_of_growth 2highestbars 1beat_streak 1eps_growth_yoy 1eps_surprise_pct 1min 1zscore 1days_since_earnings 1last_earnings_gap 1pre_earnings_close 1cut_last 1days_since_ex_div 1div_change_pct 1pays_dividend 1days_since_split 1days_to_split 1last_split_ratio 1reverse_split_last 1dragonfly_doji 1engulfing_bear 1evening_star 1gap_up 1outside_bar 1roc 1adx 1days_to_earnings 1next_report_amc 1log 1sqrt 1std 1hlc3 1obv 1sum 1three_white_soldiers 1lowest 1rsi 1div_yield_ttm 1raised_last 1bbupper 1ema 1
Examples 1–10 of 20 · page 1 of 2
Financial journalist / media · example 1
Fact check: did NVDA hit a 52-week high today?
Before a headline says "record high", a reporter checks the exact claim: a new intraday 52-week high, a closing high, or just near it.
- StateNVDA
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
intraday | English → rule | Did the stock make a new 52-week high today? |
closing | English → rule | Did the stock make a new 52-week closing high? |
near | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
within5 | English → rule | Is the stock within 5% of its 52-week high? |
recent | rule | highestbars(H, 20) <= 3Set its 20-day high in the last four sessions |
Answers
| Question | Answer | Reading |
|---|---|---|
intradayDid the stock make a new 52-week high today compiled to H > highest(H, 252) | 0.0537 | false |
closingDid the stock make a new 52-week closing high compiled to C > highest(C, 252) | 0.0537 | false |
nearWithin 2% of the 52-week high | 0.0537 | false |
within5Is the stock within 5% of its 52-week high compiled to abs(C / max(H, 252) - 1) <= 0.05 | 0.0537 | false |
recentSet its 20-day high in the last four sessions | 0.0566 | false |
Actions
Rules on the answers decide what to send.
intraday >= 0.6 or closing >= 0.6→Slackmarkets-deskelse→Slackmarkets-desk{
"text": "NVDA (2026-10-30): no new 52-week high (intraday 5%). Use \"near its high\" only if within 5% (5%)."
}What it means
For NVDA on the session of 2026-10-30: Not true: Did the stock make a new 52-week high today; Did the stock make a new 52-week closing high; Within 2% of the 52-week high; Is the stock within 5% of its 52-week high; Set its 20-day high in the last four sessions. Fired: soften (Slack → markets-desk).
Each wording is a different rule; the reporter uses the sentence whose rule came back true and cites it.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"intraday": {
"type": "yes_no",
"instructions": "Did the stock make a new 52-week high today?"
},
"closing": {
"type": "yes_no",
"instructions": "Did the stock make a new 52-week closing high?"
},
"near": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
},
"within5": {
"type": "yes_no",
"instructions": "Is the stock within 5% of its 52-week high?"
},
"recent": {
"type": "yes_no",
"ask": "highestbars(H, 20) <= 3"
}
},
"actions": [
{
"id": "headline_ok",
"when": "intraday >= 0.6 or closing >= 0.6",
"do": "slack",
"connection": "markets-desk",
"message": "{{symbol}} ({{as_of}}): 52-week high confirmed (intraday {{intraday|pct}}, closing {{closing|pct}}). OK to headline."
},
{
"id": "soften",
"when": "else",
"do": "slack",
"connection": "markets-desk",
"message": "{{symbol}} ({{as_of}}): no new 52-week high (intraday {{intraday|pct}}). Use \"near its high\" only if within 5% ({{within5|pct}})."
}
],
"dry_run": true
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"intraday": {
"yes_no": 0.0537,
"rule": "H > highest(H, 252)",
"basis": "pattern"
},
"closing": {
"yes_no": 0.0537,
"rule": "C > highest(C, 252)",
"basis": "pattern"
},
"near": {
"yes_no": 0.0537,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"within5": {
"yes_no": 0.0537,
"rule": "abs(C / max(H, 252) - 1) <= 0.05",
"basis": "comparison"
},
"recent": {
"yes_no": 0.0566,
"rule": "highestbars(H, 20) <= 3",
"basis": "rule"
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "headline_ok",
"fired": false,
"status": "skipped"
},
{
"id": "soften",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "markets-desk",
"preview": {
"text": "NVDA (2026-10-30): no new 52-week high (intraday 5%). Use \"near its high\" only if within 5% (5%)."
}
}
]
}Financial journalist / media · example 2
Fact check: did NFLX beat on both EPS and revenue?
Verify the beat before writing "topped expectations", and check the size of the surprise.
- StateNFLX
- Questions6 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"NFLX"} The server fills in the latest completed session.
Questions
beat_eps | English → rule | Did the stock beat EPS estimates last quarter? |
beat_rev | English → rule | Did revenue beat estimates last quarter? |
both | English → rule | Did the stock beat on both EPS and revenue last quarter? |
surprise | English → rule | Did EPS beat estimates by more than 5% last quarter? |
streak | English → rule | Has the stock beaten EPS estimates 4 quarters in a row? |
growth | English → rule | Did EPS grow more than 10% year over year? |
Answers
| Question | Answer | Reading |
|---|---|---|
beat_epsDid the stock beat EPS estimates last quarter compiled to beat_eps_last > 0.5 | 0.8591 | true |
beat_revDid revenue beat estimates last quarter compiled to beat_revenue_last > 0.5 | 0.8591 | true |
bothDid the stock beat on both EPS and revenue last quarter compiled to beat_eps_last > 0.5 and beat_revenue_last > 0.5 | 0.8591 | true |
surpriseDid EPS beat estimates by more than 5% last quarter compiled to eps_surprise_pct > 5 | 0.6333 | true |
streakHas the stock beaten EPS estimates 4 quarters in a row compiled to beat_streak >= 4 | 0.55 | on the line (true) |
growthDid EPS grow more than 10% year over year compiled to eps_growth_yoy > 10 | 0.9463 | true |
Actions
Rules on the answers decide what to send.
beat_eps >= 0→Webhooknewsroom-cms{
"type": "fact_check",
"ticker": "NFLX",
"as_of": "2026-10-30",
"claims": {
"beat_eps": 0.8591,
"beat_revenue": 0.8591,
"beat_both": 0.8591,
"surprise_over_5pct": 0.6333
}
}What it means
For NFLX on the session of 2026-10-30: True now: Did the stock beat EPS estimates last quarter; Did revenue beat estimates last quarter; Did the stock beat on both EPS and revenue last quarter; Did EPS beat estimates by more than 5% last quarter; Did EPS grow more than 10% year over year. On the line: Has the stock beaten EPS estimates 4 quarters in a row. Fired: cms_facts (Webhook → newsroom-cms).
"Beat on both lines" needs both rules true; the surprise and streak rules support a second sentence if they hold.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NFLX"
},
"questions": {
"beat_eps": {
"type": "yes_no",
"instructions": "Did the stock beat EPS estimates last quarter?"
},
"beat_rev": {
"type": "yes_no",
"instructions": "Did revenue beat estimates last quarter?"
},
"both": {
"type": "yes_no",
"instructions": "Did the stock beat on both EPS and revenue last quarter?"
},
"surprise": {
"type": "yes_no",
"instructions": "Did EPS beat estimates by more than 5% last quarter?"
},
"streak": {
"type": "yes_no",
"instructions": "Has the stock beaten EPS estimates 4 quarters in a row?"
},
"growth": {
"type": "yes_no",
"instructions": "Did EPS grow more than 10% year over year?"
}
},
"actions": [
{
"id": "cms_facts",
"when": "beat_eps >= 0",
"do": "webhook",
"connection": "newsroom-cms",
"body": {
"type": "fact_check",
"ticker": "{{symbol}}",
"as_of": "{{as_of}}",
"claims": {
"beat_eps": "{{beat_eps}}",
"beat_revenue": "{{beat_rev}}",
"beat_both": "{{both}}",
"surprise_over_5pct": "{{surprise}}"
}
}
}
],
"dry_run": true
}Response JSON (NFLX, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"beat_eps": {
"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"
},
"both": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "pattern"
},
"surprise": {
"yes_no": 0.6333,
"rule": "eps_surprise_pct > 5",
"basis": "pattern"
},
"streak": {
"yes_no": 0.55,
"rule": "beat_streak >= 4",
"basis": "pattern"
},
"growth": {
"yes_no": 0.9463,
"rule": "eps_growth_yoy > 10",
"basis": "pattern"
}
},
"context": {
"symbol": "NFLX",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "cms_facts",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "newsroom-cms",
"preview": {
"body": {
"type": "fact_check",
"ticker": "NFLX",
"as_of": "2026-10-30",
"claims": {
"beat_eps": 0.8591,
"beat_revenue": 0.8591,
"beat_both": 0.8591,
"surprise_over_5pct": 0.6333
}
}
}
}
]
}beat_eps_last beat_revenue_last beat_streak eps_growth_yoy eps_surprise_pct
Financial journalist / media · example 3
Close color: how did the major indexes finish?
For the market-close story, the same checks on the S&P 500, Nasdaq 100, Dow and Russell 2000 ETFs.
- State4 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} then QQQ, DIA, IWM, one request each. The server fills in the latest completed session.
Questions
up | English → rule | Did the stock close higher than yesterday? |
big_up | English → rule | Did the stock rise more than 2% today? |
big_down | English → rule | Did the stock fall more than 3% today? |
above200 | English → rule | Is the stock above its 200-day moving average? |
trend_day | rule | (O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))A trend day up: opened near the low, closed near the high |
Answers
| Symbol | uprule | big_uprule | big_downrule | above200rule | trend_dayrule |
|---|---|---|---|---|---|
SPY | 0.0552 | 0.0537 | 0.0709 | 0.9451 | 0.0537 |
QQQ | 0.0537 | 0.0537 | 0.7217 | 0.7987 | 0.0537 |
DIA | 0.0784 | 0.0537 | 0.0537 | 0.8778 | 0.0537 |
IWM | 0.0707 | 0.0537 | 0.0854 | 0.5564 | 0.0537 |
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: Did the stock close higher than yesterday: true for none of 4. Did the stock rise more than 2% today: true for none of 4. Did the stock fall more than 3% today: true for QQQ of 4. Is the stock above its 200-day moving average: true for SPY, QQQ, DIA of 4.
The story only says "rallied" or "slid" where the rule backs it; every index gets the same test.
Request JSON (SPY; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"up": {
"type": "yes_no",
"instructions": "Did the stock close higher than yesterday?"
},
"big_up": {
"type": "yes_no",
"instructions": "Did the stock rise more than 2% today?"
},
"big_down": {
"type": "yes_no",
"instructions": "Did the stock fall more than 3% today?"
},
"above200": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"trend_day": {
"type": "yes_no",
"ask": "(O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"up": {
"yes_no": 0.0552,
"rule": "C > C[-1]",
"basis": "comparison"
},
"big_up": {
"yes_no": 0.0537,
"rule": "C / C[-1] - 1 > 0.02",
"basis": "pattern"
},
"big_down": {
"yes_no": 0.0709,
"rule": "C / C[-1] - 1 < -0.03",
"basis": "pattern"
},
"above200": {
"yes_no": 0.9451,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"trend_day": {
"yes_no": 0.0537,
"rule": "(O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))",
"basis": "rule"
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}Financial journalist / media · example 4
Fact check: was this TSLA's worst day in a month?
"Worst day since…" claims are easy to get wrong; check the exact window.
- StateTSLA
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TSLA"} The server fills in the latest completed session.
Questions
worst20 | English → rule | Was today the worst day of the last 20 sessions? |
down3 | English → rule | Did the stock fall more than 3% today? |
big_atr | rule | abs(C - C[-1]) > 1.5 * atr(14)Today's move was bigger than 1.5 ATR |
shock | rule | zscore(C / C[-1] - 1, 20) < -2A two-sigma down day |
vol | English → rule | Was today's volume twice its 20-day average? |
Answers
| Question | Answer | Reading |
|---|---|---|
worst20Was today the worst day of the last 20 sessions compiled to (C < C[-1]) and (C / C[-1] - 1 < ref(min(C / C[-1] - 1, 19), -1)) | 0.2631 | false |
down3Did the stock fall more than 3% today compiled to C / C[-1] - 1 < -0.03 | 0.1674 | false |
big_atrToday's move was bigger than 1.5 ATR | 0.054 | false |
shockA two-sigma down day | 0.0945 | false |
volWas today's volume twice its 20-day average compiled to V > 2 * ref(avg(V, 20), -1) | 0.0589 | false |
What it means
For TSLA on the session of 2026-10-30: Not true: Was today the worst day of the last 20 sessions; Did the stock fall more than 3% today; Today's move was bigger than 1.5 ATR; A two-sigma down day; Was today's volume twice its 20-day average.
If the worst-day rule is false, the headline uses a softer verb; heavy volume and a return shock support "sharp" language.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TSLA"
},
"questions": {
"worst20": {
"type": "yes_no",
"instructions": "Was today the worst day of the last 20 sessions?"
},
"down3": {
"type": "yes_no",
"instructions": "Did the stock fall more than 3% today?"
},
"big_atr": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"shock": {
"type": "yes_no",
"ask": "zscore(C / C[-1] - 1, 20) < -2"
},
"vol": {
"type": "yes_no",
"instructions": "Was today's volume twice its 20-day average?"
}
}
}Response JSON (TSLA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"worst20": {
"yes_no": 0.2631,
"rule": "(C < C[-1]) and (C / C[-1] - 1 < ref(min(C / C[-1] - 1, 19), -1))",
"basis": "pattern"
},
"down3": {
"yes_no": 0.1674,
"rule": "C / C[-1] - 1 < -0.03",
"basis": "pattern"
},
"big_atr": {
"yes_no": 0.054,
"rule": "abs(C - C[-1]) > 1.5 * atr(14)",
"basis": "rule"
},
"shock": {
"yes_no": 0.0945,
"rule": "zscore(C / C[-1] - 1, 20) < -2",
"basis": "rule"
},
"vol": {
"yes_no": 0.0589,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "pattern"
}
},
"context": {
"symbol": "TSLA",
"as_of": "2026-10-30"
}
}Financial journalist / media · example 5
Newsroom automation: draft an earnings brief in the CMS
After a company reports, push the verified facts to the CMS as a draft so an editor writes the story from checked numbers.
- StateJPM
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"JPM"} The server fills in the latest completed session.
Questions
recent | English → rule | Did the stock report earnings in the last 7 days? |
beat_eps | English → rule | Did the stock beat EPS estimates last quarter? |
beat_rev | English → rule | Did revenue beat estimates last quarter? |
gap | English → rule | Did the stock gap up after its last earnings? |
fell | English → rule | Did the stock fall after its last earnings report? |
above_pre | English → rule | Is the stock trading above its pre-earnings price? |
Answers
| Question | Answer | Reading |
|---|---|---|
recentDid the stock report earnings in the last 7 days compiled to days_since_earnings <= 7 | 0.0537 | false |
beat_epsDid the stock beat EPS estimates last quarter compiled to beat_eps_last > 0.5 | 0.1409 | false |
beat_revDid revenue beat estimates last quarter compiled to beat_revenue_last > 0.5 | 0.1409 | false |
gapDid the stock gap up after its last earnings compiled to last_earnings_gap > 0 | 0.9463 | true |
fellDid the stock fall after its last earnings report compiled to last_earnings_move < 0 | 0.9463 | true |
above_preIs the stock trading above its pre-earnings price compiled to C > pre_earnings_close | 0.6505 | true |
Actions
Rules on the answers decide what to send.
recent >= 0.6→Webhooknewsroom-cmselse→Slackmarkets-desk{
"text": "JPM (2026-10-30): no report in the last 7 days (5%); no draft created."
}What it means
For JPM on the session of 2026-10-30: True now: Did the stock gap up after its last earnings; Did the stock fall after its last earnings report; Is the stock trading above its pre-earnings price. Not true: Did the stock report earnings in the last 7 days; Did the stock beat EPS estimates last quarter; Did revenue beat estimates last quarter. Fired: no_report (Slack → markets-desk).
Only a recent report creates a draft; the facts arrive as probabilities near one or zero, which the editor turns into words.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JPM"
},
"questions": {
"recent": {
"type": "yes_no",
"instructions": "Did the stock report earnings in the last 7 days?"
},
"beat_eps": {
"type": "yes_no",
"instructions": "Did the stock beat EPS estimates last quarter?"
},
"beat_rev": {
"type": "yes_no",
"instructions": "Did revenue beat estimates last quarter?"
},
"gap": {
"type": "yes_no",
"instructions": "Did the stock gap up after its last earnings?"
},
"fell": {
"type": "yes_no",
"instructions": "Did the stock fall after its last earnings report?"
},
"above_pre": {
"type": "yes_no",
"instructions": "Is the stock trading above its pre-earnings price?"
}
},
"actions": [
{
"id": "cms_draft",
"when": "recent >= 0.6",
"do": "webhook",
"connection": "newsroom-cms",
"body": {
"type": "draft",
"desk": "markets",
"ticker": "{{symbol}}",
"as_of": "{{as_of}}",
"facts": {
"beat_eps": "{{beat_eps}}",
"beat_revenue": "{{beat_rev}}",
"gapped_up": "{{gap}}",
"fell_after": "{{fell}}",
"above_pre_report": "{{above_pre}}"
},
"status": "needs_editor"
}
},
{
"id": "no_report",
"when": "else",
"do": "slack",
"connection": "markets-desk",
"message": "{{symbol}} ({{as_of}}): no report in the last 7 days ({{recent|pct}}); no draft created."
}
],
"dry_run": true
}Response JSON (JPM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"recent": {
"yes_no": 0.0537,
"rule": "days_since_earnings <= 7",
"basis": "pattern"
},
"beat_eps": {
"yes_no": 0.1409,
"rule": "beat_eps_last > 0.5",
"basis": "pattern"
},
"beat_rev": {
"yes_no": 0.1409,
"rule": "beat_revenue_last > 0.5",
"basis": "pattern"
},
"gap": {
"yes_no": 0.9463,
"rule": "last_earnings_gap > 0",
"basis": "pattern"
},
"fell": {
"yes_no": 0.9463,
"rule": "last_earnings_move < 0",
"basis": "pattern"
},
"above_pre": {
"yes_no": 0.6505,
"rule": "C > pre_earnings_close",
"basis": "pattern"
}
},
"context": {
"symbol": "JPM",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "cms_draft",
"fired": false,
"status": "skipped"
},
{
"id": "no_report",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "markets-desk",
"preview": {
"text": "JPM (2026-10-30): no report in the last 7 days (5%); no draft created."
}
}
]
}beat_eps_last beat_revenue_last days_since_earnings last_earnings_gap last_earnings_move pre_earnings_close
Financial journalist / media · example 6
Fact check: which stocks are in a bear market?
"In bear-market territory" means more than 20% below the 52-week high; check each name before listing it.
- State5 symbols
- Questions3 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"INTC"} then NKE, BA, PFE, TGT, one request each. The server fills in the latest completed session.
Questions
bear | English → rule | Is the stock in bear-market territory, more than 20% below its 52-week high? |
below200 | English → rule | Is the stock below its 200-day moving average? |
down3m | rule | C / C[-63] - 1 < -0.1Down more than 10% over three months |
Answers
| Symbol | bearrule | below200rule | down3mrule | Fired |
|---|---|---|---|---|
INTC | 0.9463 | 0.9139 | 0.9235 | list_it |
NKE | 0.9463 | 0.9463 | 0.3277 | list_it |
BA | 0.9296 | 0.9446 | 0.9417 | list_it |
PFE | 0.0537 | 0.0537 | 0.0537 | none |
TGT | 0.0537 | 0.0596 | 0.0848 | none |
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.
bear >= 0.6→Emailmarkets-editor{
"subject": "Bear-market list: INTC qualifies",
"text": "INTC (2026-10-30): more than 20% below its 52-week high (95%). Below 200-day 91%."
}{
"subject": "Bear-market list: NKE qualifies",
"text": "NKE (2026-10-30): more than 20% below its 52-week high (95%). Below 200-day 95%."
}{
"subject": "Bear-market list: BA qualifies",
"text": "BA (2026-10-30): more than 20% below its 52-week high (93%). Below 200-day 94%."
}What it means
Session of 2026-10-30, 5 symbols: Is the stock in bear-market territory, more than 20% below its 52-week high: true for INTC, NKE, BA of 5. Is the stock below its 200-day moving average: true for INTC, NKE, BA of 5. Down more than 10% over three months: true for INTC, BA of 5. list_it fired for INTC, NKE, BA.
Only names with the bear rule true make the list; the 200-day and three-month checks support context sentences.
Request JSON (INTC; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "INTC"
},
"questions": {
"bear": {
"type": "yes_no",
"instructions": "Is the stock in bear-market territory, more than 20% below its 52-week high?"
},
"below200": {
"type": "yes_no",
"instructions": "Is the stock below its 200-day moving average?"
},
"down3m": {
"type": "yes_no",
"ask": "C / C[-63] - 1 < -0.1"
}
},
"actions": [
{
"id": "list_it",
"when": "bear >= 0.6",
"do": "email",
"connection": "markets-editor",
"subject": "Bear-market list: {{symbol}} qualifies",
"message": "{{symbol}} ({{as_of}}): more than 20% below its 52-week high ({{bear|pct}}). Below 200-day {{below200|pct}}."
}
],
"dry_run": true
}Response JSON (INTC, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"bear": {
"yes_no": 0.9463,
"rule": "C < 0.8 * max(H, 252)",
"basis": "pattern"
},
"below200": {
"yes_no": 0.9139,
"rule": "C < sma(C, 200)",
"basis": "comparison"
},
"down3m": {
"yes_no": 0.9235,
"rule": "C / C[-63] - 1 < -0.1",
"basis": "rule"
}
},
"context": {
"symbol": "INTC",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "list_it",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "markets-editor",
"preview": {
"subject": "Bear-market list: INTC qualifies",
"text": "INTC (2026-10-30): more than 20% below its 52-week high (95%). Below 200-day 91%."
}
}
]
}Financial journalist / media · example 7
Fact check: did the S&P 500 (SPY) form a golden or death cross?
Moving-average crosses make headlines; verify the event happened today and describe the state.
- StateSPY
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
golden | English → rule | Did a golden cross happen today? |
death | English → rule | Did a death cross happen today? |
setup | English → rule | Is the 50-day moving average above the 200-day? |
stacked | English → rule | Is price above the 20-day, the 20-day above the 50-day, and the 50-day above the 200-day moving average? |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
goldenDid a golden cross happen today compiled to (sma(C, 50) > sma(C, 200)) and (ref(sma(C, 50), -1) <= ref(sma(C, 200), -1)) | 0.0537 | false |
deathDid a death cross happen today compiled to (sma(C, 50) < sma(C, 200)) and (ref(sma(C, 50), -1) >= ref(sma(C, 200), -1)) | 0.0537 | false |
setupIs the 50-day moving average above the 200-day compiled to sma(C, 50) > sma(C, 200) | 0.9463 | true |
stackedIs price above the 20-day, the 20-day above the 50-day, and the 50-day above the 200-day moving average compiled to (C > sma(C, 20)) and (sma(C, 20) > sma(C, 50)) and (sma(C, 50) > sma(C, 200)) | 0.0816 | false |
up_weekHigher in a week | 0.598 | 60% · close to even |
What it means
For SPY on the session of 2026-10-30: True now: Is the 50-day moving average above the 200-day. Not true: Did a golden cross happen today; Did a death cross happen today; Is price above the 20-day, the 20-day above the 50-day, and the 50-day above the 200-day moving average. Forecasts: Higher in a week 60%.
A cross is a one-day event; if neither cross happened today, the story describes the setup instead and labels the forecast as odds.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"golden": {
"type": "yes_no",
"instructions": "Did a golden cross happen today?"
},
"death": {
"type": "yes_no",
"instructions": "Did a death cross happen today?"
},
"setup": {
"type": "yes_no",
"instructions": "Is the 50-day moving average above the 200-day?"
},
"stacked": {
"type": "yes_no",
"instructions": "Is price above the 20-day, the 20-day above the 50-day, and the 50-day above the 200-day moving average?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"golden": {
"yes_no": 0.0537,
"rule": "(sma(C, 50) > sma(C, 200)) and (ref(sma(C, 50), -1) <= ref(sma(C, 200), -1))",
"basis": "pattern"
},
"death": {
"yes_no": 0.0537,
"rule": "(sma(C, 50) < sma(C, 200)) and (ref(sma(C, 50), -1) >= ref(sma(C, 200), -1))",
"basis": "pattern"
},
"setup": {
"yes_no": 0.9463,
"rule": "sma(C, 50) > sma(C, 200)",
"basis": "comparison"
},
"stacked": {
"yes_no": 0.0816,
"rule": "(C > sma(C, 20)) and (sma(C, 20) > sma(C, 50)) and (sma(C, 50) > sma(C, 200))",
"basis": "pattern"
},
"up_week": {
"yes_no": 0.598
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}Financial journalist / media · example 8
Fact check: did INTC cut its dividend?
Verify a dividend cut or suspension before reporting it, and check the payout history around it.
- StateINTC
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"INTC"} The server fills in the latest completed session.
Questions
cut | English → rule | Did the stock cut its dividend last time? |
pays | English → rule | Does the stock pay a dividend? |
recent_ex | English → rule | Did the stock go ex-dividend in the last 30 days? |
years | English → rule | Has the stock grown its dividend for 10 years in a row? |
change | rule | div_change_pct < -25Last payment more than 25% below the previous one |
Answers
| Question | Answer | Reading |
|---|---|---|
cutDid the stock cut its dividend last time compiled to cut_last > 0.5 | 0.1409 | false |
paysDoes the stock pay a dividend compiled to pays_dividend > 0.5 | 0.1409 | false |
recent_exDid the stock go ex-dividend in the last 30 days compiled to days_since_ex_div <= 30 | 0.0537 | false |
yearsHas the stock grown its dividend for 10 years in a row compiled to years_of_growth >= 10 | 0.0537 | false |
changeLast payment more than 25% below the previous one | 0.0537 | false |
Actions
Rules on the answers decide what to send.
cut >= 0.6→Slackmarkets-deskelse→Slackmarkets-desk{
"text": "INTC (2026-10-30): the payment record does not show a cut (14%). Check the company release before writing it."
}What it means
For INTC on the session of 2026-10-30: Not true: Did the stock cut its dividend last time; Does the stock pay a dividend; Did the stock go ex-dividend in the last 30 days; Has the stock grown its dividend for 10 years in a row; Last payment more than 25% below the previous one. Fired: not_confirmed (Slack → markets-desk).
The dividend record decides the verb: "cut", "suspended" or "held"; the article cites the payment change.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "INTC"
},
"questions": {
"cut": {
"type": "yes_no",
"instructions": "Did the stock cut its dividend last time?"
},
"pays": {
"type": "yes_no",
"instructions": "Does the stock pay a dividend?"
},
"recent_ex": {
"type": "yes_no",
"instructions": "Did the stock go ex-dividend in the last 30 days?"
},
"years": {
"type": "yes_no",
"instructions": "Has the stock grown its dividend for 10 years in a row?"
},
"change": {
"type": "yes_no",
"ask": "div_change_pct < -25"
}
},
"actions": [
{
"id": "cut_confirmed",
"when": "cut >= 0.6",
"do": "slack",
"connection": "markets-desk",
"message": "{{symbol}} ({{as_of}}): dividend cut confirmed by the payment record ({{cut|pct}}); change over 25% {{change|pct}}."
},
{
"id": "not_confirmed",
"when": "else",
"do": "slack",
"connection": "markets-desk",
"message": "{{symbol}} ({{as_of}}): the payment record does not show a cut ({{cut|pct}}). Check the company release before writing it."
}
],
"dry_run": true
}Response JSON (INTC, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"cut": {
"yes_no": 0.1409,
"rule": "cut_last > 0.5",
"basis": "pattern"
},
"pays": {
"yes_no": 0.1409,
"rule": "pays_dividend > 0.5",
"basis": "pattern"
},
"recent_ex": {
"yes_no": 0.0537,
"rule": "days_since_ex_div <= 30",
"basis": "pattern"
},
"years": {
"yes_no": 0.0537,
"rule": "years_of_growth >= 10",
"basis": "pattern"
},
"change": {
"yes_no": 0.0537,
"rule": "div_change_pct < -25",
"basis": "rule"
}
},
"context": {
"symbol": "INTC",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "cut_confirmed",
"fired": false,
"status": "skipped"
},
{
"id": "not_confirmed",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "markets-desk",
"preview": {
"text": "INTC (2026-10-30): the payment record does not show a cut (14%). Check the company release before writing it."
}
}
]
}cut_last days_since_ex_div div_change_pct pays_dividend years_of_growth
Financial journalist / media · example 9
A pre-open note for the markets desk on yesterday's movers
Every weekday before the open, the desk channel gets the big movers among mega caps with the rule behind each.
- ScheduleMon–Fri at 07:45 ET
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then MSFT, NVDA, AMZN, TSLA, one request each. The server fills in the latest completed session.
Questions
big | rule | abs(C - C[-1]) > 1.5 * atr(14)Today's move was bigger than 1.5 ATR |
up | English → rule | Did the stock close higher than yesterday? |
vol | English → rule | Was today's volume twice its 20-day average? |
gap_up | forecast | Will it gap up tomorrow? A gap up tomorrow |
Answers
| Symbol | bigrule | uprule | volrule | gap_upforecast | Fired |
|---|---|---|---|---|---|
AAPL | 0.0586 | 0.127 | 0.2473 | 0.053 | none |
MSFT | 0.065 | 0.1148 | 0.262 | 0.071 | none |
NVDA | 0.4404 | 0.0732 | 0.1794 | 0.191 | none |
AMZN | 0.0598 | 0.1852 | 0.9135 | 0.198 | none |
TSLA | 0.054 | 0.2949 | 0.0589 | 0.224 | none |
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.
big >= 0.6→Slackmarkets-deskWhat it means
Session of 2026-10-30, 5 symbols: Today's move was bigger than 1.5 ATR: true for none of 5. Did the stock close higher than yesterday: true for none of 5. Was today's volume twice its 20-day average: true for AMZN of 5. Highest odds for “A gap up tomorrow”: TSLA at 22%. mover fired for none.
Only real movers post; the forecast line is marked as a forecast so nobody prints it as fact.
As a scheduled workflow (Mon–Fri at 07:45 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": "A pre-open note for the markets desk on yesterday's movers",
"symbols": "AAPL MSFT NVDA AMZN TSLA",
"days": [
1,
2,
3,
4,
5
],
"at_time": "07:45",
"model": "ora-fin-0.1.1",
"questions": {
"big": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"up": {
"type": "yes_no",
"instructions": "Did the stock close higher than yesterday?"
},
"vol": {
"type": "yes_no",
"instructions": "Was today's volume twice its 20-day average?"
},
"gap_up": {
"type": "yes_no",
"instructions": "Will it gap up tomorrow?"
}
},
"actions": [
{
"id": "mover",
"when": "big >= 0.6",
"do": "slack",
"connection": "markets-desk",
"message": "{{symbol}} ({{as_of}}): moved more than 1.5 ATR (up day {{up|pct}}), volume twice average {{vol|pct}}. Gap up tomorrow (forecast) {{gap_up|pct}}."
}
]
}Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"big": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"up": {
"type": "yes_no",
"instructions": "Did the stock close higher than yesterday?"
},
"vol": {
"type": "yes_no",
"instructions": "Was today's volume twice its 20-day average?"
},
"gap_up": {
"type": "yes_no",
"instructions": "Will it gap up tomorrow?"
}
},
"actions": [
{
"id": "mover",
"when": "big >= 0.6",
"do": "slack",
"connection": "markets-desk",
"message": "{{symbol}} ({{as_of}}): moved more than 1.5 ATR (up day {{up|pct}}), volume twice average {{vol|pct}}. Gap up tomorrow (forecast) {{gap_up|pct}}."
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"big": {
"yes_no": 0.0586,
"rule": "abs(C - C[-1]) > 1.5 * atr(14)",
"basis": "rule"
},
"up": {
"yes_no": 0.127,
"rule": "C > C[-1]",
"basis": "comparison"
},
"vol": {
"yes_no": 0.2473,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "pattern"
},
"gap_up": {
"yes_no": 0.053
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "mover",
"fired": false,
"status": "skipped"
}
]
}Financial journalist / media · example 10
Fact check: has NVDA split recently, and is another one announced?
Get the split history right before writing about a share price or an expected split.
- StateNVDA
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
split_3y | English → rule | Has the stock split in the past three years? |
ratio | rule | last_split_ratio >= 10Last split was at least 10-for-1 |
coming | English → rule | Is a stock split coming up? |
reverse | English → rule | Was the last split a reverse split? |
split_again | forecast | Will NVDA split its stock again? |
Answers
| Question | Answer | Reading |
|---|---|---|
split_3yHas the stock split in the past three years compiled to days_since_split <= 1095 | 0.9463 | true |
ratioLast split was at least 10-for-1 | 0.55 | on the line (true) |
comingIs a stock split coming up compiled to days_to_split <= 365 | 0.0537 | false |
reverseWas the last split a reverse split compiled to reverse_split_last > 0.5 | 0.1409 | false |
split_againWill NVDA split its stock again | 0.48 | 48% · close to even |
What it means
For NVDA on the session of 2026-10-30: True now: Has the stock split in the past three years. Not true: Is a stock split coming up; Was the last split a reverse split. On the line: Last split was at least 10-for-1. Forecasts: Will NVDA split its stock again 48%.
Split facts come from the corporate-action record; speculation about another split is a forecast and must be written as such.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"split_3y": {
"type": "yes_no",
"instructions": "Has the stock split in the past three years?"
},
"ratio": {
"type": "yes_no",
"ask": "last_split_ratio >= 10"
},
"coming": {
"type": "yes_no",
"instructions": "Is a stock split coming up?"
},
"reverse": {
"type": "yes_no",
"instructions": "Was the last split a reverse split?"
},
"split_again": {
"type": "yes_no",
"instructions": "Will NVDA split its stock again?"
}
}
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"split_3y": {
"yes_no": 0.9463,
"rule": "days_since_split <= 1095",
"basis": "pattern"
},
"ratio": {
"yes_no": 0.55,
"rule": "last_split_ratio >= 10",
"basis": "rule"
},
"coming": {
"yes_no": 0.0537,
"rule": "days_to_split <= 365",
"basis": "pattern"
},
"reverse": {
"yes_no": 0.1409,
"rule": "reverse_split_last > 0.5",
"basis": "pattern"
},
"split_again": {
"yes_no": 0.48
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
}
}days_since_split days_to_split last_split_ratio reverse_split_last
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 Corporates: Investor relations team, Corporate treasury, CFO office, Bank credit analyst.