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 · 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.

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 (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.

ora-fin-0.1.1NVDA5 questions2 actions
  1. StateNVDA
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

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

Questions

intradayEnglish → ruleDid the stock make a new 52-week high today?
closingEnglish → ruleDid the stock make a new 52-week closing high?
nearruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
within5English → ruleIs the stock within 5% of its 52-week high?
recentrulehighestbars(H, 20) <= 3
Set its 20-day high in the last four sessions

Answers

QuestionAnswerReading
intraday
Did the stock make a new 52-week high today
compiled to H > highest(H, 252)
0.0537false
closing
Did the stock make a new 52-week closing high
compiled to C > highest(C, 252)
0.0537false
near
Within 2% of the 52-week high
0.0537false
within5
Is the stock within 5% of its 52-week high
compiled to abs(C / max(H, 252) - 1) <= 0.05
0.0537false
recent
Set its 20-day high in the last four sessions
0.0566false

Actions

Rules on the answers decide what to send.

intraday >= 0.6 or closing >= 0.6→Slackmarkets-desk
else→Slackmarkets-desk
What each action would send 1 of 2 fired · dry run, nothing sent
headline_okrule false: skipped
softenwould send (dry run)Slack → markets-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%)."
      }
    }
  ]
}

abs highest highestbars max

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.

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

State

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

Questions

beat_epsEnglish → ruleDid the stock beat EPS estimates last quarter?
beat_revEnglish → ruleDid revenue beat estimates last quarter?
bothEnglish → ruleDid the stock beat on both EPS and revenue last quarter?
surpriseEnglish → ruleDid EPS beat estimates by more than 5% last quarter?
streakEnglish → ruleHas the stock beaten EPS estimates 4 quarters in a row?
growthEnglish → ruleDid EPS grow more than 10% year over year?

Answers

QuestionAnswerReading
beat_eps
Did the stock beat EPS estimates last quarter
compiled to beat_eps_last > 0.5
0.8591true
beat_rev
Did revenue beat estimates last quarter
compiled to beat_revenue_last > 0.5
0.8591true
both
Did the stock beat on both EPS and revenue last quarter
compiled to beat_eps_last > 0.5 and beat_revenue_last > 0.5
0.8591true
surprise
Did EPS beat estimates by more than 5% last quarter
compiled to eps_surprise_pct > 5
0.6333true
streak
Has the stock beaten EPS estimates 4 quarters in a row
compiled to beat_streak >= 4
0.55on the line (true)
growth
Did EPS grow more than 10% year over year
compiled to eps_growth_yoy > 10
0.9463true

Actions

Rules on the answers decide what to send.

beat_eps >= 0→Webhooknewsroom-cms
What each action would send 1 of 1 fired · dry run, nothing sent
cms_factswould send (dry run)Webhook → newsroom-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.

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

State

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

Questions

upEnglish → ruleDid the stock close higher than yesterday?
big_upEnglish → ruleDid the stock rise more than 2% today?
big_downEnglish → ruleDid the stock fall more than 3% today?
above200English → ruleIs the stock above its 200-day moving average?
trend_dayrule(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

Symboluprulebig_uprulebig_downruleabove200ruletrend_dayrule
SPY0.05520.05370.07090.94510.0537
QQQ0.05370.05370.72170.79870.0537
DIA0.07840.05370.05370.87780.0537
IWM0.07070.05370.08540.55640.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"
  }
}

offset sma

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.

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

worst20English → ruleWas today the worst day of the last 20 sessions?
down3English → ruleDid the stock fall more than 3% today?
big_atrruleabs(C - C[-1]) > 1.5 * atr(14)
Today's move was bigger than 1.5 ATR
shockrulezscore(C / C[-1] - 1, 20) < -2
A two-sigma down day
volEnglish → ruleWas today's volume twice its 20-day average?

Answers

QuestionAnswerReading
worst20
Was 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.2631false
down3
Did the stock fall more than 3% today
compiled to C / C[-1] - 1 < -0.03
0.1674false
big_atr
Today's move was bigger than 1.5 ATR
0.054false
shock
A two-sigma down day
0.0945false
vol
Was today's volume twice its 20-day average
compiled to V > 2 * ref(avg(V, 20), -1)
0.0589false

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"
  }
}

abs atr avg min offset ref zscore

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.

ora-fin-0.1.1JPM6 questions2 actions
  1. StateJPM
  2. Questions6 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

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

Questions

recentEnglish → ruleDid the stock report earnings in the last 7 days?
beat_epsEnglish → ruleDid the stock beat EPS estimates last quarter?
beat_revEnglish → ruleDid revenue beat estimates last quarter?
gapEnglish → ruleDid the stock gap up after its last earnings?
fellEnglish → ruleDid the stock fall after its last earnings report?
above_preEnglish → ruleIs the stock trading above its pre-earnings price?

Answers

QuestionAnswerReading
recent
Did the stock report earnings in the last 7 days
compiled to days_since_earnings <= 7
0.0537false
beat_eps
Did the stock beat EPS estimates last quarter
compiled to beat_eps_last > 0.5
0.1409false
beat_rev
Did revenue beat estimates last quarter
compiled to beat_revenue_last > 0.5
0.1409false
gap
Did the stock gap up after its last earnings
compiled to last_earnings_gap > 0
0.9463true
fell
Did the stock fall after its last earnings report
compiled to last_earnings_move < 0
0.9463true
above_pre
Is the stock trading above its pre-earnings price
compiled to C > pre_earnings_close
0.6505true

Actions

Rules on the answers decide what to send.

