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

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.

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

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

State

{"symbol":"HD"} then LOW, one request each. The server fills in the latest completed session.

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
stackedruleC > 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_leaderruleroc(C, 63) > 10 and C >= 0.95 * max(H, 63)
Up more than 10% in a quarter, near the high
drawdownruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulestackedruleq_leaderruledrawdownrulebeat_spyforecast
HD0.44550.05370.11420.12820.504
LOW0.10120.05370.07270.92470.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"
  }
}

ema max roc sma

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.

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

State

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

Questions

recentruledays_since_earnings <= 5
Reported in the last 5 days
gapEnglish → ruleDid the stock gap up after its last earnings?
fellEnglish → ruleDid the stock fall after its last earnings report?
bigEnglish → ruleWas the last earnings reaction bigger than 5%?
above_preEnglish → ruleIs the stock trading above its pre-earnings price?
down_weekforecastWill the stock be lower in a week?
Lower in a week

Answers

QuestionAnswerReading
recent
Reported in the last 5 days
0.1033false
gap
Did the stock gap up after its last earnings
compiled to last_earnings_gap > 0
0.0537false
fell
Did the stock fall after its last earnings report
compiled to last_earnings_move < 0
0.9463true
big
Was the last earnings reaction bigger than 5%
compiled to abs(last_earnings_move) > 5
0.0537false
above_pre
Is the stock trading above its pre-earnings price
compiled to C > pre_earnings_close
0.8864true
down_week
Lower in a week
0.48749% · close to even

Actions

Rules on the answers decide what to send.

fell >= 0.6 and big >= 0.6→Emailcfo
else→Slackcfo-office
What each action would send 1 of 2 fired · dry run, nothing sent
negativerule false: skipped
containedwould send (dry run)Slack → cfo-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.

ora-fin-0.1.1CVX6 questions
  1. StateCVX
  2. Questions6 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

trendEnglish → ruleIs the stock above its 50-day moving average?
stretchedEnglish → ruleIs the stock more than 10% above its 200-day moving average?
drawdownruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
yearsEnglish → ruleHas the stock grown its dividend for 10 years in a row?
yieldEnglish → ruleIs the dividend yield above 3%?
raise_nextforecastWill the company raise its dividend next year?
Raising the dividend next year

Answers

QuestionAnswerReading
trend
Is the stock above its 50-day moving average
compiled to C > sma(C, 50)
0.9463true
stretched
Is the stock more than 10% above its 200-day moving average
compiled to C > sma(C, 200) * 1.1
0.9463true
drawdown
More than 20% off the 52-week high
0.0537false
years
Has the stock grown its dividend for 10 years in a row
compiled to years_of_growth >= 10
0.1409false
yield
Is the dividend yield above 3%
compiled to div_yield_ttm > 3
0.4906on the line (false)
raise_next
Raising the dividend next year
0.56356% · 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"
  }
}

div_yield_ttm max sma years_of_growth

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.

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

State

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

Questions

beatEnglish → ruleDid the stock beat EPS estimates last quarter?
streakEnglish → ruleHas the stock beaten EPS estimates in at least 3 of the last 4 quarters?
eps_yoyEnglish → ruleIs EPS up year over year?
rev_gEnglish → ruleDid revenue grow more than 5% year over year?
beat_nextforecastWill the stock beat earnings next quarter?
Beating earnings next quarter

Answers

Symbolbeatrulestreakruleeps_yoyrulerev_grulebeat_nextforecastFired
NKE0.85910.85910.37240.05370.567scorecard_row
LULU0.85910.85910.05370.05370.42scorecard_row
TGT0.85910.85910.94630.94630.503scorecard_row
ULTA0.85910.550.94630.94630.516scorecard_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
NKE 1 of 1 fired · dry run, nothing sent
scorecard_rowwould send (dry run)Webhook → fpna-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
}
LULU 1 of 1 fired · dry run, nothing sent
scorecard_rowwould send (dry run)Webhook → fpna-zapier
{
  "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
}
TGT 1 of 1 fired · dry run, nothing sent
scorecard_rowwould send (dry run)Webhook → fpna-zapier
{
  "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
}
ULTA 1 of 1 fired · dry run, nothing sent
scorecard_rowwould send (dry run)Webhook → fpna-zapier
{
  "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.

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

State

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

Questions

split_3yruledays_since_split <= 1095
Split in the last three years
ratioEnglish → ruleWas the last split at least 2-for-1?
multirulesplits_5y >= 2
Two or more splits in five years
announcedEnglish → ruleIs a stock split coming up?
trendruleC > sma(C, 50)
Above the 50-day average

Answers

Symbolsplit_3yruleratiorulemultiruleannouncedruletrendrule
COST0.05370.550.06830.05370.9336
WMT0.94630.93170.14090.05370.9358
NVDA0.94630.94630.14090.05370.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.

ora-fin-0.1.14 symbols, one request each4 questions1 actionworkflow · Mon at 07:00 ET
  1. ScheduleMon at 07:00 ET
  2. State4 symbols
  3. Questions4 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

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

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
up_monthEnglish → ruleIs the stock up over the last month?
vol_upforecastWill volatility be higher over the next month?
Higher volatility next month
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symboltrendruleup_monthrulevol_upforecastdrop5forecastFired
SPY0.94510.22380.690.203brief
QQQ0.79870.06640.5230.443brief
IWM0.55640.52360.5080.234brief
TLT0.11270.92980.5830.164brief

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
SPY 1 of 1 fired · dry run, nothing sent
briefwould send (dry run)Email → cfo
{
  "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%."
}
QQQ 1 of 1 fired · dry run, nothing sent
briefwould send (dry run)Email → cfo
{
  "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%."
}
IWM 1 of 1 fired · dry run, nothing sent
briefwould send (dry run)Email → cfo
{
  "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%."
}
TLT 1 of 1 fired · dry run, nothing sent
briefwould send (dry run)Email → cfo
{
  "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%."
      }
    }
  ]
}

