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

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.

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

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

State

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

Questions

recentruledays_since_earnings <= 5
Reported in the last 5 days
beat_bothEnglish → ruleDid the stock beat on both EPS and revenue last quarter?
gap_uprulelast_earnings_gap > 0
Gapped up after the last report
above_preruleC > pre_earnings_close
Holding above the pre-earnings close
bigruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
recent
Reported in the last 5 days
0.0537false
beat_both
Did the stock beat on both EPS and revenue last quarter
compiled to beat_eps_last > 0.5 and beat_revenue_last > 0.5
0.8591true
gap_up
Gapped up after the last report
0.0537false
above_pre
Holding above the pre-earnings close
0.9017true
big
Last earnings move bigger than 5%
0.9463true
up_week
Higher in a week
0.52553% · close to even

Actions

Rules on the answers decide what to send.

beat_both >= 0.6 and above_pre >= 0.6→Slackir-team
else→Emailir-team
What each action would send 1 of 2 fired · dry run, nothing sent
good_receptionwould send (dry run)Slack → ir-team
{
  "text": "JNJ (2026-10-30): beat on EPS and revenue and holding above the pre-report close (90%). Gap up 5%."
}
needs_narrativerule false: skipped

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.

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

State

{"symbol":"PG"} then KO, PEP, CL, KMB, one request each. The server fills in the latest completed session.

Questions

trendruleC > sma(C, 50)
Above the 50-day 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
momentumruleroc(C, 20) > 5
Up more than 5% in 20 sessions
wma_uprulewma(C, 10) > wma(C, 30)
10-day weighted average above the 30-day
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulestackedrulemomentumrulewma_uprulebeat_spyforecast
PG0.93750.91960.9190.9340.481
KO0.93270.910.88680.90380.535
PEP0.84820.05370.82090.89790.487
CL0.92460.64230.91440.89750.507
KMB0.85170.78320.88970.91940.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"
  }
}

ema roc sma wma

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.

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

State

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

Questions

spikeruleV > 2 * ref(avg(V, 20), -1)
Volume more than twice the previous 20-day average
rankrulepercentrank(V, 50) > 90
Volume in the top tenth of 50 sessions
medianruleV > 2 * median(V, 20)
Volume above twice the 20-day median
up_volEnglish → ruleDid the stock rise on above-average volume?
down_volEnglish → ruleDid the stock fall on above-average volume?
vol_spike_nextforecastWill volume spike tomorrow?
A volume spike tomorrow

Answers

QuestionAnswerReading
spike
Volume more than twice the previous 20-day average
0.4625on the line (false)
rank
Volume in the top tenth of 50 sessions
0.612true
median
Volume above twice the 20-day median
0.5662on the line (true)
up_vol
Did the stock rise on above-average volume
compiled to (C > C[-1]) and (V > ref(avg(V, 20), -1))
0.9338true
down_vol
Did the stock fall on above-average volume
compiled to (C < C[-1]) and (V > ref(avg(V, 20), -1))
0.0662false
vol_spike_next
A volume spike tomorrow
0.0323% · unlikely

Actions

Rules on the answers decide what to send.

spike >= 0.6 or median >= 0.6→Slackir-team
What each action would send 0 of 1 fired · dry run, nothing sent
volume_alertrule false: skipped

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

avg median offset percentrank ref

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.

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

State

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

Questions

growerEnglish → ruleHas the stock grown its dividend for 25 years in a row?
grower10ruleyears_of_growth >= 10
Ten years of dividend growth
raisedruleraised_last > 0.5
Raised its last dividend
no_cutrulecut_last < 0.5
Did not cut its last dividend
ex_soonruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
yieldEnglish → ruleIs the dividend yield above 3%?

Answers

QuestionAnswerReading
grower
Has the stock grown its dividend for 25 years in a row
compiled to years_of_growth >= 25
0.0683false
grower10
Ten years of dividend growth
0.9463true
raised
Raised its last dividend
0.1409false
no_cut
Did not cut its last dividend
0.8591true
ex_soon
Goes ex-dividend within 30 days
0.2049false
yield
Is the dividend yield above 3%
compiled to div_yield_ttm > 3
0.0537false

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.

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

State

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

Questions

engulf_bearruleengulfing_bear()
engulfing bear candle: A red body that engulfs yesterday's green body.
engulf_bullruleengulfing_bull()
engulfing bull candle: A green body that engulfs yesterday's red body.
shootingruleshooting_star()
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
dojiruledoji()
doji candle: Body at most 10% of the day's range.
marubozurulemarubozu()
marubozu candle: Body at least 90% of the range: almost no wicks.
down_weekforecastWill the stock be lower in a week?
Lower in a week

Answers

QuestionAnswerReading
engulf_bear
engulfing bear candle: A red body that engulfs yesterday's green body.
0.0997false
engulf_bull
engulfing bull candle: A green body that engulfs yesterday's red body.
0.0879false
shooting
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
0.061false
doji
doji candle: Body at most 10% of the day's range.
0.6562true
marubozu
marubozu candle: Body at least 90% of the range: almost no wicks.
0.0537false
down_week
Lower in a week
0.48549% · 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"
  }
}

