Use cases · Buy side
Family office: 20 ways to use Ora
A concentrated, multi-asset book with a small team: watch everything, act on exceptions. Each example is a complete, runnable request with the real answers it returned (48 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 (50)
sma 13offset 5max 5atr 5log 4sqrt 4std 4roc 4beat_eps_last 3lowest 3avg 3highest 3beat_revenue_last 2doji 2min 2rsi 2outside_bar 2swinghigh 2swinglow 2ref 2raised_last 1years_of_growth 1adx 1diminus 1diplus 1macd 1macdsignal 1revenue_growth_yoy 1mean 1median 1crossup 1eps_growth_yoy 1last_earnings_gap 1pre_earnings_close 1gravestone_doji 1inside_bar 1marubozu 1spinning_top 1ema 1bblower 1bbmid 1bbupper 1cut_last 1days_to_ex_div 1div_ttm 1div_yield_ttm 1pays_dividend 1atr_pct 1cci 1abs 1
Examples 1–10 of 20 · page 1 of 2
Family office · example 1
Monitoring a legacy JNJ stake for the family
The family holds a large, low-basis JNJ position; watch trend, dividend and earnings so the principals hear about changes first.
- StateJNJ
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"JNJ"} The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
grow | rule | years_of_growth >= 10Ten years of dividend growth |
raised | rule | raised_last > 0.5Raised its last dividend |
beat | English → rule | Did the stock beat EPS estimates last quarter? |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
trendIs the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.9454 | true |
growTen years of dividend growth | 0.9463 | true |
raisedRaised its last dividend | 0.1409 | false |
beatDid the stock beat EPS estimates last quarter compiled to beat_eps_last > 0.5 | 0.8591 | true |
drop10A 10% drawdown within a month | 0.461 | 46% · close to even |
Actions
Rules on the answers decide what to send.
trend < 0.4 or raised < 0.4→Emailprincipals{
"subject": "Legacy stake update: JNJ",
"text": "JNJ (2026-10-30): above the 200-day 95%, raised last dividend 14%, beat last quarter 86%. 10% drawdown odds 46%."
}What it means
For JNJ on the session of 2026-10-30: True now: Is the stock above its 200-day moving average; Ten years of dividend growth; Did the stock beat EPS estimates last quarter. Not true: Raised its last dividend. Forecasts: A 10% drawdown within a month 46%. Fired: principal_note (Email → principals).
The principals get a note only when the trend or the dividend raise breaks; a low-basis stake is not traded on noise.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JNJ"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"grow": {
"type": "yes_no",
"ask": "years_of_growth >= 10"
},
"raised": {
"type": "yes_no",
"ask": "raised_last > 0.5"
},
"beat": {
"type": "yes_no",
"instructions": "Did the stock beat EPS estimates last quarter?"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
},
"actions": [
{
"id": "principal_note",
"when": "trend < 0.4 or raised < 0.4",
"do": "email",
"connection": "principals",
"subject": "Legacy stake update: {{symbol}}",
"message": "{{symbol}} ({{as_of}}): above the 200-day {{trend|pct}}, raised last dividend {{raised|pct}}, beat last quarter {{beat|pct}}. 10% drawdown odds {{drop10|pct}}."
}
],
"dry_run": true
}Response JSON (JNJ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9454,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"grow": {
"yes_no": 0.9463,
"rule": "years_of_growth >= 10",
"basis": "rule"
},
"raised": {
"yes_no": 0.1409,
"rule": "raised_last > 0.5",
"basis": "rule"
},
"beat": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5",
"basis": "pattern"
},
"drop10": {
"yes_no": 0.461
}
},
"context": {
"symbol": "JNJ",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "principal_note",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "principals",
"preview": {
"subject": "Legacy stake update: JNJ",
"text": "JNJ (2026-10-30): above the 200-day 95%, raised last dividend 14%, beat last quarter 86%. 10% drawdown odds 46%."
}
}
]
}Family office · example 2
One morning read across the family's whole book
Before the open each weekday, run the same three checks on every liquid holding and post exceptions to the team channel.
- ScheduleMon–Fri at 08:45 ET
- State6 symbols
- Questions3 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"SPY"} then TLT, GLD, VNQ, EEM, IBIT, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
breakdown | rule | C < lowest(L, 20)Closed under the 20-day low |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | trendrule | breakdownrule | drop5forecast | Fired |
|---|---|---|---|---|
SPY | 0.9451 | 0.6271 | 0.203 | exception |
TLT | 0.1127 | 0.0537 | 0.164 | none |
GLD | 0.0537 | 0.7286 | 0.435 | exception |
VNQ | 0.6285 | 0.0537 | 0.218 | none |
EEM | 0.1449 | 0.5678 | 0.422 | none |
IBIT | 0.7234 | 0.7342 | 0.566 | exception |
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.
breakdown >= 0.6 or drop5 >= 0.55→Slackfo-investments{
"text": "SPY (2026-10-30): exception. 20-day breakdown 63%, 5% drawdown odds 20%, above 200-day 95%."
}{
"text": "GLD (2026-10-30): exception. 20-day breakdown 73%, 5% drawdown odds 44%, above 200-day 5%."
}{
"text": "IBIT (2026-10-30): exception. 20-day breakdown 73%, 5% drawdown odds 57%, above 200-day 72%."
}What it means
Session of 2026-10-30, 6 symbols: Is the stock above its 200-day moving average: true for SPY, VNQ, IBIT of 6. Closed under the 20-day low: true for SPY, GLD, IBIT of 6. Highest odds for “A 5% drawdown within a month”: IBIT at 57%. exception fired for SPY, GLD, IBIT.
A small team cannot watch six asset classes all day; the workflow posts only the exceptions, so a quiet channel means nothing broke.
As a scheduled workflow (Mon–Fri at 08:45 ET)
Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.
{
"name": "One morning read across the family's whole book",
"symbols": "SPY TLT GLD VNQ EEM IBIT",
"days": [
1,
2,
3,
4,
5
],
"at_time": "08:45",
"model": "ora-fin-0.1.1",
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"breakdown": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "exception",
"when": "breakdown >= 0.6 or drop5 >= 0.55",
"do": "slack",
"connection": "fo-investments",
"message": "{{symbol}} ({{as_of}}): exception. 20-day breakdown {{breakdown|pct}}, 5% drawdown odds {{drop5|pct}}, above 200-day {{trend|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?"
},
"breakdown": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "exception",
"when": "breakdown >= 0.6 or drop5 >= 0.55",
"do": "slack",
"connection": "fo-investments",
"message": "{{symbol}} ({{as_of}}): exception. 20-day breakdown {{breakdown|pct}}, 5% drawdown odds {{drop5|pct}}, above 200-day {{trend|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"
},
"breakdown": {
"yes_no": 0.6271,
"rule": "C < lowest(L, 20)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.203
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "exception",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "fo-investments",
"preview": {
"text": "SPY (2026-10-30): exception. 20-day breakdown 63%, 5% drawdown odds 20%, above 200-day 95%."
}
}
]
}Family office · example 3
Bitcoin allocation through IBIT: volatility and trend
The family keeps a small bitcoin sleeve via the spot ETF; check trend and volatility before topping it up.
- StateIBIT
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"IBIT"} The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 50-day moving average? |
hv | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
adx | rule | adx(14) > 20 and diplus(14) > diminus(14)Trending up (ADX over 20 and +DI over −DI) |
macd | English → rule | Is the MACD line above its signal line? |
rally10 | forecast | Will it rally at least 10% at some point in the next month? A 10% rally within a month |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
trendIs the stock above its 50-day moving average compiled to C > sma(C, 50) | 0.1649 | false |
hvAnnualized 20-day volatility above 40% | 0.1239 | false |
adxTrending up (ADX over 20 and +DI over −DI) | 0.1265 | false |
macdIs the MACD line above its signal line compiled to macd(C) > macdsignal(C) | 0.1377 | false |
rally10A 10% rally within a month | 0.64 | 64% · likely |
drop10A 10% drawdown within a month | 0.566 | 57% · close to even |
What it means
For IBIT on the session of 2026-10-30: Not true: Is the stock above its 50-day moving average; Annualized 20-day volatility above 40%; Trending up (ADX over 20 and +DI over −DI); Is the MACD line above its signal line. Forecasts: A 10% rally within a month 64%; A 10% drawdown within a month 57%.
Bitcoin's volatility makes both ten-percent forecasts meaningful; the trend rules decide whether a top-up chases a falling sleeve.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "IBIT"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 50-day moving average?"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"adx": {
"type": "yes_no",
"ask": "adx(14) > 20 and diplus(14) > diminus(14)"
},
"macd": {
"type": "yes_no",
"instructions": "Is the MACD line above its signal line?"
},
"rally10": {
"type": "yes_no",
"instructions": "Will it rally at least 10% at some point in the next month?"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
}
}Response JSON (IBIT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.1649,
"rule": "C > sma(C, 50)",
"basis": "comparison"
},
"hv": {
"yes_no": 0.1239,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
"basis": "rule"
},
"adx": {
"yes_no": 0.1265,
"rule": "adx(14) > 20 and diplus(14) > diminus(14)",
"basis": "rule"
},
"macd": {
"yes_no": 0.1377,
"rule": "macd(C) > macdsignal(C)",
"basis": "comparison"
},
"rally10": {
"yes_no": 0.64
},
"drop10": {
"yes_no": 0.566
}
},
"context": {
"symbol": "IBIT",
"as_of": "2026-10-30"
}
}Family office · example 4
Public comps for a private software stake: CRM, ADBE, NOW, INTU
Mark a direct private software investment against public peers: are they trending and beating estimates?
- State4 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"CRM"} then ADBE, NOW, INTU, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
beat | rule | beat_eps_last > 0.5 and beat_revenue_last > 0.5Beat on EPS and revenue last quarter |
rev_g | English → rule | Did revenue grow more than 5% year over year? |
drawdown | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | beatrule | rev_grule | drawdownrule | beat_spyforecast |
|---|---|---|---|---|---|
CRM | 0.9107 | 0.8591 | 0.9463 | 0.1862 | 0.551 |
ADBE | 0.4894 | 0.8591 | 0.9463 | 0.9445 | 0.519 |
NOW | 0.1728 | 0.1409 | 0.9463 | 0.9463 | 0.355 |
INTU | 0.2453 | 0.8591 | 0.9463 | 0.9463 | 0.508 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 4 symbols: Is the stock above its 200-day moving average: true for CRM of 4. Beat on EPS and revenue last quarter: true for CRM, ADBE, INTU of 4. Did revenue grow more than 5% year over year: true for CRM, ADBE, NOW, INTU of 4. More than 20% off the 52-week high: true for ADBE, NOW, INTU of 4. Highest odds for “Beating SPY over a month”: CRM at 55%.
If public peers are in drawdowns and missing, the private mark deserves a closer look; healthy comps support the current valuation.
Request JSON (CRM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "CRM"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"beat": {
"type": "yes_no",
"ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
},
"rev_g": {
"type": "yes_no",
"instructions": "Did revenue grow more than 5% year over year?"
},
"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 (CRM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9107,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"beat": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "rule"
},
"rev_g": {
"yes_no": 0.9463,
"rule": "revenue_growth_yoy > 5",
"basis": "pattern"
},
"drawdown": {
"yes_no": 0.1862,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.551
}
},
"context": {
"symbol": "CRM",
"as_of": "2026-10-30"
}
}Family office · example 5
Gift appreciated NVDA shares to the foundation now?
Donating appreciated shares near a high maximizes the gift; check whether the stock sits near its high and is stretched.
- StateNVDA
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
near_high | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
range_top | English → rule | Is the stock in the top 10% of its 20-day range? |
stretched | rule | C > sma(C, 20) + 2 * atr(14)Stretched: more than 2 ATR above the 20-day |
doji_run | rule | doji() and roc(C, 20) > 10Doji after a 10% month |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
near_highWithin 2% of the 52-week high | 0.0537 | false |
range_topIs the stock in the top 10% of its 20-day range compiled to (C - min(L, 20)) / (max(H, 20) - min(L, 20)) >= 0.9 | 0.0553 | false |
stretchedStretched: more than 2 ATR above the 20-day | 0.0537 | false |
doji_runDoji after a 10% month | 0.0537 | false |
drop5A 5% drawdown within a month | 0.523 | 52% · close to even |
Actions
Rules on the answers decide what to send.
near_high >= 0.6→Emailfoundation-counselWhat it means
For NVDA on the session of 2026-10-30: Not true: Within 2% of the 52-week high; Is the stock in the top 10% of its 20-day range; Stretched: more than 2 ATR above the 20-day; Doji after a 10% month. Forecasts: A 5% drawdown within a month 52%. No action fired: every rule was false.
Counsel is told when the shares are near their high; the gift decision itself stays with the family and its advisers.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"near_high": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
},
"range_top": {
"type": "yes_no",
"instructions": "Is the stock in the top 10% of its 20-day range?"
},
"stretched": {
"type": "yes_no",
"ask": "C > sma(C, 20) + 2 * atr(14)"
},
"doji_run": {
"type": "yes_no",
"ask": "doji() and roc(C, 20) > 10"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "gift_window",
"when": "near_high >= 0.6",
"do": "email",
"connection": "foundation-counsel",
"subject": "Gift window: {{symbol}} near its high",
"message": "{{symbol}} ({{as_of}}) is within 2% of its 52-week high ({{near_high|pct}}). Stretched {{stretched|pct}}. Consider transferring the planned gift lot this week."
}
],
"dry_run": true
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"near_high": {
"yes_no": 0.0537,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"range_top": {
"yes_no": 0.0553,
"rule": "(C - min(L, 20)) / (max(H, 20) - min(L, 20)) >= 0.9",
"basis": "pattern"
},
"stretched": {
"yes_no": 0.0537,
"rule": "C > sma(C, 20) + 2 * atr(14)",
"basis": "rule"
},
"doji_run": {
"yes_no": 0.0537,
"rule": "doji() and roc(C, 20) > 10",
"basis": "rule"
},
"drop5": {
"yes_no": 0.523
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "gift_window",
"fired": false,
"status": "skipped"
}
]
}Family office · example 6
Real assets sleeve: gold, silver and oil ETFs
Check the trend and momentum of the real-asset hedges the family holds against inflation.
- State3 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"GLD"} then SLV, USO, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
golden | rule | sma(C, 50) > sma(C, 200)50-day above the 200-day |
roc | rule | roc(C, 20) > 5Up more than 5% in 20 sessions |
mean | rule | C > mean(C, 100)Above the 100-day mean |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Symbol | trendrule | goldenrule | rocrule | meanrule | up_weekforecast |
|---|---|---|---|---|---|
GLD | 0.0537 | 0.0537 | 0.0839 | 0.0562 | 0.566 |
SLV | 0.0537 | 0.0537 | 0.0656 | 0.0537 | 0.484 |
USO | 0.9463 | 0.9463 | 0.8727 | 0.9462 | 0.568 |
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: Is the stock above its 200-day moving average: true for USO of 3. 50-day above the 200-day: true for USO of 3. Up more than 5% in 20 sessions: true for USO of 3. Above the 100-day mean: true for USO of 3. Highest odds for “Higher in a week”: USO at 57%.
Hedges that trend with the inflation story keep their weight; a sleeve below every average is the one to review.
Request JSON (GLD; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "GLD"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"golden": {
"type": "yes_no",
"ask": "sma(C, 50) > sma(C, 200)"
},
"roc": {
"type": "yes_no",
"ask": "roc(C, 20) > 5"
},
"mean": {
"type": "yes_no",
"ask": "C > mean(C, 100)"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (GLD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.0537,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"golden": {
"yes_no": 0.0537,
"rule": "sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"roc": {
"yes_no": 0.0839,
"rule": "roc(C, 20) > 5",
"basis": "rule"
},
"mean": {
"yes_no": 0.0562,
"rule": "C > mean(C, 100)",
"basis": "rule"
},
"up_week": {
"yes_no": 0.566
}
},
"context": {
"symbol": "GLD",
"as_of": "2026-10-30"
}
}Family office · example 7
Can we sell a large XOM block without moving the price?
Before a large sale for an estate payment, check daily dollar volume and volatility to plan how many days to spread it over.
- StateXOM
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"XOM"} The server fills in the latest completed session.
Questions
liquid | rule | avg(C * V, 20) > 100000000Trades more than $100 million a day |
vol_dry | rule | V < 0.6 * avg(V, 20)Volume under 60% of normal |
atr | English → rule | Is the 14-day ATR less than 2% of the price? |
median_vol | rule | V > median(V, 20)Today's volume above its 20-day median |
big_move | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
liquidTrades more than $100 million a day | 0.9463 | true |
vol_dryVolume under 60% of normal | 0.0537 | false |
atrIs the 14-day ATR less than 2% of the price compiled to atr(14) / C < 0.02 | 0.1526 | false |
median_volToday's volume above its 20-day median | 0.9417 | true |
big_moveA big move either way in 5 days | 0.394 | 39% · unlikely |
Actions
Rules on the answers decide what to send.
liquid >= 0.6→Webhookbroker-omselse→Emailme{
"side": "sell",
"symbol": "XOM",
"algo": "vwap",
"days": 3,
"max_pct_volume": 0.1,
"p_liquid": 0.9463,
"p_dry_volume": 0.0537,
"as_of": "2026-10-30"
}What it means
For XOM on the session of 2026-10-30: True now: Trades more than $100 million a day; Today's volume above its 20-day median. Not true: Volume under 60% of normal; Is the 14-day ATR less than 2% of the price. Forecasts: A big move either way in 5 days 39%. Fired: work_order (Webhook → broker-oms).
Deep liquidity sends a three-day VWAP order to the broker; thinner trading means the sale is stretched out instead.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XOM"
},
"questions": {
"liquid": {
"type": "yes_no",
"ask": "avg(C * V, 20) > 100000000"
},
"vol_dry": {
"type": "yes_no",
"ask": "V < 0.6 * avg(V, 20)"
},
"atr": {
"type": "yes_no",
"instructions": "Is the 14-day ATR less than 2% of the price?"
},
"median_vol": {
"type": "yes_no",
"ask": "V > median(V, 20)"
},
"big_move": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
},
"actions": [
{
"id": "work_order",
"when": "liquid >= 0.6",
"do": "webhook",
"connection": "broker-oms",
"body": {
"side": "sell",
"symbol": "{{symbol}}",
"algo": "vwap",
"days": 3,
"max_pct_volume": 0.1,
"p_liquid": "{{liquid}}",
"p_dry_volume": "{{vol_dry}}",
"as_of": "{{as_of}}"
}
},
{
"id": "slow_down",
"when": "else",
"do": "email",
"connection": "me",
"subject": "{{symbol}}: thin liquidity, stretch the sale",
"message": "{{symbol}} ({{as_of}}) trades under $100M a day on average. Spread the block over more sessions."
}
],
"dry_run": true
}Response JSON (XOM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"liquid": {
"yes_no": 0.9463,
"rule": "avg(C * V, 20) > 100000000",
"basis": "rule"
},
"vol_dry": {
"yes_no": 0.0537,
"rule": "V < 0.6 * avg(V, 20)",
"basis": "rule"
},
"atr": {
"yes_no": 0.1526,
"rule": "atr(14) / C < 0.02",
"basis": "pattern"
},
"median_vol": {
"yes_no": 0.9417,
"rule": "V > median(V, 20)",
"basis": "rule"
},
"big_move": {
"yes_no": 0.394
}
},
"context": {
"symbol": "XOM",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "work_order",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "broker-oms",
"preview": {
"body": {
"side": "sell",
"symbol": "XOM",
"algo": "vwap",
"days": 3,
"max_pct_volume": 0.1,
"p_liquid": 0.9463,
"p_dry_volume": 0.0537,
"as_of": "2026-10-30"
}
}
},
{
"id": "slow_down",
"fired": false,
"status": "skipped"
}
]
}Family office · example 8
Rates watch for a family real-estate refinance: TLT and IEF
Bond prices rise when yields fall; watch long and intermediate Treasury ETFs for a breakout that could mean a refinance window.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"TLT"} then IEF, one request each. The server fills in the latest completed session.
Questions
breakout | rule | C > highest(C, 20)20-day closing breakout |
cross50 | rule | crossup(C, sma(C, 50))Crossed above the 50-day today |
rsi50 | rule | rsi(C, 14) > 50RSI above 50 |
trend | English → rule | Is the stock above its 200-day moving average? |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Symbol | breakoutrule | cross50rule | rsi50rule | trendrule | up_weekforecast | Fired |
|---|---|---|---|---|---|---|
TLT | 0.5462 | 0.05 | 0.8762 | 0.1127 | 0.561 | none |
IEF | 0.7331 | 0.05 | 0.908 | 0.1576 | 0.483 | refi_window |
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.
breakout >= 0.6 or cross50 >= 0.6→Emailreal-estate-team{
"subject": "Possible refinance window: IEF breaking out",
"text": "IEF (2026-10-30) made a 20-day closing high (73%) or crossed its 50-day (5%): yields are falling. Ask lenders for updated quotes."
}What it means
Session of 2026-10-30, 2 symbols: 20-day closing breakout: true for IEF of 2. Crossed above the 50-day today: true for none of 2. RSI above 50: true for TLT, IEF of 2. Is the stock above its 200-day moving average: true for none of 2. Highest odds for “Higher in a week”: TLT at 56%. refi_window fired for IEF.
A bond-ETF breakout is a reason to call lenders, not to lock; the real-estate team acts on the quotes they get.
Request JSON (TLT; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TLT"
},
"questions": {
"breakout": {
"type": "yes_no",
"ask": "C > highest(C, 20)"
},
"cross50": {
"type": "yes_no",
"ask": "crossup(C, sma(C, 50))"
},
"rsi50": {
"type": "yes_no",
"ask": "rsi(C, 14) > 50"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "refi_window",
"when": "breakout >= 0.6 or cross50 >= 0.6",
"do": "email",
"connection": "real-estate-team",
"subject": "Possible refinance window: {{symbol}} breaking out",
"message": "{{symbol}} ({{as_of}}) made a 20-day closing high ({{breakout|pct}}) or crossed its 50-day ({{cross50|pct}}): yields are falling. Ask lenders for updated quotes."
}
],
"dry_run": true
}Response JSON (TLT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"breakout": {
"yes_no": 0.5462,
"rule": "C > highest(C, 20)",
"basis": "rule"
},
"cross50": {
"yes_no": 0.05,
"rule": "crossup(C, sma(C, 50))",
"basis": "rule"
},
"rsi50": {
"yes_no": 0.8762,
"rule": "rsi(C, 14) > 50",
"basis": "rule"
},
"trend": {
"yes_no": 0.1127,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"up_week": {
"yes_no": 0.561
}
},
"context": {
"symbol": "TLT",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "refi_window",
"fired": false,
"status": "skipped"
}
]
}Family office · example 9
Earnings review for the family's direct holdings
After earnings season, check which direct stock holdings beat, grew and held their post-report price.
- State5 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} then MSFT, COST, HD, JPM, one request each. The server fills in the latest completed session.
Questions
beat | rule | beat_eps_last > 0.5 and beat_revenue_last > 0.5Beat on EPS and revenue last quarter |
eps_g | English → rule | Did EPS grow more than 10% year over year? |
above_pre | rule | C > pre_earnings_closeHolding above the pre-earnings close |
gap_up | rule | last_earnings_gap > 0Gapped up after the last report |
beat_next | forecast | Will the stock beat earnings next quarter? Beating earnings next quarter |
Answers
| Symbol | beatrule | eps_grule | above_prerule | gap_uprule | beat_nextforecast |
|---|---|---|---|---|---|
AAPL | 0.8591 | 0.9463 | 0.831 | 0.0537 | 0.545 |
MSFT | 0.8591 | 0.8327 | 0.2482 | 0.8374 | 0.528 |
COST | 0.1409 | 0.9463 | 0.9463 | 0.0537 | 0.481 |
HD | 0.8591 | 0.2564 | 0.3192 | 0.0537 | 0.507 |
JPM | 0.1409 | 0.6893 | 0.6505 | 0.9463 | 0.506 |
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: Beat on EPS and revenue last quarter: true for AAPL, MSFT, HD of 5. Did EPS grow more than 10% year over year: true for AAPL, MSFT, COST, JPM of 5. Holding above the pre-earnings close: true for AAPL, COST, JPM of 5. Gapped up after the last report: true for MSFT, JPM of 5. Highest odds for “Beating earnings next quarter”: AAPL at 55%.
Holdings that beat, grew and held above their pre-report price are working; the others are discussed at the next investment meeting.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"beat": {
"type": "yes_no",
"ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
},
"eps_g": {
"type": "yes_no",
"instructions": "Did EPS grow more than 10% year over year?"
},
"above_pre": {
"type": "yes_no",
"ask": "C > pre_earnings_close"
},
"gap_up": {
"type": "yes_no",
"ask": "last_earnings_gap > 0"
},
"beat_next": {
"type": "yes_no",
"instructions": "Will the stock beat earnings next quarter?"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"beat": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "rule"
},
"eps_g": {
"yes_no": 0.9463,
"rule": "eps_growth_yoy > 10",
"basis": "pattern"
},
"above_pre": {
"yes_no": 0.831,
"rule": "C > pre_earnings_close",
"basis": "rule"
},
"gap_up": {
"yes_no": 0.0537,
"rule": "last_earnings_gap > 0",
"basis": "rule"
},
"beat_next": {
"yes_no": 0.545
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}beat_eps_last beat_revenue_last eps_growth_yoy last_earnings_gap pre_earnings_close
Family office · example 10
Teaching the next generation: a candle lesson on DIS
The family runs a learning portfolio for younger members; show how candlestick patterns read on a real chart.
- StateDIS
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"DIS"} The server fills in the latest completed session.
Questions
doji | rule | doji()doji candle: Body at most 10% of the day's range. |
spinning | rule | spinning_top()spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides. |
marubozu | rule | marubozu()marubozu candle: Body at least 90% of the range: almost no wicks. |
gravestone | rule | gravestone_doji()gravestone doji candle: Doji with a long upper wick and almost no lower wick. |
inside | rule | inside_bar()inside bar candle: Today's high and low are inside yesterday's (equal counts). |
outside | rule | outside_bar()outside bar candle: Today's high above yesterday's and low below it. |
Answers
| Question | Answer | Reading |
|---|---|---|
dojidoji candle: Body at most 10% of the day's range. | 0.1442 | false |
spinningspinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides. | 0.2107 | false |
marubozumarubozu candle: Body at least 90% of the range: almost no wicks. | 0.0998 | false |
gravestonegravestone doji candle: Doji with a long upper wick and almost no lower wick. | 0.1442 | false |
insideinside bar candle: Today's high and low are inside yesterday's (equal counts). | 0.134 | false |
outsideoutside bar candle: Today's high above yesterday's and low below it. | 0.1507 | false |
What it means
For DIS on the session of 2026-10-30: Not true: doji candle: Body at most 10% of the day's range.; spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides.; marubozu candle: Body at least 90% of the range: almost no wicks.; gravestone doji candle: Doji with a long upper wick and almost no lower wick.; inside bar candle: Today's high and low are inside yesterday's (equal counts).; outside bar candle: Today's high above yesterday's and low below it..
Each pattern answers yes or no from today's bar; the lesson is that most patterns are absent on most days, which is why context matters.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "DIS"
},
"questions": {
"doji": {
"type": "yes_no",
"ask": "doji()"
},
"spinning": {
"type": "yes_no",
"ask": "spinning_top()"
},
"marubozu": {
"type": "yes_no",
"ask": "marubozu()"
},
"gravestone": {
"type": "yes_no",
"ask": "gravestone_doji()"
},
"inside": {
"type": "yes_no",
"ask": "inside_bar()"
},
"outside": {
"type": "yes_no",
"ask": "outside_bar()"
}
}
}Response JSON (DIS, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"doji": {
"yes_no": 0.1442,
"rule": "doji()",
"basis": "rule"
},
"spinning": {
"yes_no": 0.2107,
"rule": "spinning_top()",
"basis": "rule"
},
"marubozu": {
"yes_no": 0.0998,
"rule": "marubozu()",
"basis": "rule"
},
"gravestone": {
"yes_no": 0.1442,
"rule": "gravestone_doji()",
"basis": "rule"
},
"inside": {
"yes_no": 0.134,
"rule": "inside_bar()",
"basis": "rule"
},
"outside": {
"yes_no": 0.1507,
"rule": "outside_bar()",
"basis": "rule"
}
},
"context": {
"symbol": "DIS",
"as_of": "2026-10-30"
}
}doji gravestone_doji inside_bar marubozu outside_bar spinning_top
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 Buy side: Financial advisor / RIA, Wealth manager, Hedge fund PM, Quant researcher, Portfolio manager (long-only), Risk manager, Private equity, VC / growth investor, Fund-of-funds allocator.