recent >= 0.6→Webhooknewsroom-cms
else→Slackmarkets-desk
What each action would send 1 of 2 fired · dry run, nothing sent
cms_draftrule false: skipped
no_reportwould send (dry run)Slack → markets-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.

ora-fin-0.1.15 symbols, one request each3 questions1 action
  1. State5 symbols
  2. Questions3 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

{"symbol":"INTC"} then NKE, BA, PFE, TGT, one request each. The server fills in the latest completed session.

Questions

bearEnglish → ruleIs the stock in bear-market territory, more than 20% below its 52-week high?
below200English → ruleIs the stock below its 200-day moving average?
down3mruleC / C[-63] - 1 < -0.1
Down more than 10% over three months

Answers

Symbolbearrulebelow200ruledown3mruleFired
INTC0.94630.91390.9235list_it
NKE0.94630.94630.3277list_it
BA0.92960.94460.9417list_it
PFE0.05370.05370.0537none
TGT0.05370.05960.0848none

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
INTC 1 of 1 fired · dry run, nothing sent
list_itwould send (dry run)Email → markets-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%."
}
NKE 1 of 1 fired · dry run, nothing sent
list_itwould send (dry run)Email → markets-editor
{
  "subject": "Bear-market list: NKE qualifies",
  "text": "NKE (2026-10-30): more than 20% below its 52-week high (95%). Below 200-day 95%."
}
BA 1 of 1 fired · dry run, nothing sent
list_itwould send (dry run)Email → markets-editor
{
  "subject": "Bear-market list: BA qualifies",
  "text": "BA (2026-10-30): more than 20% below its 52-week high (93%). Below 200-day 94%."
}
PFE 0 of 1 fired · dry run, nothing sent
TGT 0 of 1 fired · dry run, nothing sent

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%."
      }
    }
  ]
}

max offset sma

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.

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

State

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

Questions

goldenEnglish → ruleDid a golden cross happen today?
deathEnglish → ruleDid a death cross happen today?
setupEnglish → ruleIs the 50-day moving average above the 200-day?
stackedEnglish → ruleIs price above the 20-day, the 20-day above the 50-day, and the 50-day above the 200-day moving average?
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
golden
Did 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.0537false
death
Did 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.0537false
setup
Is the 50-day moving average above the 200-day
compiled to sma(C, 50) > sma(C, 200)
0.9463true
stacked
Is 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.0816false
up_week
Higher in a week
0.59860% · 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"
  }
}

ref sma

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.

ora-fin-0.1.1INTC5 questions2 actions
  1. StateINTC
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

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

Questions

cutEnglish → ruleDid the stock cut its dividend last time?
paysEnglish → ruleDoes the stock pay a dividend?
recent_exEnglish → ruleDid the stock go ex-dividend in the last 30 days?
yearsEnglish → ruleHas the stock grown its dividend for 10 years in a row?
changerulediv_change_pct < -25
Last payment more than 25% below the previous one

Answers

QuestionAnswerReading
cut
Did the stock cut its dividend last time
compiled to cut_last > 0.5
0.1409false
pays
Does the stock pay a dividend
compiled to pays_dividend > 0.5
0.1409false
recent_ex
Did the stock go ex-dividend in the last 30 days
compiled to days_since_ex_div <= 30
0.0537false
years
Has the stock grown its dividend for 10 years in a row
compiled to years_of_growth >= 10
0.0537false
change
Last payment more than 25% below the previous one
0.0537false

Actions

Rules on the answers decide what to send.

cut >= 0.6→Slackmarkets-desk
else→Slackmarkets-desk
What each action would send 1 of 2 fired · dry run, nothing sent
cut_confirmedrule false: skipped
not_confirmedwould send (dry run)Slack → markets-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.

ora-fin-0.1.15 symbols, one request each4 questions1 actionworkflow · Mon–Fri at 07:45 ET
  1. ScheduleMon–Fri at 07:45 ET
  2. State5 symbols
  3. Questions4 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

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

Questions

bigruleabs(C - C[-1]) > 1.5 * atr(14)
Today's move was bigger than 1.5 ATR
upEnglish → ruleDid the stock close higher than yesterday?
volEnglish → ruleWas today's volume twice its 20-day average?
gap_upforecastWill it gap up tomorrow?
A gap up tomorrow

Answers

Symbolbigruleuprulevolrulegap_upforecastFired
AAPL0.05860.1270.24730.053none
MSFT0.0650.11480.2620.071none
NVDA0.44040.07320.17940.191none
AMZN0.05980.18520.91350.198none
TSLA0.0540.29490.05890.224none

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-desk
AAPL 0 of 1 fired · dry run, nothing sent
MSFT 0 of 1 fired · dry run, nothing sent
NVDA 0 of 1 fired · dry run, nothing sent
AMZN 0 of 1 fired · dry run, nothing sent
TSLA 0 of 1 fired · dry run, nothing sent

What 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"
    }
  ]
}

abs atr avg offset ref

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.

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

State

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

Questions

split_3yEnglish → ruleHas the stock split in the past three years?
ratiorulelast_split_ratio >= 10
Last split was at least 10-for-1
comingEnglish → ruleIs a stock split coming up?
reverseEnglish → ruleWas the last split a reverse split?
split_againforecastWill NVDA split its stock again?

Answers

QuestionAnswerReading
split_3y
Has the stock split in the past three years
compiled to days_since_split <= 1095
0.9463true
ratio
Last split was at least 10-for-1
0.55on the line (true)
coming
Is a stock split coming up
compiled to days_to_split <= 365
0.0537false
reverse
Was the last split a reverse split
compiled to reverse_split_last > 0.5
0.1409false
split_again
Will NVDA split its stock again
0.4848% · 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.

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