doji engulfing_bear engulfing_bull marubozu shooting_star

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.

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

State

{"symbol":"JNJ"} then PFE, MRK, ABBV, one request each. The server fills in the latest completed session.

Questions

up_dayruleC > C[-1]
Closed higher than yesterday
trendEnglish → ruleIs the stock above its 200-day moving average?
bigruleabs(C - C[-1]) > 1.5 * atr(14)
Today's move was bigger than 1.5 ATR
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

Symbolup_dayruletrendrulebigruleup_weekforecastFired
JNJ0.24850.94540.05370.525none
PFE0.91530.94630.09760.555none
MRK0.85430.94630.08310.524none
ABBV0.88260.94630.05610.533none

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-team
JNJ 0 of 1 fired · dry run, nothing sent
PFE 0 of 1 fired · dry run, nothing sent
MRK 0 of 1 fired · dry run, nothing sent
ABBV 0 of 1 fired · dry run, nothing sent

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

abs atr offset sma

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.

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

State

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

Questions

intraday_highEnglish → ruleDid the stock make a new 52-week high today?
close_highEnglish → ruleDid the stock make a new 52-week closing high?
nearruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
recentrulehighestbars(H, 20) <= 3
Set its 20-day high in the last four sessions
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
intraday_high
Did the stock make a new 52-week high today
compiled to H > highest(H, 252)
0.8563true
close_high
Did the stock make a new 52-week closing high
compiled to C > highest(C, 252)
0.8001true
near
Within 2% of the 52-week high
0.709true
recent
Set its 20-day high in the last four sessions
0.7419true
rally5
A 5% rally within a month
0.54154% · 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"
  }
}

highest highestbars max

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.

ora-fin-0.1.1IBM5 questions1 action
  1. StateIBM
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

obvruleobv() > sma(obv(), 20)
On-balance volume above its 20-day average
cum_uprulecum(C > C[-1]) > cum(C < C[-1])
More up days than down days on record
mostly_uprulesum(C > C[-1], 10) >= 6
Up on at least six of the last ten days
weekly_lowrulemin(L, 5) > ref(min(L, 5), -5)
This week's low is above last week's
sign_sumrulesum(sign(C - C[-1]), 10) > 2
Net up days over the last ten sessions above two

Answers

QuestionAnswerReading
obv
On-balance volume above its 20-day average
0.8841true
cum_up
More up days than down days on record
0.9463true
mostly_up
Up on at least six of the last ten days
0.7874true
weekly_low
This week's low is above last week's
0.945true
sign_sum
Net up days over the last ten sessions above two
0.7874true

Actions

Rules on the answers decide what to send.

obv >= 0.6 and weekly_low >= 0.6→Emailir-team
What each action would send 1 of 1 fired · dry run, nothing sent
accumulationwould send (dry run)Email → ir-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."
      }
    }
  ]
}

cum min obv offset ref sign sma sum

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.

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

State

{"symbol":"HON"} then GE, MMM, one request each. The server fills in the latest completed session.

Questions

q_leaderruleroc(C, 63) > 10 and C >= 0.95 * max(H, 63)
Up more than 10% in a quarter, near the high
three_mruleC > C[-63]
Higher than three months ago
drawdownruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
linreg_uprulelinreg(C, 20) > ref(linreg(C, 20), -5)
20-day regression line rising over the last week
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symbolq_leaderrulethree_mruledrawdownrulelinreg_uprulebeat_spyforecast
HON0.05370.07040.07430.83650.463
GE0.05420.10050.70610.51940.499
MMM0.1120.37170.05370.89270.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"
  }
}

linreg max offset ref roc

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.

ora-fin-0.1.1NKE6 questions3 actions
  1. StateNKE
  2. Questions6 asked
  3. Answersreal, captured
  4. Actions3 rules · dry run

State

{"symbol":"NKE"} 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
gapdown_patrulegap_down()
gap down candle: Today's whole range is below yesterday's low.
close_toprule(C - L) / (H - L) > 0.75
Closed in the top quarter of the day's range
new_lowEnglish → ruleDid the stock make a new 20-day low today?
new_low_nextforecastWill it make a new 20-day low in the next week?
A new 20-day low next week

Answers

QuestionAnswerReading
gap_dn
Opened more than 1% below yesterday's close
0.0784false
reclaimed
Opened under yesterday's low, closed up on the day
0.0641false
gapdown_pat
gap down candle: Today's whole range is below yesterday's low.
0.058false
close_top
Closed in the top quarter of the day's range
0.0815false
new_low
Did the stock make a new 20-day low today
compiled to L < lowest(L, 20)
0.0537false
new_low_next
A new 20-day low next week
0.0384% · unlikely

Actions

Rules on the answers decide what to send.

reclaimed >= 0.6→Slackir-team
gap_dn >= 0.6→Emailir-team
else→Slackir-team
What each action would send 1 of 3 fired · dry run, nothing sent
reclaimedrule false: skipped
still_heavyrule false: skipped
no_gapwould send (dry run)Slack → ir-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%)."
      }
    }
  ]
}

gap_down lowest offset

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.

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