Use cases · Corporates
Investor relations team: 20 ways to use Ora
Watches its own stock and peers: reactions to results, volume, dividends and the narrative. Each example is a complete, runnable request with the real answers it returned (33 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 (72)
offset 8sma 6abs 3ref 3max 3lowest 3beat_eps_last 2beat_revenue_last 2last_earnings_move 2pre_earnings_close 2ema 2roc 2days_to_ex_div 2div_yield_ttm 2raised_last 2years_of_growth 2atr 2highest 2min 2days_since_earnings 1last_earnings_gap 1wma 1avg 1median 1percentrank 1cut_last 1doji 1engulfing_bear 1engulfing_bull 1marubozu 1shooting_star 1highestbars 1cum 1obv 1sign 1sum 1linreg 1gap_down 1beat_streak 1days_to_earnings 1next_report_amc 1next_report_bmo 1bblower 1bbmid 1bbupper 1inside_bar 1lowestbars 1spinning_top 1days_since_ex_div 1div_change_pct 1cci 1rsi 1willr 1barssince 1morning_star 1swinghigh 1swinglow 1three_black_crows 1hammer 1harami_bull 1inverted_hammer 1piercing_line 1div_count_ttm 1last_div_amount 1next_div_amount 1adx 1atr_pct 1diminus 1diplus 1log 1sqrt 1std 1
Examples 1–10 of 20 · page 1 of 2
Investor relations team · example 1
IR at JNJ: how did the market take our results?
The morning after earnings, the JNJ investor relations team checks the beat, the gap and whether the stock is holding above its pre-report price.
- StateJNJ
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"JNJ"} The server fills in the latest completed session.
Questions
recent | rule | days_since_earnings <= 5Reported in the last 5 days |
beat_both | English → rule | Did the stock beat on both EPS and revenue last quarter? |
gap_up | rule | last_earnings_gap > 0Gapped up after the last report |
above_pre | rule | C > pre_earnings_closeHolding above the pre-earnings close |
big | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
recentReported in the last 5 days | 0.0537 | false |
beat_bothDid the stock beat on both EPS and revenue last quarter compiled to beat_eps_last > 0.5 and beat_revenue_last > 0.5 | 0.8591 | true |
gap_upGapped up after the last report | 0.0537 | false |
above_preHolding above the pre-earnings close | 0.9017 | true |
bigLast earnings move bigger than 5% | 0.9463 | true |
up_weekHigher in a week | 0.525 | 53% · close to even |
Actions
Rules on the answers decide what to send.
beat_both >= 0.6 and above_pre >= 0.6→Slackir-teamelse→Emailir-team{
"text": "JNJ (2026-10-30): beat on EPS and revenue and holding above the pre-report close (90%). Gap up 5%."
}What it means
For JNJ on the session of 2026-10-30: True now: Did the stock beat on both EPS and revenue last quarter; Holding above the pre-earnings close; Last earnings move bigger than 5%. Not true: Reported in the last 5 days; Gapped up after the last report. Forecasts: Higher in a week 53%. Fired: good_reception (Slack → ir-team).
A beat that holds above the pre-report close is a quiet morning; anything else means the team prepares talking points before the first investor calls.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JNJ"
},
"questions": {
"recent": {
"type": "yes_no",
"ask": "days_since_earnings <= 5"
},
"beat_both": {
"type": "yes_no",
"instructions": "Did the stock beat on both EPS and revenue last quarter?"
},
"gap_up": {
"type": "yes_no",
"ask": "last_earnings_gap > 0"
},
"above_pre": {
"type": "yes_no",
"ask": "C > pre_earnings_close"
},
"big": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "good_reception",
"when": "beat_both >= 0.6 and above_pre >= 0.6",
"do": "slack",
"connection": "ir-team",
"message": "{{symbol}} ({{as_of}}): beat on EPS and revenue and holding above the pre-report close ({{above_pre|pct}}). Gap up {{gap_up|pct}}."
},
{
"id": "needs_narrative",
"when": "else",
"do": "email",
"connection": "ir-team",
"subject": "{{symbol}}: reaction needs talking points",
"message": "{{symbol}} ({{as_of}}): beat both {{beat_both|pct}}, above pre-report close {{above_pre|pct}}, big reaction {{big|pct}}. Prepare investor call notes."
}
],
"dry_run": true
}Response JSON (JNJ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"recent": {
"yes_no": 0.0537,
"rule": "days_since_earnings <= 5",
"basis": "rule"
},
"beat_both": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "pattern"
},
"gap_up": {
"yes_no": 0.0537,
"rule": "last_earnings_gap > 0",
"basis": "rule"
},
"above_pre": {
"yes_no": 0.9017,
"rule": "C > pre_earnings_close",
"basis": "rule"
},
"big": {
"yes_no": 0.9463,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
},
"up_week": {
"yes_no": 0.525
}
},
"context": {
"symbol": "JNJ",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "good_reception",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "ir-team",
"preview": {
"text": "JNJ (2026-10-30): beat on EPS and revenue and holding above the pre-report close (90%). Gap up 5%."
}
},
{
"id": "needs_narrative",
"fired": false,
"status": "skipped"
}
]
}abs beat_eps_last beat_revenue_last days_since_earnings last_earnings_gap last_earnings_move pre_earnings_close
Investor relations team · example 2
IR at PG: are we trending with our staples peers?
Ask the same trend and momentum questions of PG and its peers so the IR deck compares like with like.
- State5 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"PG"} then KO, PEP, CL, KMB, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 50)Above the 50-day 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 |
momentum | rule | roc(C, 20) > 5Up more than 5% in 20 sessions |
wma_up | rule | wma(C, 10) > wma(C, 30)10-day weighted average above the 30-day |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | stackedrule | momentumrule | wma_uprule | beat_spyforecast |
|---|---|---|---|---|---|
PG | 0.9375 | 0.9196 | 0.919 | 0.934 | 0.481 |
KO | 0.9327 | 0.91 | 0.8868 | 0.9038 | 0.535 |
PEP | 0.8482 | 0.0537 | 0.8209 | 0.8979 | 0.487 |
CL | 0.9246 | 0.6423 | 0.9144 | 0.8975 | 0.507 |
KMB | 0.8517 | 0.7832 | 0.8897 | 0.9194 | 0.52 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 5 symbols: Above the 50-day average: true for PG, KO, PEP, CL, KMB of 5. Stacked averages: close > 20 EMA > 50 > 200: true for PG, KO, CL, KMB of 5. Up more than 5% in 20 sessions: true for PG, KO, PEP, CL, KMB of 5. 10-day weighted average above the 30-day: true for PG, KO, PEP, CL, KMB of 5. Highest odds for “Beating SPY over a month”: KO at 54%.
Identical questions per ticker make a fair peer table; when the company trails its peers on trend, the narrative is company-specific rather than sector-wide.
Request JSON (PG; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "PG"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"stacked": {
"type": "yes_no",
"ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
},
"momentum": {
"type": "yes_no",
"ask": "roc(C, 20) > 5"
},
"wma_up": {
"type": "yes_no",
"ask": "wma(C, 10) > wma(C, 30)"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (PG, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9375,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"stacked": {
"yes_no": 0.9196,
"rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"momentum": {
"yes_no": 0.919,
"rule": "roc(C, 20) > 5",
"basis": "rule"
},
"wma_up": {
"yes_no": 0.934,
"rule": "wma(C, 10) > wma(C, 30)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.481
}
},
"context": {
"symbol": "PG",
"as_of": "2026-10-30"
}
}Investor relations team · example 3
IR at PEP: unusual volume in our stock today?
Flag days when PEP trades far above its usual volume so IR can check for news, block trades or activist accumulation.
- StatePEP
- Questions6 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"PEP"} The server fills in the latest completed session.
Questions
spike | rule | V > 2 * ref(avg(V, 20), -1)Volume more than twice the previous 20-day average |
rank | rule | percentrank(V, 50) > 90Volume in the top tenth of 50 sessions |
median | rule | V > 2 * median(V, 20)Volume above twice the 20-day median |
up_vol | English → rule | Did the stock rise on above-average volume? |
down_vol | English → rule | Did the stock fall on above-average volume? |
vol_spike_next | forecast | Will volume spike tomorrow? A volume spike tomorrow |
Answers
| Question | Answer | Reading |
|---|---|---|
spikeVolume more than twice the previous 20-day average | 0.4625 | on the line (false) |
rankVolume in the top tenth of 50 sessions | 0.612 | true |
medianVolume above twice the 20-day median | 0.5662 | on the line (true) |
up_volDid the stock rise on above-average volume compiled to (C > C[-1]) and (V > ref(avg(V, 20), -1)) | 0.9338 | true |
down_volDid the stock fall on above-average volume compiled to (C < C[-1]) and (V > ref(avg(V, 20), -1)) | 0.0662 | false |
vol_spike_nextA volume spike tomorrow | 0.032 | 3% · unlikely |
Actions
Rules on the answers decide what to send.
spike >= 0.6 or median >= 0.6→Slackir-teamWhat it means
For PEP on the session of 2026-10-30: True now: Volume in the top tenth of 50 sessions; Did the stock rise on above-average volume. Not true: Did the stock fall on above-average volume. On the line: Volume more than twice the previous 20-day average; Volume above twice the 20-day median. Forecasts: A volume spike tomorrow 3%. No action fired: every rule was false.
A spike with the price falling is the case to escalate to the surveillance provider; a spike on an up day is usually a news reaction worth noting in the daily log.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "PEP"
},
"questions": {
"spike": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"rank": {
"type": "yes_no",
"ask": "percentrank(V, 50) > 90"
},
"median": {
"type": "yes_no",
"ask": "V > 2 * median(V, 20)"
},
"up_vol": {
"type": "yes_no",
"instructions": "Did the stock rise on above-average volume?"
},
"down_vol": {
"type": "yes_no",
"instructions": "Did the stock fall on above-average volume?"
},
"vol_spike_next": {
"type": "yes_no",
"instructions": "Will volume spike tomorrow?"
}
},
"actions": [
{
"id": "volume_alert",
"when": "spike >= 0.6 or median >= 0.6",
"do": "slack",
"connection": "ir-team",
"message": "{{symbol}} ({{as_of}}): volume spike (2x average {{spike|pct}}, 2x median {{median|pct}}). Up on volume {{up_vol|pct}}, down on volume {{down_vol|pct}}. Check the shareholder surveillance feed."
}
],
"dry_run": true
}Response JSON (PEP, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"spike": {
"yes_no": 0.4625,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"rank": {
"yes_no": 0.612,
"rule": "percentrank(V, 50) > 90",
"basis": "rule"
},
"median": {
"yes_no": 0.5662,
"rule": "V > 2 * median(V, 20)",
"basis": "rule"
},
"up_vol": {
"yes_no": 0.9338,
"rule": "(C > C[-1]) and (V > ref(avg(V, 20), -1))",
"basis": "pattern"
},
"down_vol": {
"yes_no": 0.0662,
"rule": "(C < C[-1]) and (V > ref(avg(V, 20), -1))",
"basis": "pattern"
},
"vol_spike_next": {
"yes_no": 0.032
}
},
"context": {
"symbol": "PEP",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "volume_alert",
"fired": false,
"status": "skipped"
}
]
}Investor relations team · example 4
IR at KO: is our dividend story intact for the next call?
Before the investor call, confirm the payout record the CFO will cite: years of growth, the last raise and the next ex-date.
- StateKO
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"KO"} The server fills in the latest completed session.
Questions
grower | English → rule | Has the stock grown its dividend for 25 years in a row? |
grower10 | rule | years_of_growth >= 10Ten years of dividend growth |
raised | rule | raised_last > 0.5Raised its last dividend |
no_cut | rule | cut_last < 0.5Did not cut its last dividend |
ex_soon | rule | days_to_ex_div <= 30Goes ex-dividend within 30 days |
yield | English → rule | Is the dividend yield above 3%? |
Answers
| Question | Answer | Reading |
|---|---|---|
growerHas the stock grown its dividend for 25 years in a row compiled to years_of_growth >= 25 | 0.0683 | false |
grower10Ten years of dividend growth | 0.9463 | true |
raisedRaised its last dividend | 0.1409 | false |
no_cutDid not cut its last dividend | 0.8591 | true |
ex_soonGoes ex-dividend within 30 days | 0.2049 | false |
yieldIs the dividend yield above 3% compiled to div_yield_ttm > 3 | 0.0537 | false |
What it means
For KO on the session of 2026-10-30: True now: Ten years of dividend growth; Did not cut its last dividend. Not true: Has the stock grown its dividend for 25 years in a row; Raised its last dividend; Goes ex-dividend within 30 days; Is the dividend yield above 3%.
Every one of these is a fact from the dividend record, so IR can quote them; the call script uses only the ones that come back true.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "KO"
},
"questions": {
"grower": {
"type": "yes_no",
"instructions": "Has the stock grown its dividend for 25 years in a row?"
},
"grower10": {
"type": "yes_no",
"ask": "years_of_growth >= 10"
},
"raised": {
"type": "yes_no",
"ask": "raised_last > 0.5"
},
"no_cut": {
"type": "yes_no",
"ask": "cut_last < 0.5"
},
"ex_soon": {
"type": "yes_no",
"ask": "days_to_ex_div <= 30"
},
"yield": {
"type": "yes_no",
"instructions": "Is the dividend yield above 3%?"
}
}
}Response JSON (KO, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"grower": {
"yes_no": 0.0683,
"rule": "years_of_growth >= 25",
"basis": "pattern"
},
"grower10": {
"yes_no": 0.9463,
"rule": "years_of_growth >= 10",
"basis": "rule"
},
"raised": {
"yes_no": 0.1409,
"rule": "raised_last > 0.5",
"basis": "rule"
},
"no_cut": {
"yes_no": 0.8591,
"rule": "cut_last < 0.5",
"basis": "rule"
},
"ex_soon": {
"yes_no": 0.2049,
"rule": "days_to_ex_div <= 30",
"basis": "rule"
},
"yield": {
"yes_no": 0.0537,
"rule": "div_yield_ttm > 3",
"basis": "pattern"
}
},
"context": {
"symbol": "KO",
"as_of": "2026-10-30"
}
}cut_last days_to_ex_div div_yield_ttm raised_last years_of_growth
Investor relations team · example 5
IR at MRK: what did today's candle say after guidance?
On a guidance day, read the daily candle (engulfing, star or doji) to describe how the market closed the session.
- StateMRK
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MRK"} The server fills in the latest completed session.
Questions
engulf_bear | rule | engulfing_bear()engulfing bear candle: A red body that engulfs yesterday's green body. |
engulf_bull | rule | engulfing_bull()engulfing bull candle: A green body that engulfs yesterday's red body. |
shooting | rule | shooting_star()shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise. |
doji | rule | doji()doji candle: Body at most 10% of the day's range. |
marubozu | rule | marubozu()marubozu candle: Body at least 90% of the range: almost no wicks. |
down_week | forecast | Will the stock be lower in a week? Lower in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
engulf_bearengulfing bear candle: A red body that engulfs yesterday's green body. | 0.0997 | false |
engulf_bullengulfing bull candle: A green body that engulfs yesterday's red body. | 0.0879 | false |
shootingshooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise. | 0.061 | false |
dojidoji candle: Body at most 10% of the day's range. | 0.6562 | true |
marubozumarubozu candle: Body at least 90% of the range: almost no wicks. | 0.0537 | false |
down_weekLower in a week | 0.485 | 49% · close to even |
What it means
For MRK on the session of 2026-10-30: True now: doji candle: Body at most 10% of the day's range.. Not true: engulfing bear candle: A red body that engulfs yesterday's green body.; engulfing bull candle: A green body that engulfs yesterday's red body.; shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.; marubozu candle: Body at least 90% of the range: almost no wicks.. Forecasts: Lower in a week 49%.
A bearish engulfing or shooting star on guidance day says sellers controlled the close; a doji says the market is undecided and the follow-up messaging matters.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MRK"
},
"questions": {
"engulf_bear": {
"type": "yes_no",
"ask": "engulfing_bear()"
},
"engulf_bull": {
"type": "yes_no",
"ask": "engulfing_bull()"
},
"shooting": {
"type": "yes_no",
"ask": "shooting_star()"
},
"doji": {
"type": "yes_no",
"ask": "doji()"
},
"marubozu": {
"type": "yes_no",
"ask": "marubozu()"
},
"down_week": {
"type": "yes_no",
"instructions": "Will the stock be lower in a week?"
}
}
}Response JSON (MRK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"engulf_bear": {
"yes_no": 0.0997,
"rule": "engulfing_bear()",
"basis": "rule"
},
"engulf_bull": {
"yes_no": 0.0879,
"rule": "engulfing_bull()",
"basis": "rule"
},
"shooting": {
"yes_no": 0.061,
"rule": "shooting_star()",
"basis": "rule"
},
"doji": {
"yes_no": 0.6562,
"rule": "doji()",
"basis": "rule"
},
"marubozu": {
"yes_no": 0.0537,
"rule": "marubozu()",
"basis": "rule"
},
"down_week": {
"yes_no": 0.485
}
},
"context": {
"symbol": "MRK",
"as_of": "2026-10-30"
}
}Investor relations team · example 6
A daily post-close IR digest for JNJ and peers
Every weekday after the close, the IR channel gets the same short read on JNJ, PFE, MRK and ABBV.
- ScheduleMon–Fri at 16:30 ET
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"JNJ"} then PFE, MRK, ABBV, one request each. The server fills in the latest completed session.
Questions
up_day | rule | C > C[-1]Closed higher than yesterday |
trend | English → rule | Is the stock above its 200-day moving average? |
big | rule | abs(C - C[-1]) > 1.5 * atr(14)Today's move was bigger than 1.5 ATR |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Symbol | up_dayrule | trendrule | bigrule | up_weekforecast | Fired |
|---|---|---|---|---|---|
JNJ | 0.2485 | 0.9454 | 0.0537 | 0.525 | none |
PFE | 0.9153 | 0.9463 | 0.0976 | 0.555 | none |
MRK | 0.8543 | 0.9463 | 0.0831 | 0.524 | none |
ABBV | 0.8826 | 0.9463 | 0.0561 | 0.533 | none |
true false not known for rules; forecasts are odds. Hover a column for its question.
Actions
Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.
big >= 0.6→Slackir-teamWhat it means
Session of 2026-10-30, 4 symbols: Closed higher than yesterday: true for PFE, MRK, ABBV of 4. Is the stock above its 200-day moving average: true for JNJ, PFE, MRK, ABBV of 4. Today's move was bigger than 1.5 ATR: true for none of 4. Highest odds for “Higher in a week”: PFE at 56%. digest_line fired for none.
The workflow posts only for names that had an outsized day, so the channel stays quiet on ordinary sessions.
As a scheduled workflow (Mon–Fri at 16:30 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 daily post-close IR digest for JNJ and peers",
"symbols": "JNJ PFE MRK ABBV",
"days": [
1,
2,
3,
4,
5
],
"at_time": "16:30",
"model": "ora-fin-0.1.1",
"questions": {
"up_day": {
"type": "yes_no",
"ask": "C > C[-1]"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"big": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "digest_line",
"when": "big >= 0.6",
"do": "slack",
"connection": "ir-team",
"message": "{{symbol}} ({{as_of}}): moved more than 1.5 ATR today (up day {{up_day|pct}}). Above 200-day {{trend|pct}}."
}
]
}Request JSON (JNJ; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JNJ"
},
"questions": {
"up_day": {
"type": "yes_no",
"ask": "C > C[-1]"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"big": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "digest_line",
"when": "big >= 0.6",
"do": "slack",
"connection": "ir-team",
"message": "{{symbol}} ({{as_of}}): moved more than 1.5 ATR today (up day {{up_day|pct}}). Above 200-day {{trend|pct}}."
}
],
"dry_run": true
}Response JSON (JNJ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"up_day": {
"yes_no": 0.2485,
"rule": "C > C[-1]",
"basis": "rule"
},
"trend": {
"yes_no": 0.9454,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"big": {
"yes_no": 0.0537,
"rule": "abs(C - C[-1]) > 1.5 * atr(14)",
"basis": "rule"
},
"up_week": {
"yes_no": 0.525
}
},
"context": {
"symbol": "JNJ",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "digest_line",
"fired": false,
"status": "skipped"
}
]
}Investor relations team · example 7
IR at ABBV: can we say the stock hit a 52-week high?
Before a press mention or a board note, check the exact claim: a new 52-week high today, a closing high, or just near it.
- StateABBV
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"ABBV"} The server fills in the latest completed session.
Questions
intraday_high | English → rule | Did the stock make a new 52-week high today? |
close_high | English → rule | Did the stock make a new 52-week closing high? |
near | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
recent | rule | highestbars(H, 20) <= 3Set its 20-day high in the last four sessions |
rally5 | forecast | Will it rally at least 5% at some point in the next month? A 5% rally within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
intraday_highDid the stock make a new 52-week high today compiled to H > highest(H, 252) | 0.8563 | true |
close_highDid the stock make a new 52-week closing high compiled to C > highest(C, 252) | 0.8001 | true |
nearWithin 2% of the 52-week high | 0.709 | true |
recentSet its 20-day high in the last four sessions | 0.7419 | true |
rally5A 5% rally within a month | 0.541 | 54% · close to even |
What it means
For ABBV on the session of 2026-10-30: True now: 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; Set its 20-day high in the last four sessions. Forecasts: A 5% rally within a month 54%.
Only a true rule supports the exact wording; near the high is a different claim from a new high, and IR picks the sentence that matches.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "ABBV"
},
"questions": {
"intraday_high": {
"type": "yes_no",
"instructions": "Did the stock make a new 52-week high today?"
},
"close_high": {
"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)"
},
"recent": {
"type": "yes_no",
"ask": "highestbars(H, 20) <= 3"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
}
}Response JSON (ABBV, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"intraday_high": {
"yes_no": 0.8563,
"rule": "H > highest(H, 252)",
"basis": "pattern"
},
"close_high": {
"yes_no": 0.8001,
"rule": "C > highest(C, 252)",
"basis": "pattern"
},
"near": {
"yes_no": 0.709,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"recent": {
"yes_no": 0.7419,
"rule": "highestbars(H, 20) <= 3",
"basis": "rule"
},
"rally5": {
"yes_no": 0.541
}
},
"context": {
"symbol": "ABBV",
"as_of": "2026-10-30"
}
}Investor relations team · example 8
IR at IBM: signs of quiet accumulation?
Look for steady buying without news: rising on-balance volume, more up days than down and higher weekly lows.
- StateIBM
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"IBM"} The server fills in the latest completed session.
Questions
obv | rule | obv() > sma(obv(), 20)On-balance volume above its 20-day average |
cum_up | rule | cum(C > C[-1]) > cum(C < C[-1])More up days than down days on record |
mostly_up | rule | sum(C > C[-1], 10) >= 6Up on at least six of the last ten days |
weekly_low | rule | min(L, 5) > ref(min(L, 5), -5)This week's low is above last week's |
sign_sum | rule | sum(sign(C - C[-1]), 10) > 2Net up days over the last ten sessions above two |
Answers
| Question | Answer | Reading |
|---|---|---|
obvOn-balance volume above its 20-day average | 0.8841 | true |
cum_upMore up days than down days on record | 0.9463 | true |
mostly_upUp on at least six of the last ten days | 0.7874 | true |
weekly_lowThis week's low is above last week's | 0.945 | true |
sign_sumNet up days over the last ten sessions above two | 0.7874 | true |
Actions
Rules on the answers decide what to send.
obv >= 0.6 and weekly_low >= 0.6→Emailir-team{
"subject": "IBM: possible accumulation pattern",
"text": "IBM (2026-10-30): OBV rising 88%, higher weekly low 94%, net up days 79%. Ask the surveillance provider for a register update."
}What it means
For IBM on the session of 2026-10-30: True now: On-balance volume above its 20-day average; More up days than down days on record; Up on at least six of the last ten days; This week's low is above last week's; Net up days over the last ten sessions above two. Fired: accumulation (Email → ir-team).
These are price-and-volume facts, not ownership data; a match is a reason to ask the shareholder-ID provider, not a conclusion.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "IBM"
},
"questions": {
"obv": {
"type": "yes_no",
"ask": "obv() > sma(obv(), 20)"
},
"cum_up": {
"type": "yes_no",
"ask": "cum(C > C[-1]) > cum(C < C[-1])"
},
"mostly_up": {
"type": "yes_no",
"ask": "sum(C > C[-1], 10) >= 6"
},
"weekly_low": {
"type": "yes_no",
"ask": "min(L, 5) > ref(min(L, 5), -5)"
},
"sign_sum": {
"type": "yes_no",
"ask": "sum(sign(C - C[-1]), 10) > 2"
}
},
"actions": [
{
"id": "accumulation",
"when": "obv >= 0.6 and weekly_low >= 0.6",
"do": "email",
"connection": "ir-team",
"subject": "{{symbol}}: possible accumulation pattern",
"message": "{{symbol}} ({{as_of}}): OBV rising {{obv|pct}}, higher weekly low {{weekly_low|pct}}, net up days {{sign_sum|pct}}. Ask the surveillance provider for a register update."
}
],
"dry_run": true
}Response JSON (IBM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"obv": {
"yes_no": 0.8841,
"rule": "obv() > sma(obv(), 20)",
"basis": "rule"
},
"cum_up": {
"yes_no": 0.9463,
"rule": "cum(C > C[-1]) > cum(C < C[-1])",
"basis": "rule"
},
"mostly_up": {
"yes_no": 0.7874,
"rule": "sum(C > C[-1], 10) >= 6",
"basis": "rule"
},
"weekly_low": {
"yes_no": 0.945,
"rule": "min(L, 5) > ref(min(L, 5), -5)",
"basis": "rule"
},
"sign_sum": {
"yes_no": 0.7874,
"rule": "sum(sign(C - C[-1]), 10) > 2",
"basis": "rule"
}
},
"context": {
"symbol": "IBM",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "accumulation",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "ir-team",
"preview": {
"subject": "IBM: possible accumulation pattern",
"text": "IBM (2026-10-30): OBV rising 88%, higher weekly low 94%, net up days 79%. Ask the surveillance provider for a register update."
}
}
]
}Investor relations team · example 9
IR at HON: are we lagging GE and MMM?
Compare HON with industrial peers on three-month momentum, trend and drawdown to anticipate investor questions.
- State3 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"HON"} then GE, MMM, one request each. The server fills in the latest completed session.
Questions
q_leader | rule | roc(C, 63) > 10 and C >= 0.95 * max(H, 63)Up more than 10% in a quarter, near the high |
three_m | rule | C > C[-63]Higher than three months ago |
drawdown | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
linreg_up | rule | linreg(C, 20) > ref(linreg(C, 20), -5)20-day regression line rising over the last week |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | q_leaderrule | three_mrule | drawdownrule | linreg_uprule | beat_spyforecast |
|---|---|---|---|---|---|
HON | 0.0537 | 0.0704 | 0.0743 | 0.8365 | 0.463 |
GE | 0.0542 | 0.1005 | 0.7061 | 0.5194 | 0.499 |
MMM | 0.112 | 0.3717 | 0.0537 | 0.8927 | 0.483 |
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: Up more than 10% in a quarter, near the high: true for none of 3. Higher than three months ago: true for none of 3. More than 20% off the 52-week high: true for GE of 3. 20-day regression line rising over the last week: true for HON, MMM of 3. Highest odds for “Beating SPY over a month”: GE at 50%.
If peers are quarter leaders and the company is not, expect relative-performance questions on the next call.
Request JSON (HON; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "HON"
},
"questions": {
"q_leader": {
"type": "yes_no",
"ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
},
"three_m": {
"type": "yes_no",
"ask": "C > C[-63]"
},
"drawdown": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"linreg_up": {
"type": "yes_no",
"ask": "linreg(C, 20) > ref(linreg(C, 20), -5)"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (HON, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"q_leader": {
"yes_no": 0.0537,
"rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
"basis": "rule"
},
"three_m": {
"yes_no": 0.0704,
"rule": "C > C[-63]",
"basis": "rule"
},
"drawdown": {
"yes_no": 0.0743,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"linreg_up": {
"yes_no": 0.8365,
"rule": "linreg(C, 20) > ref(linreg(C, 20), -5)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.463
}
},
"context": {
"symbol": "HON",
"as_of": "2026-10-30"
}
}Investor relations team · example 10
IR at NKE: did the gap down get bought?
After a gap down on news, see whether buyers reclaimed it by the close and whether the stock is still at its lows.
- StateNKE
- Questions6 asked
- Answersreal, captured
- Actions3 rules · dry run
State
{"symbol":"NKE"} 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 |
gapdown_pat | rule | gap_down()gap down candle: Today's whole range is below yesterday's low. |
close_top | rule | (C - L) / (H - L) > 0.75Closed in the top quarter of the day's range |
new_low | English → rule | Did the stock make a new 20-day low today? |
new_low_next | forecast | Will it make a new 20-day low in the next week? A new 20-day low next week |
Answers
| Question | Answer | Reading |
|---|---|---|
gap_dnOpened more than 1% below yesterday's close | 0.0784 | false |
reclaimedOpened under yesterday's low, closed up on the day | 0.0641 | false |
gapdown_patgap down candle: Today's whole range is below yesterday's low. | 0.058 | false |
close_topClosed in the top quarter of the day's range | 0.0815 | false |
new_lowDid the stock make a new 20-day low today compiled to L < lowest(L, 20) | 0.0537 | false |
new_low_nextA new 20-day low next week | 0.038 | 4% · unlikely |
Actions
Rules on the answers decide what to send.
reclaimed >= 0.6→Slackir-teamgap_dn >= 0.6→Emailir-teamelse→Slackir-team{
"text": "NKE (2026-10-30): no 1% gap down today (8%)."
}What it means
For NKE 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; gap down candle: Today's whole range is below yesterday's low.; Closed in the top quarter of the day's range; Did the stock make a new 20-day low today. Forecasts: A new 20-day low next week 4%. Fired: no_gap (Slack → ir-team).
A reclaimed gap means the market looked through the news; an unreclaimed one at new lows is when IR schedules calls with top holders.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NKE"
},
"questions": {
"gap_dn": {
"type": "yes_no",
"ask": "O < C[-1] * 0.99"
},
"reclaimed": {
"type": "yes_no",
"ask": "O < L[-1] and C > C[-1]"
},
"gapdown_pat": {
"type": "yes_no",
"ask": "gap_down()"
},
"close_top": {
"type": "yes_no",
"ask": "(C - L) / (H - L) > 0.75"
},
"new_low": {
"type": "yes_no",
"instructions": "Did the stock make a new 20-day low today?"
},
"new_low_next": {
"type": "yes_no",
"instructions": "Will it make a new 20-day low in the next week?"
}
},
"actions": [
{
"id": "reclaimed",
"when": "reclaimed >= 0.6",
"do": "slack",
"connection": "ir-team",
"message": "{{symbol}} ({{as_of}}): gap down reclaimed by the close ({{reclaimed|pct}}). Closed in the top quarter {{close_top|pct}}."
},
{
"id": "still_heavy",
"when": "gap_dn >= 0.6",
"do": "email",
"connection": "ir-team",
"subject": "{{symbol}}: gap down not reclaimed",
"message": "{{symbol}} ({{as_of}}): gapped down over 1% and did not reclaim. New 20-day low {{new_low|pct}}; odds of another in a week {{new_low_next|pct}}."
},
{
"id": "no_gap",
"when": "else",
"do": "slack",
"connection": "ir-team",
"message": "{{symbol}} ({{as_of}}): no 1% gap down today ({{gap_dn|pct}})."
}
],
"dry_run": true
}Response JSON (NKE, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"gap_dn": {
"yes_no": 0.0784,
"rule": "O < C[-1] * 0.99",
"basis": "rule"
},
"reclaimed": {
"yes_no": 0.0641,
"rule": "O < L[-1] and C > C[-1]",
"basis": "rule"
},
"gapdown_pat": {
"yes_no": 0.058,
"rule": "gap_down()",
"basis": "rule"
},
"close_top": {
"yes_no": 0.0815,
"rule": "(C - L) / (H - L) > 0.75",
"basis": "rule"
},
"new_low": {
"yes_no": 0.0537,
"rule": "L < lowest(L, 20)",
"basis": "pattern"
},
"new_low_next": {
"yes_no": 0.038
}
},
"context": {
"symbol": "NKE",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "reclaimed",
"fired": false,
"status": "skipped"
},
{
"id": "still_heavy",
"fired": false,
"status": "skipped"
},
{
"id": "no_gap",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "ir-team",
"preview": {
"text": "NKE (2026-10-30): no 1% gap down today (8%)."
}
}
]
}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: Corporate treasury, CFO office, Bank credit analyst, Financial journalist / media.