Use cases · Corporates
CFO office: 20 ways to use Ora
Board-ready market context: own stock vs peers, guidance reactions and capital-return timing. Each example is a complete, runnable request with the real answers it returned (47 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 (53)
sma 10offset 7max 4ref 4days_to_earnings 4roc 3abs 3avg 3swinglow 3ema 2days_since_earnings 2last_earnings_move 2div_yield_ttm 2years_of_growth 2beat_eps_last 2log 2sqrt 2std 2rsi 2last_earnings_gap 1pre_earnings_close 1beats_last4 1eps_year_ago 1last_eps 1revenue_growth_yoy 1days_since_split 1days_to_split 1last_split_ratio 1splits_5y 1outside_bar 1atr_pct 1bblower 1bbmid 1bbupper 1min 1div_change_pct 1raised_last 1macdhist 1morning_star 1tweezer_bottom 1beat_revenue_last 1next_report_bmo 1atr 1crossdown 1lowestbars 1swinghigh 1dark_cloud 1gravestone_doji 1hanging_man 1harami_bear 1highest 1rec 1next_report_amc 1
Examples 1–10 of 20 · page 1 of 2
CFO office · example 1
CFO office at HD: one board slide on our stock vs LOW
The CFO's team builds a board slide comparing the company's stock with its closest peer on trend, momentum and drawdown.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"HD"} then LOW, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
stacked | rule | C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)Stacked averages: close > 20 EMA > 50 > 200 |
q_leader | rule | roc(C, 63) > 10 and C >= 0.95 * max(H, 63)Up more than 10% in a quarter, near the high |
drawdown | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | stackedrule | q_leaderrule | drawdownrule | beat_spyforecast |
|---|---|---|---|---|---|
HD | 0.4455 | 0.0537 | 0.1142 | 0.1282 | 0.504 |
LOW | 0.1012 | 0.0537 | 0.0727 | 0.9247 | 0.557 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 2 symbols: Is the stock above its 200-day moving average: true for none of 2. Stacked averages: close > 20 EMA > 50 > 200: true for none of 2. Up more than 10% in a quarter, near the high: true for none of 2. More than 20% off the 52-week high: true for LOW of 2. Highest odds for “Beating SPY over a month”: LOW at 56%.
Same questions for both names make the slide fair; the forecast row is labelled as odds so the board does not read it as guidance.
Request JSON (HD; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "HD"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"stacked": {
"type": "yes_no",
"ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
},
"q_leader": {
"type": "yes_no",
"ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
},
"drawdown": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (HD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.4455,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"stacked": {
"yes_no": 0.0537,
"rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"q_leader": {
"yes_no": 0.1142,
"rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
"basis": "rule"
},
"drawdown": {
"yes_no": 0.1282,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.504
}
},
"context": {
"symbol": "HD",
"as_of": "2026-10-30"
}
}CFO office · example 2
CFO office at TXN: did the market believe our guidance?
After the report, check the reaction: the gap, the close versus the pre-report price, and whether the move was unusual.
- StateTXN
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"TXN"} The server fills in the latest completed session.
Questions
recent | rule | days_since_earnings <= 5Reported in the last 5 days |
gap | English → rule | Did the stock gap up after its last earnings? |
fell | English → rule | Did the stock fall after its last earnings report? |
big | English → rule | Was the last earnings reaction bigger than 5%? |
above_pre | English → rule | Is the stock trading above its pre-earnings price? |
down_week | forecast | Will the stock be lower in a week? Lower in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
recentReported in the last 5 days | 0.1033 | false |
gapDid the stock gap up after its last earnings compiled to last_earnings_gap > 0 | 0.0537 | false |
fellDid the stock fall after its last earnings report compiled to last_earnings_move < 0 | 0.9463 | true |
bigWas the last earnings reaction bigger than 5% compiled to abs(last_earnings_move) > 5 | 0.0537 | false |
above_preIs the stock trading above its pre-earnings price compiled to C > pre_earnings_close | 0.8864 | true |
down_weekLower in a week | 0.487 | 49% · close to even |
Actions
Rules on the answers decide what to send.
fell >= 0.6 and big >= 0.6→Emailcfoelse→Slackcfo-office{
"text": "TXN (2026-10-30): reaction contained (fell 95%, big move 5%)."
}What it means
For TXN on the session of 2026-10-30: True now: Did the stock fall after its last earnings report; Is the stock trading above its pre-earnings price. Not true: Reported in the last 5 days; Did the stock gap up after its last earnings; Was the last earnings reaction bigger than 5%. Forecasts: Lower in a week 49%. Fired: contained (Slack → cfo-office).
A large negative reaction is the case where the CFO and IR plan follow-up investor meetings; a contained one needs no extra outreach.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TXN"
},
"questions": {
"recent": {
"type": "yes_no",
"ask": "days_since_earnings <= 5"
},
"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?"
},
"big": {
"type": "yes_no",
"instructions": "Was the last earnings reaction bigger than 5%?"
},
"above_pre": {
"type": "yes_no",
"instructions": "Is the stock trading above its pre-earnings price?"
},
"down_week": {
"type": "yes_no",
"instructions": "Will the stock be lower in a week?"
}
},
"actions": [
{
"id": "negative",
"when": "fell >= 0.6 and big >= 0.6",
"do": "email",
"connection": "cfo",
"subject": "{{symbol}}: large negative reaction to the report",
"message": "{{symbol}} ({{as_of}}): fell after the report with a move over 5% ({{big|pct}}). Above pre-report close {{above_pre|pct}}. Suggest a follow-up call plan with IR."
},
{
"id": "contained",
"when": "else",
"do": "slack",
"connection": "cfo-office",
"message": "{{symbol}} ({{as_of}}): reaction contained (fell {{fell|pct}}, big move {{big|pct}})."
}
],
"dry_run": true
}Response JSON (TXN, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"recent": {
"yes_no": 0.1033,
"rule": "days_since_earnings <= 5",
"basis": "rule"
},
"gap": {
"yes_no": 0.0537,
"rule": "last_earnings_gap > 0",
"basis": "pattern"
},
"fell": {
"yes_no": 0.9463,
"rule": "last_earnings_move < 0",
"basis": "pattern"
},
"big": {
"yes_no": 0.0537,
"rule": "abs(last_earnings_move) > 5",
"basis": "pattern"
},
"above_pre": {
"yes_no": 0.8864,
"rule": "C > pre_earnings_close",
"basis": "pattern"
},
"down_week": {
"yes_no": 0.487
}
},
"context": {
"symbol": "TXN",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "negative",
"fired": false,
"status": "skipped"
},
{
"id": "contained",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "cfo-office",
"preview": {
"text": "TXN (2026-10-30): reaction contained (fell 95%, big move 5%)."
}
}
]
}abs days_since_earnings last_earnings_gap last_earnings_move pre_earnings_close
CFO office · example 3
CFO office at CVX: buyback or dividend raise this quarter?
Frame the capital-return discussion with the market context: the stock's trend, valuation stretch and dividend record.
- StateCVX
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"CVX"} The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 50-day moving average? |
stretched | English → rule | Is the stock more than 10% above its 200-day moving average? |
drawdown | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
years | English → rule | Has the stock grown its dividend for 10 years in a row? |
yield | English → rule | Is the dividend yield above 3%? |
raise_next | forecast | Will the company raise its dividend next year? Raising the dividend next year |
Answers
| Question | Answer | Reading |
|---|---|---|
trendIs the stock above its 50-day moving average compiled to C > sma(C, 50) | 0.9463 | true |
stretchedIs the stock more than 10% above its 200-day moving average compiled to C > sma(C, 200) * 1.1 | 0.9463 | true |
drawdownMore than 20% off the 52-week high | 0.0537 | false |
yearsHas the stock grown its dividend for 10 years in a row compiled to years_of_growth >= 10 | 0.1409 | false |
yieldIs the dividend yield above 3% compiled to div_yield_ttm > 3 | 0.4906 | on the line (false) |
raise_nextRaising the dividend next year | 0.563 | 56% · close to even |
What it means
For CVX on the session of 2026-10-30: True now: Is the stock above its 50-day moving average; Is the stock more than 10% above its 200-day moving average. Not true: More than 20% off the 52-week high; Has the stock grown its dividend for 10 years in a row. On the line: Is the dividend yield above 3%. Forecasts: Raising the dividend next year 56%.
A stock in a drawdown with a high yield makes buybacks cheaper per share; a stretched stock tilts the discussion toward the dividend. The board decides.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "CVX"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 50-day moving average?"
},
"stretched": {
"type": "yes_no",
"instructions": "Is the stock more than 10% above its 200-day moving average?"
},
"drawdown": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"years": {
"type": "yes_no",
"instructions": "Has the stock grown its dividend for 10 years in a row?"
},
"yield": {
"type": "yes_no",
"instructions": "Is the dividend yield above 3%?"
},
"raise_next": {
"type": "yes_no",
"instructions": "Will the company raise its dividend next year?"
}
}
}Response JSON (CVX, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9463,
"rule": "C > sma(C, 50)",
"basis": "comparison"
},
"stretched": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200) * 1.1",
"basis": "comparison"
},
"drawdown": {
"yes_no": 0.0537,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"years": {
"yes_no": 0.1409,
"rule": "years_of_growth >= 10",
"basis": "pattern"
},
"yield": {
"yes_no": 0.4906,
"rule": "div_yield_ttm > 3",
"basis": "pattern"
},
"raise_next": {
"yes_no": 0.563
}
},
"context": {
"symbol": "CVX",
"as_of": "2026-10-30"
}
}CFO office · example 4
CFO office: earnings scorecard for consumer peers
Before setting next year's targets, the CFO's team checks how peers did against estimates and year over year.
- State4 symbols
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"NKE"} then LULU, TGT, ULTA, one request each. The server fills in the latest completed session.
Questions
beat | English → rule | Did the stock beat EPS estimates last quarter? |
streak | English → rule | Has the stock beaten EPS estimates in at least 3 of the last 4 quarters? |
eps_yoy | English → rule | Is EPS up year over year? |
rev_g | English → rule | Did revenue grow more than 5% year over year? |
beat_next | forecast | Will the stock beat earnings next quarter? Beating earnings next quarter |
Answers
| Symbol | beatrule | streakrule | eps_yoyrule | rev_grule | beat_nextforecast | Fired |
|---|---|---|---|---|---|---|
NKE | 0.8591 | 0.8591 | 0.3724 | 0.0537 | 0.567 | scorecard_row |
LULU | 0.8591 | 0.8591 | 0.0537 | 0.0537 | 0.42 | scorecard_row |
TGT | 0.8591 | 0.8591 | 0.9463 | 0.9463 | 0.503 | scorecard_row |
ULTA | 0.8591 | 0.55 | 0.9463 | 0.9463 | 0.516 | scorecard_row |
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→Webhookfpna-zapier{
"sheet": "peer_scorecard",
"ticker": "NKE",
"as_of": "2026-10-30",
"beat_eps": 0.8591,
"beats_3_of_4": 0.8591,
"eps_up_yoy": 0.3724,
"revenue_growth_over_5pct": 0.0537,
"p_beat_next": 0.567
}{
"sheet": "peer_scorecard",
"ticker": "LULU",
"as_of": "2026-10-30",
"beat_eps": 0.8591,
"beats_3_of_4": 0.8591,
"eps_up_yoy": 0.0537,
"revenue_growth_over_5pct": 0.0537,
"p_beat_next": 0.42
}{
"sheet": "peer_scorecard",
"ticker": "TGT",
"as_of": "2026-10-30",
"beat_eps": 0.8591,
"beats_3_of_4": 0.8591,
"eps_up_yoy": 0.9463,
"revenue_growth_over_5pct": 0.9463,
"p_beat_next": 0.503
}{
"sheet": "peer_scorecard",
"ticker": "ULTA",
"as_of": "2026-10-30",
"beat_eps": 0.8591,
"beats_3_of_4": 0.55,
"eps_up_yoy": 0.9463,
"revenue_growth_over_5pct": 0.9463,
"p_beat_next": 0.516
}What it means
Session of 2026-10-30, 4 symbols: Did the stock beat EPS estimates last quarter: true for NKE, LULU, TGT, ULTA of 4. Has the stock beaten EPS estimates in at least 3 of the last 4 quarters: true for NKE, LULU, TGT of 4. Is EPS up year over year: true for TGT, ULTA of 4. Did revenue grow more than 5% year over year: true for TGT, ULTA of 4. Highest odds for “Beating earnings next quarter”: NKE at 57%. scorecard_row fired for NKE, LULU, TGT, ULTA.
Peers that keep beating and growing set the bar the market will use for the company's own targets.
Request JSON (NKE; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NKE"
},
"questions": {
"beat": {
"type": "yes_no",
"instructions": "Did the stock beat EPS estimates last quarter?"
},
"streak": {
"type": "yes_no",
"instructions": "Has the stock beaten EPS estimates in at least 3 of the last 4 quarters?"
},
"eps_yoy": {
"type": "yes_no",
"instructions": "Is EPS up year over year?"
},
"rev_g": {
"type": "yes_no",
"instructions": "Did revenue grow more than 5% year over year?"
},
"beat_next": {
"type": "yes_no",
"instructions": "Will the stock beat earnings next quarter?"
}
},
"actions": [
{
"id": "scorecard_row",
"when": "beat >= 0",
"do": "webhook",
"connection": "fpna-zapier",
"body": {
"sheet": "peer_scorecard",
"ticker": "{{symbol}}",
"as_of": "{{as_of}}",
"beat_eps": "{{beat}}",
"beats_3_of_4": "{{streak}}",
"eps_up_yoy": "{{eps_yoy}}",
"revenue_growth_over_5pct": "{{rev_g}}",
"p_beat_next": "{{beat_next}}"
}
}
],
"dry_run": true
}Response JSON (NKE, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"beat": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5",
"basis": "pattern"
},
"streak": {
"yes_no": 0.8591,
"rule": "beats_last4 >= 3",
"basis": "pattern"
},
"eps_yoy": {
"yes_no": 0.3724,
"rule": "last_eps > eps_year_ago",
"basis": "pattern"
},
"rev_g": {
"yes_no": 0.0537,
"rule": "revenue_growth_yoy > 5",
"basis": "pattern"
},
"beat_next": {
"yes_no": 0.567
}
},
"context": {
"symbol": "NKE",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "scorecard_row",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "fpna-zapier",
"preview": {
"body": {
"sheet": "peer_scorecard",
"ticker": "NKE",
"as_of": "2026-10-30",
"beat_eps": 0.8591,
"beats_3_of_4": 0.8591,
"eps_up_yoy": 0.3724,
"revenue_growth_over_5pct": 0.0537,
"p_beat_next": 0.567
}
}
}
]
}beat_eps_last beats_last4 eps_year_ago last_eps revenue_growth_yoy
CFO office · example 5
CFO office at COST: should we consider a stock split?
Look at how peers with high share prices handled splits, and the company's own split history.
- State3 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"COST"} then WMT, NVDA, one request each. The server fills in the latest completed session.
Questions
split_3y | rule | days_since_split <= 1095Split in the last three years |
ratio | English → rule | Was the last split at least 2-for-1? |
multi | rule | splits_5y >= 2Two or more splits in five years |
announced | English → rule | Is a stock split coming up? |
trend | rule | C > sma(C, 50)Above the 50-day average |
Answers
| Symbol | split_3yrule | ratiorule | multirule | announcedrule | trendrule |
|---|---|---|---|---|---|
COST | 0.0537 | 0.55 | 0.0683 | 0.0537 | 0.9336 |
WMT | 0.9463 | 0.9317 | 0.1409 | 0.0537 | 0.9358 |
NVDA | 0.9463 | 0.9463 | 0.1409 | 0.0537 | 0.0746 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 3 symbols: Split in the last three years: true for WMT, NVDA of 3. Was the last split at least 2-for-1: true for WMT, NVDA of 3. Two or more splits in five years: true for none of 3. Is a stock split coming up: true for none of 3.
Split facts show what peers have done recently; the forecast model is not asked here because a split is a board decision, not a market event.
Request JSON (COST; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "COST"
},
"questions": {
"split_3y": {
"type": "yes_no",
"ask": "days_since_split <= 1095"
},
"ratio": {
"type": "yes_no",
"instructions": "Was the last split at least 2-for-1?"
},
"multi": {
"type": "yes_no",
"ask": "splits_5y >= 2"
},
"announced": {
"type": "yes_no",
"instructions": "Is a stock split coming up?"
},
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
}
}
}Response JSON (COST, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"split_3y": {
"yes_no": 0.0537,
"rule": "days_since_split <= 1095",
"basis": "rule"
},
"ratio": {
"yes_no": 0.55,
"rule": "last_split_ratio >= 2",
"basis": "pattern"
},
"multi": {
"yes_no": 0.0683,
"rule": "splits_5y >= 2",
"basis": "rule"
},
"announced": {
"yes_no": 0.0537,
"rule": "days_to_split <= 365",
"basis": "pattern"
},
"trend": {
"yes_no": 0.9336,
"rule": "C > sma(C, 50)",
"basis": "rule"
}
},
"context": {
"symbol": "COST",
"as_of": "2026-10-30"
}
}days_since_split days_to_split last_split_ratio sma splits_5y
CFO office · example 6
A monthly-style market brief, sent every Monday
The CFO's chief of staff gets one email per index: S&P 500, Nasdaq 100, small caps and long bonds.
- ScheduleMon at 07:00 ET
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"SPY"} then QQQ, IWM, TLT, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
up_month | English → rule | Is the stock up over the last month? |
vol_up | forecast | Will volatility be higher over the next month? Higher volatility next month |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | trendrule | up_monthrule | vol_upforecast | drop5forecast | Fired |
|---|---|---|---|---|---|
SPY | 0.9451 | 0.2238 | 0.69 | 0.203 | brief |
QQQ | 0.7987 | 0.0664 | 0.523 | 0.443 | brief |
IWM | 0.5564 | 0.5236 | 0.508 | 0.234 | brief |
TLT | 0.1127 | 0.9298 | 0.583 | 0.164 | brief |
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.
trend >= 0→Emailcfo{
"subject": "Market brief: SPY (2026-10-30)",
"text": "SPY: above 200-day 95%, up on the month 22%. Forecasts: higher volatility next month 69%, 5% drawdown 20%."
}{
"subject": "Market brief: QQQ (2026-10-30)",
"text": "QQQ: above 200-day 80%, up on the month 7%. Forecasts: higher volatility next month 52%, 5% drawdown 44%."
}{
"subject": "Market brief: IWM (2026-10-30)",
"text": "IWM: above 200-day 56%, up on the month 52%. Forecasts: higher volatility next month 51%, 5% drawdown 23%."
}{
"subject": "Market brief: TLT (2026-10-30)",
"text": "TLT: above 200-day 11%, up on the month 93%. Forecasts: higher volatility next month 58%, 5% drawdown 16%."
}What it means
Session of 2026-10-30, 4 symbols: Is the stock above its 200-day moving average: true for SPY, QQQ of 4. Is the stock up over the last month: true for TLT of 4. Highest odds for “Higher volatility next month”: SPY at 69%. brief fired for SPY, QQQ, IWM, TLT.
A short, consistent brief: trend facts first, forecast odds second, so the CFO walks into Monday meetings with the market backdrop.
As a scheduled workflow (Mon at 07: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": "A monthly-style market brief, sent every Monday",
"symbols": "SPY QQQ IWM TLT",
"days": [
1
],
"at_time": "07:00",
"model": "ora-fin-0.1.1",
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"up_month": {
"type": "yes_no",
"instructions": "Is the stock up over the last month?"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "brief",
"when": "trend >= 0",
"do": "email",
"connection": "cfo",
"subject": "Market brief: {{symbol}} ({{as_of}})",
"message": "{{symbol}}: above 200-day {{trend|pct}}, up on the month {{up_month|pct}}. Forecasts: higher volatility next month {{vol_up|pct}}, 5% drawdown {{drop5|pct}}."
}
]
}Request JSON (SPY; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"up_month": {
"type": "yes_no",
"instructions": "Is the stock up over the last month?"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "brief",
"when": "trend >= 0",
"do": "email",
"connection": "cfo",
"subject": "Market brief: {{symbol}} ({{as_of}})",
"message": "{{symbol}}: above 200-day {{trend|pct}}, up on the month {{up_month|pct}}. Forecasts: higher volatility next month {{vol_up|pct}}, 5% drawdown {{drop5|pct}}."
}
],
"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"
},
"up_month": {
"yes_no": 0.2238,
"rule": "C > C[-21]",
"basis": "pattern"
},
"vol_up": {
"yes_no": 0.69
},
"drop5": {
"yes_no": 0.203
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "brief",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "cfo",
"preview": {
"subject": "Market brief: SPY (2026-10-30)",
"text": "SPY: above 200-day 95%, up on the month 22%. Forecasts: higher volatility next month 69%, 5% drawdown 20%."
}
}
]
}CFO office · example 7
CFO office at PFE: how did the stock take our acquisition news?
After a deal announcement, see whether the acquirer's stock gapped down, recovered or broke support.
- StatePFE
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"PFE"} The server fills in the latest completed session.
Questions
gap_dn | rule | O < C[-1] * 0.99Opened more than 1% below yesterday's close |
reclaimed | rule | O < L[-1] and C > C[-1]Opened under yesterday's low, closed up on the day |
outside | rule | outside_bar()outside bar candle: Today's high above yesterday's and low below it. |
below_sup | rule | C < swinglow(5, 1)Closed below its last swing low |
down_vol | rule | C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)Down on heavy volume |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
gap_dnOpened more than 1% below yesterday's close | 0.0537 | false |
reclaimedOpened under yesterday's low, closed up on the day | 0.0537 | false |
outsideoutside bar candle: Today's high above yesterday's and low below it. | 0.0818 | false |
below_supClosed below its last swing low | 0.0743 | false |
down_volDown on heavy volume | 0.0847 | false |
drop5A 5% drawdown within a month | 0.418 | 42% · close to even |
What it means
For PFE on the session of 2026-10-30: Not true: Opened more than 1% below yesterday's close; Opened under yesterday's low, closed up on the day; outside bar candle: Today's high above yesterday's and low below it.; Closed below its last swing low; Down on heavy volume. Forecasts: A 5% drawdown within a month 42%.
An acquirer that gaps down and does not reclaim tells the CFO the market wants more on synergies; the next investor communication should address it.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "PFE"
},
"questions": {
"gap_dn": {
"type": "yes_no",
"ask": "O < C[-1] * 0.99"
},
"reclaimed": {
"type": "yes_no",
"ask": "O < L[-1] and C > C[-1]"
},
"outside": {
"type": "yes_no",
"ask": "outside_bar()"
},
"below_sup": {
"type": "yes_no",
"ask": "C < swinglow(5, 1)"
},
"down_vol": {
"type": "yes_no",
"ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
}
}Response JSON (PFE, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"gap_dn": {
"yes_no": 0.0537,
"rule": "O < C[-1] * 0.99",
"basis": "rule"
},
"reclaimed": {
"yes_no": 0.0537,
"rule": "O < L[-1] and C > C[-1]",
"basis": "rule"
},
"outside": {
"yes_no": 0.0818,
"rule": "outside_bar()",
"basis": "rule"
},
"below_sup": {
"yes_no": 0.0743,
"rule": "C < swinglow(5, 1)",
"basis": "rule"
},
"down_vol": {
"yes_no": 0.0847,
"rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.418
}
},
"context": {
"symbol": "PFE",
"as_of": "2026-10-30"
}
}CFO office · example 8
CFO office at AMD: is the window open for an equity raise?
A strong, liquid, low-stress tape is the best time to issue; check those conditions before talking to bankers.
- StateAMD
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"AMD"} The server fills in the latest completed session.
Questions
trend | rule | C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)Stacked averages: close > 20 EMA > 50 > 200 |
near_high | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
liquid | rule | avg(C * V, 20) > 100000000Trades more than $100 million a day |
calm | English → rule | Is 20-day historical volatility below 20%? |
earn_soon | rule | days_to_earnings <= 10Reports earnings within 10 days |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
trendStacked averages: close > 20 EMA > 50 > 200 | 0.1048 | false |
near_highWithin 2% of the 52-week high | 0.0537 | false |
liquidTrades more than $100 million a day | 0.9463 | true |
calmIs 20-day historical volatility below 20% compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2 | 0.0537 | false |
earn_soonReports earnings within 10 days | 0.9317 | true |
drop10A 10% drawdown within a month | 0.763 | 76% · likely |
Actions
Rules on the answers decide what to send.
trend >= 0.6 and near_high >= 0.6 and earn_soon < 0.4→Emailcfoelse→Slackcfo-office{
"text": "AMD (2026-10-30): conditions mixed (trend 10%, near high 5%, earnings soon 93%)."
}What it means
For AMD on the session of 2026-10-30: True now: Trades more than $100 million a day; Reports earnings within 10 days. Not true: Stacked averages: close > 20 EMA > 50 > 200; Within 2% of the 52-week high; Is 20-day historical volatility below 20%. Forecasts: A 10% drawdown within a month 76%. Fired: window_closed (Slack → cfo-office).
The check frames the conversation with bankers; legal, disclosure and the board still decide whether to issue.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AMD"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
},
"near_high": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
},
"liquid": {
"type": "yes_no",
"ask": "avg(C * V, 20) > 100000000"
},
"calm": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility below 20%?"
},
"earn_soon": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
},
"actions": [
{
"id": "window_open",
"when": "trend >= 0.6 and near_high >= 0.6 and earn_soon < 0.4",
"do": "email",
"connection": "cfo",
"subject": "{{symbol}}: market conditions supportive",
"message": "{{symbol}} ({{as_of}}): stacked uptrend {{trend|pct}}, near the 52-week high {{near_high|pct}}, no report within 10 days. 10% drawdown odds {{drop10|pct}}."
},
{
"id": "window_closed",
"when": "else",
"do": "slack",
"connection": "cfo-office",
"message": "{{symbol}} ({{as_of}}): conditions mixed (trend {{trend|pct}}, near high {{near_high|pct}}, earnings soon {{earn_soon|pct}})."
}
],
"dry_run": true
}Response JSON (AMD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.1048,
"rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"near_high": {
"yes_no": 0.0537,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"liquid": {
"yes_no": 0.9463,
"rule": "avg(C * V, 20) > 100000000",
"basis": "rule"
},
"calm": {
"yes_no": 0.0537,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2",
"basis": "pattern"
},
"earn_soon": {
"yes_no": 0.9317,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"drop10": {
"yes_no": 0.763
}
},
"context": {
"symbol": "AMD",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "window_open",
"fired": false,
"status": "skipped"
},
{
"id": "window_closed",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "cfo-office",
"preview": {
"text": "AMD (2026-10-30): conditions mixed (trend 10%, near high 5%, earnings soon 93%)."
}
}
]
}CFO office · example 9
CFO office: is our sector in or out of favour?
Compare sector ETFs so the board understands whether the company's stock is moving with its sector.
- State6 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XLK"} then XLV, XLF, XLE, XLP, XLI, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 50)Above the 50-day average |
mom | rule | roc(C, 20) > 5Up more than 5% in 20 sessions |
rsi | rule | rsi(C, 14) > 50RSI above 50 |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | momrule | rsirule | beat_spyforecast |
|---|---|---|---|---|
XLK | 0.0776 | 0.0537 | 0.0957 | 0.498 |
XLV | 0.9447 | 0.9157 | 0.9415 | 0.534 |
XLF | 0.6692 | 0.606 | 0.7929 | 0.448 |
XLE | 0.9432 | 0.897 | 0.9318 | 0.55 |
XLP | 0.9326 | 0.9049 | 0.9035 | 0.498 |
XLI | 0.1975 | 0.0725 | 0.2592 | 0.441 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 6 symbols: Above the 50-day average: true for XLV, XLF, XLE, XLP of 6. Up more than 5% in 20 sessions: true for XLV, XLF, XLE, XLP of 6. RSI above 50: true for XLV, XLF, XLE, XLP of 6. Highest odds for “Beating SPY over a month”: XLE at 55%.
A sector out of favour explains part of a weak share price; the remainder is what management can address.
Request JSON (XLK; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLK"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"mom": {
"type": "yes_no",
"ask": "roc(C, 20) > 5"
},
"rsi": {
"type": "yes_no",
"ask": "rsi(C, 14) > 50"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (XLK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.0776,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"mom": {
"yes_no": 0.0537,
"rule": "roc(C, 20) > 5",
"basis": "rule"
},
"rsi": {
"yes_no": 0.0957,
"rule": "rsi(C, 14) > 50",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.498
}
},
"context": {
"symbol": "XLK",
"as_of": "2026-10-30"
}
}CFO office · example 10
CFO office at DIS: how volatile is the stock before investor day?
Read the volatility regime so the team knows how much an investor-day message could move the stock.
- StateDIS
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"DIS"} The server fills in the latest completed session.
Questions
atr | rule | atr_pct(14) > 3A typical day moves more than 3% |
hv | English → rule | Is 20-day historical volatility above 40%? |
squeeze | English → rule | Is Bollinger Band width at its lowest in 120 sessions? |
nr7 | English → rule | Is today an NR7 day, the narrowest range of the last 7 sessions? |
big5 | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
vol_rise | forecast | Will volatility rise over the next 5 days? Volatility rising over 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
atrA typical day moves more than 3% | 0.0537 | false |
hvIs 20-day historical volatility above 40% compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4 | 0.0537 | false |
squeezeIs Bollinger Band width at its lowest in 120 sessions compiled to ((bbupper(C, 20) - bblower(C, 20)) / bbmid(C, 20)) <= ref(min(((bbupper(C, 20) - bblower(C, 20)) / bbmid(C, 20)), 119), -1) | 0.1203 | false |
nr7Is today an NR7 day, the narrowest range of the last 7 sessions compiled to (H > L) and ((H - L) <= ref(min(H - L, 6), -1)) | 0.1311 | false |
big5A big move either way in 5 days | 0.346 | 35% · unlikely |
vol_riseVolatility rising over 5 days | 0.482 | 48% · close to even |
What it means
For DIS on the session of 2026-10-30: Not true: A typical day moves more than 3%; Is 20-day historical volatility above 40%; Is Bollinger Band width at its lowest in 120 sessions; Is today an NR7 day, the narrowest range of the last 7 sessions. Forecasts: A big move either way in 5 days 35%; Volatility rising over 5 days 48%.
Compressed volatility before an event often precedes a larger move; the forecast says how likely a big move is, not its direction.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "DIS"
},
"questions": {
"atr": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"hv": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility above 40%?"
},
"squeeze": {
"type": "yes_no",
"instructions": "Is Bollinger Band width at its lowest in 120 sessions?"
},
"nr7": {
"type": "yes_no",
"instructions": "Is today an NR7 day, the narrowest range of the last 7 sessions?"
},
"big5": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
},
"vol_rise": {
"type": "yes_no",
"instructions": "Will volatility rise over the next 5 days?"
}
}
}Response JSON (DIS, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"atr": {
"yes_no": 0.0537,
"rule": "atr_pct(14) > 3",
"basis": "rule"
},
"hv": {
"yes_no": 0.0537,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4",
"basis": "pattern"
},
"squeeze": {
"yes_no": 0.1203,
"rule": "((bbupper(C, 20) - bblower(C, 20)) / bbmid(C, 20)) <= ref(min(((bbupper(C, 20) - bblower(C, 20)) / bbmid(C, 20)), 119), -1)",
"basis": "pattern"
},
"nr7": {
"yes_no": 0.1311,
"rule": "(H > L) and ((H - L) <= ref(min(H - L, 6), -1))",
"basis": "pattern"
},
"big5": {
"yes_no": 0.346
},
"vol_rise": {
"yes_no": 0.482
}
},
"context": {
"symbol": "DIS",
"as_of": "2026-10-30"
}
}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, Bank credit analyst, Financial journalist / media.