offset sma

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.

ora-fin-0.1.1PFE6 questions
  1. StatePFE
  2. Questions6 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

gap_dnruleO < C[-1] * 0.99
Opened more than 1% below yesterday's close
reclaimedruleO < L[-1] and C > C[-1]
Opened under yesterday's low, closed up on the day
outsideruleoutside_bar()
outside bar candle: Today's high above yesterday's and low below it.
below_supruleC < swinglow(5, 1)
Closed below its last swing low
down_volruleC < C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Down on heavy volume
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
gap_dn
Opened more than 1% below yesterday's close
0.0537false
reclaimed
Opened under yesterday's low, closed up on the day
0.0537false
outside
outside bar candle: Today's high above yesterday's and low below it.
0.0818false
below_sup
Closed below its last swing low
0.0743false
down_vol
Down on heavy volume
0.0847false
drop5
A 5% drawdown within a month
0.41842% · 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"
  }
}

avg offset outside_bar ref swinglow

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.

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

State

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

Questions

trendruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
liquidruleavg(C * V, 20) > 100000000
Trades more than $100 million a day
calmEnglish → ruleIs 20-day historical volatility below 20%?
earn_soonruledays_to_earnings <= 10
Reports earnings within 10 days
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

QuestionAnswerReading
trend
Stacked averages: close > 20 EMA > 50 > 200
0.1048false
near_high
Within 2% of the 52-week high
0.0537false
liquid
Trades more than $100 million a day
0.9463true
calm
Is 20-day historical volatility below 20%
compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2
0.0537false
earn_soon
Reports earnings within 10 days
0.9317true
drop10
A 10% drawdown within a month
0.76376% · likely

Actions

Rules on the answers decide what to send.

trend >= 0.6 and near_high >= 0.6 and earn_soon < 0.4→Emailcfo
else→Slackcfo-office
What each action would send 1 of 2 fired · dry run, nothing sent
window_openrule false: skipped
window_closedwould send (dry run)Slack → cfo-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%)."
      }
    }
  ]
}

avg days_to_earnings ema log max offset sma sqrt std

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.

ora-fin-0.1.16 symbols, one request each4 questions
  1. State6 symbols
  2. Questions4 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
momruleroc(C, 20) > 5
Up more than 5% in 20 sessions
rsirulersi(C, 14) > 50
RSI above 50
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulemomrulersirulebeat_spyforecast
XLK0.07760.05370.09570.498
XLV0.94470.91570.94150.534
XLF0.66920.6060.79290.448
XLE0.94320.8970.93180.55
XLP0.93260.90490.90350.498
XLI0.19750.07250.25920.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"
  }
}

roc rsi sma

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.

ora-fin-0.1.1DIS6 questions
  1. StateDIS
  2. Questions6 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

atrruleatr_pct(14) > 3
A typical day moves more than 3%
hvEnglish → ruleIs 20-day historical volatility above 40%?
squeezeEnglish → ruleIs Bollinger Band width at its lowest in 120 sessions?
nr7English → ruleIs today an NR7 day, the narrowest range of the last 7 sessions?
big5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days
vol_riseforecastWill volatility rise over the next 5 days?
Volatility rising over 5 days

Answers

QuestionAnswerReading
atr
A typical day moves more than 3%
0.0537false
hv
Is 20-day historical volatility above 40%
compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4
0.0537false
squeeze
Is 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.1203false
nr7
Is 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.1311false
big5
A big move either way in 5 days
0.34635% · unlikely
vol_rise
Volatility rising over 5 days
0.48248% · 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"
  }
}

atr_pct bblower bbmid bbupper log min offset ref sqrt std

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.

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