Use cases · Buy side
Wealth manager: 20 ways to use Ora
Model portfolios across many households: drift, concentration, income and risk alerts. Each example is a complete, runnable request with the real answers it returned (46 requests, captured 2026-10-31), what they mean and, where it fits, the action it would send.
ora-fin-0.1.1. Another model changes the request JSON and the Playground link; run it there to see its answers.Rule functions and facts used by this player (53)
sma 16offset 9max 5atr 4log 4sqrt 4std 4pays_dividend 3rsi 2ref 2cut_last 2div_count_ttm 2div_yield_ttm 2ema 2roc 2abs 2lowest 2avg 1lowestbars 1sum 1beat_eps_last 1beat_revenue_last 1eps_growth_yoy 1raised_last 1years_of_growth 1cum 1adx 1diminus 1diplus 1beat_streak 1days_to_earnings 1last_earnings_move 1next_report_bmo 1macd 1macdsignal 1dark_cloud 1engulfing_bear 1evening_star 1hanging_man 1tweezer_top 1zscore 1highest 1rma 1bbupper 1dragonfly_doji 1inverted_hammer 1stochd 1stochk 1beats_last4 1revenue_growth_yoy 1willr 1atr_pct 1three_white_soldiers 1
Examples 1–10 of 20 · page 1 of 2
Wealth manager · example 1
Model portfolio drift: is the US equity sleeve (VTI) running hot?
Across hundreds of households on one model, flag when the core equity sleeve has rallied enough that accounts likely drifted above target.
- StateVTI
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"VTI"} The server fills in the latest completed session.
Questions
up_10_3m | English → rule | Is the stock up more than 10% over the last three months? |
ext_200d | rule | C > sma(C, 200) * 1.10More than 10% above the 200-day |
rsi70 | rule | rsi(C, 14) > 70RSI above 70 |
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 |
|---|---|---|
up_10_3mIs the stock up more than 10% over the last three months compiled to C / C[-63] - 1 > 0.1 | 0.0537 | false |
ext_200dMore than 10% above the 200-day | 0.0537 | false |
rsi70RSI above 70 | 0.0537 | false |
drop5A 5% drawdown within a month | 0.187 | 19% · unlikely |
Actions
Rules on the answers decide what to send.
up_10_3m >= 0.6 and ext_200d >= 0.6→Webhookrebalance-engineWhat it means
For VTI on the session of 2026-10-30: Not true: Is the stock up more than 10% over the last three months; More than 10% above the 200-day; RSI above 70. Forecasts: A 5% drawdown within a month 19%. No action fired: every rule was false.
The rebalancing engine runs a drift report only when the sleeve is both up strongly and extended; most weeks nothing is queued.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "VTI"
},
"questions": {
"up_10_3m": {
"type": "yes_no",
"instructions": "Is the stock up more than 10% over the last three months?"
},
"ext_200d": {
"type": "yes_no",
"ask": "C > sma(C, 200) * 1.10"
},
"rsi70": {
"type": "yes_no",
"ask": "rsi(C, 14) > 70"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "drift_review",
"when": "up_10_3m >= 0.6 and ext_200d >= 0.6",
"do": "webhook",
"connection": "rebalance-engine",
"body": {
"model": "growth_70_30",
"sleeve": "us_equity",
"symbol": "{{symbol}}",
"action": "run_drift_report",
"p_up_3m": "{{up_10_3m}}",
"p_extended": "{{ext_200d}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (VTI, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"up_10_3m": {
"yes_no": 0.0537,
"rule": "C / C[-63] - 1 > 0.1",
"basis": "pattern"
},
"ext_200d": {
"yes_no": 0.0537,
"rule": "C > sma(C, 200) * 1.10",
"basis": "rule"
},
"rsi70": {
"yes_no": 0.0537,
"rule": "rsi(C, 14) > 70",
"basis": "rule"
},
"drop5": {
"yes_no": 0.187
}
},
"context": {
"symbol": "VTI",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "drift_review",
"fired": false,
"status": "skipped"
}
]
}Wealth manager · example 2
Concentration alert for executives holding MSFT
Many client households hold employer stock; warn the relationship team when the name turns volatile or breaks trend.
- StateMSFT
- Questions4 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"MSFT"} The server fills in the latest completed session.
Questions
below_50d | English → rule | Is the stock more than 5% below its 50-day moving average? |
atr_exp | rule | atr(14) > 1.2 * ref(atr(14), -10)ATR up 20% in two weeks |
down_vol | rule | C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)Down on heavy volume |
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 |
|---|---|---|
below_50dIs the stock more than 5% below its 50-day moving average compiled to C < sma(C, 50) * 0.95 | 0.084 | false |
atr_expATR up 20% in two weeks | 0.1113 | false |
down_volDown on heavy volume | 0.6662 | true |
drop10A 10% drawdown within a month | 0.422 | 42% · close to even |
Actions
Rules on the answers decide what to send.
below_50d >= 0.6 or (atr_exp >= 0.6 and down_vol >= 0.6)→Slackrelationship-managerselse→Slackrelationship-managers{
"text": "MSFT (2026-10-30): no concentration alert today."
}What it means
For MSFT on the session of 2026-10-30: True now: Down on heavy volume. Not true: Is the stock more than 5% below its 50-day moving average; ATR up 20% in two weeks. Forecasts: A 10% drawdown within a month 42%. Fired: calm (Slack → relationship-managers).
Relationship managers hear about a breakdown in a concentrated name the same evening; the else branch confirms the check ran.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"below_50d": {
"type": "yes_no",
"instructions": "Is the stock more than 5% below its 50-day moving average?"
},
"atr_exp": {
"type": "yes_no",
"ask": "atr(14) > 1.2 * ref(atr(14), -10)"
},
"down_vol": {
"type": "yes_no",
"ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
},
"actions": [
{
"id": "rm_alert",
"when": "below_50d >= 0.6 or (atr_exp >= 0.6 and down_vol >= 0.6)",
"do": "slack",
"connection": "relationship-managers",
"message": "{{symbol}} ({{as_of}}): more than 5% under its 50-day ({{below_50d|pct}}), selling on volume {{down_vol|pct}}. 10% drawdown odds {{drop10|pct}}. Call concentrated households."
},
{
"id": "calm",
"when": "else",
"do": "slack",
"connection": "relationship-managers",
"message": "{{symbol}} ({{as_of}}): no concentration alert today."
}
],
"dry_run": true
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"below_50d": {
"yes_no": 0.084,
"rule": "C < sma(C, 50) * 0.95",
"basis": "comparison"
},
"atr_exp": {
"yes_no": 0.1113,
"rule": "atr(14) > 1.2 * ref(atr(14), -10)",
"basis": "rule"
},
"down_vol": {
"yes_no": 0.6662,
"rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"drop10": {
"yes_no": 0.422
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "rm_alert",
"fired": false,
"status": "skipped"
},
{
"id": "calm",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "relationship-managers",
"preview": {
"text": "MSFT (2026-10-30): no concentration alert today."
}
}
]
}Wealth manager · example 3
Income sleeve health: SCHD, VYM and JEPI
Check each income fund's payout record and trend before the quarterly income review.
- State3 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SCHD"} then VYM, JEPI, one request each. The server fills in the latest completed session.
Questions
pays | rule | pays_dividend > 0.5Pays a dividend |
yield3 | English → rule | Is the dividend yield above 3%? |
cut | English → rule | Did the stock cut its dividend last time? |
trend | English → rule | Is the stock above its 200-day moving average? |
monthly | English → rule | Does the stock pay a monthly dividend? |
Answers
| Symbol | paysrule | yield3rule | cutrule | trendrule | monthlyrule |
|---|---|---|---|---|---|
SCHD | 0.8591 | 0.4287 | 0.1409 | 0.9463 | 0.0537 |
VYM | 0.8591 | 0.0901 | 0.8591 | 0.9274 | 0.0537 |
JEPI | 0.8591 | 0.9463 | 0.8591 | 0.9463 | 0.8591 |
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: Pays a dividend: true for SCHD, VYM, JEPI of 3. Is the dividend yield above 3%: true for JEPI of 3. Did the stock cut its dividend last time: true for VYM, JEPI of 3. Is the stock above its 200-day moving average: true for SCHD, VYM, JEPI of 3.
Payout facts per fund show which sleeve carries the income; a cut or a broken trend is the item to raise in the review.
Request JSON (SCHD; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SCHD"
},
"questions": {
"pays": {
"type": "yes_no",
"ask": "pays_dividend > 0.5"
},
"yield3": {
"type": "yes_no",
"instructions": "Is the dividend yield above 3%?"
},
"cut": {
"type": "yes_no",
"instructions": "Did the stock cut its dividend last time?"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"monthly": {
"type": "yes_no",
"instructions": "Does the stock pay a monthly dividend?"
}
}
}Response JSON (SCHD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"pays": {
"yes_no": 0.8591,
"rule": "pays_dividend > 0.5",
"basis": "rule"
},
"yield3": {
"yes_no": 0.4287,
"rule": "div_yield_ttm > 3",
"basis": "pattern"
},
"cut": {
"yes_no": 0.1409,
"rule": "cut_last > 0.5",
"basis": "pattern"
},
"trend": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"monthly": {
"yes_no": 0.0537,
"rule": "div_count_ttm >= 11",
"basis": "pattern"
}
},
"context": {
"symbol": "SCHD",
"as_of": "2026-10-30"
}
}Wealth manager · example 4
Developed vs emerging: VEA and VWO trend check
Decide whether to keep the international overweight by comparing trend and momentum in developed and emerging markets.
- State4 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"VEA"} then VWO, EFA, EEM, 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 |
ema | rule | C > ema(C, 50)Above the 50-day exponential average |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | goldenrule | rocrule | emarule | beat_spyforecast |
|---|---|---|---|---|---|
VEA | 0.5877 | 0.9463 | 0.0602 | 0.1653 | 0.472 |
VWO | 0.0887 | 0.9463 | 0.0537 | 0.057 | 0.478 |
EFA | 0.6709 | 0.9463 | 0.0717 | 0.2546 | 0.447 |
EEM | 0.1449 | 0.9426 | 0.0537 | 0.0636 | 0.501 |
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 EFA of 4. 50-day above the 200-day: true for VEA, VWO, EFA, EEM of 4. Up more than 5% in 20 sessions: true for none of 4. Above the 50-day exponential average: true for none of 4. Highest odds for “Beating SPY over a month”: EEM at 50%.
Funds with trend, alignment and momentum all true support the overweight; the beat-SPY forecast says how likely each is to lead the US over a month.
Request JSON (VEA; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "VEA"
},
"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"
},
"ema": {
"type": "yes_no",
"ask": "C > ema(C, 50)"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (VEA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.5877,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"golden": {
"yes_no": 0.9463,
"rule": "sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"roc": {
"yes_no": 0.0602,
"rule": "roc(C, 20) > 5",
"basis": "rule"
},
"ema": {
"yes_no": 0.1653,
"rule": "C > ema(C, 50)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.472
}
},
"context": {
"symbol": "VEA",
"as_of": "2026-10-30"
}
}Wealth manager · example 5
Year-end tax-loss sweep across model holdings
Find the model holdings in a meaningful drawdown so the tax team can harvest losses and swap into a similar fund.
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"ARKK"} then XBI, KWEB, ICLN, TAN, one request each. The server fills in the latest completed session.
Questions
drawdown | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
below_200d | English → rule | Is the stock below its 200-day moving average? |
lowestbars | rule | lowestbars(L, 20) <= 3The 20-day low was set in the last 3 sessions |
rally5 | forecast | Will it rally at least 5% at some point in the next month? A 5% rally within a month |
Answers
| Symbol | drawdownrule | below_200drule | lowestbarsrule | rally5forecast | Fired |
|---|---|---|---|---|---|
ARKK | 0.0988 | 0.1868 | 0.7312 | 0.681 | none |
XBI | 0.0537 | 0.0796 | 0.1257 | 0.579 | none |
KWEB | 0.9463 | 0.9463 | 0.685 | 0.518 | harvest |
ICLN | 0.9463 | 0.9463 | 0.757 | 0.622 | harvest |
TAN | 0.9463 | 0.9463 | 0.7653 | 0.704 | harvest |
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.
drawdown >= 0.6→Webhooktax-desk{
"task": "harvest_candidate",
"symbol": "KWEB",
"p_drawdown20": 0.9463,
"p_downtrend": 0.9463,
"p_fresh_low": 0.685,
"as_of": "2026-10-30"
}{
"task": "harvest_candidate",
"symbol": "ICLN",
"p_drawdown20": 0.9463,
"p_downtrend": 0.9463,
"p_fresh_low": 0.757,
"as_of": "2026-10-30"
}{
"task": "harvest_candidate",
"symbol": "TAN",
"p_drawdown20": 0.9463,
"p_downtrend": 0.9463,
"p_fresh_low": 0.7653,
"as_of": "2026-10-30"
}What it means
Session of 2026-10-30, 5 symbols: More than 20% off the 52-week high: true for KWEB, ICLN, TAN of 5. Is the stock below its 200-day moving average: true for KWEB, ICLN, TAN of 5. The 20-day low was set in the last 3 sessions: true for ARKK, KWEB, ICLN, TAN of 5. Highest odds for “A 5% rally within a month”: TAN at 70%. harvest fired for KWEB, ICLN, TAN.
Funds 20% off their high go to the tax desk as candidates; a fresh low suggests the loss is still deepening, which matters for timing the swap.
Request JSON (ARKK; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "ARKK"
},
"questions": {
"drawdown": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"below_200d": {
"type": "yes_no",
"instructions": "Is the stock below its 200-day moving average?"
},
"lowestbars": {
"type": "yes_no",
"ask": "lowestbars(L, 20) <= 3"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "harvest",
"when": "drawdown >= 0.6",
"do": "webhook",
"connection": "tax-desk",
"body": {
"task": "harvest_candidate",
"symbol": "{{symbol}}",
"p_drawdown20": "{{drawdown}}",
"p_downtrend": "{{below_200d}}",
"p_fresh_low": "{{lowestbars}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (ARKK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"drawdown": {
"yes_no": 0.0988,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"below_200d": {
"yes_no": 0.1868,
"rule": "C < sma(C, 200)",
"basis": "comparison"
},
"lowestbars": {
"yes_no": 0.7312,
"rule": "lowestbars(L, 20) <= 3",
"basis": "rule"
},
"rally5": {
"yes_no": 0.681
}
},
"context": {
"symbol": "ARKK",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "harvest",
"fired": false,
"status": "skipped"
}
]
}Wealth manager · example 6
Weekly risk dial: should models lean defensive?
Every Monday before the open, read the market regime from SPY and QQQ and post the result to the investment committee channel.
- ScheduleMon at 08:30 ET
- State2 symbols
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"SPY"} then QQQ, 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 | English → rule | Is the 50-day moving average above the 200-day? |
hv | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
breadth_proxy | rule | sum(C > C[-1], 20) >= 11Up on at least 11 of the last 20 sessions |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
vol_up | forecast | Will volatility be higher over the next month? Higher volatility next month |
Answers
| Symbol | trendrule | goldenrule | hvrule | breadth_proxyrule | drop5forecast | vol_upforecast | Fired |
|---|---|---|---|---|---|---|---|
SPY | 0.9451 | 0.9463 | 0.0537 | 0.2154 | 0.203 | 0.69 | neutral |
QQQ | 0.7987 | 0.9463 | 0.0537 | 0.0792 | 0.443 | 0.523 | neutral |
true false not known for rules; forecasts are odds. Hover a column for its question.
Actions
Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.
trend < 0.4 or drop5 >= 0.5→Slackinvestment-committeeelse→Slackinvestment-committee{
"text": "SPY (2026-10-30): regime normal. Above the 200-day 95%; higher volatility next month 69%."
}{
"text": "QQQ (2026-10-30): regime normal. Above the 200-day 80%; higher volatility next month 52%."
}What it means
Session of 2026-10-30, 2 symbols: Is the stock above its 200-day moving average: true for SPY, QQQ of 2. Is the 50-day moving average above the 200-day: true for SPY, QQQ of 2. Annualized 20-day volatility above 40%: true for none of 2. Up on at least 11 of the last 20 sessions: true for none of 2. Highest odds for “A 5% drawdown within a month”: QQQ at 44%. defensive fired for none. neutral fired for SPY, QQQ.
The committee gets the same two-line read every Monday; the dial moves only when the trend breaks or drawdown odds climb.
As a scheduled workflow (Mon at 08: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": "Weekly risk dial: should models lean defensive?",
"symbols": "SPY QQQ",
"days": [
1
],
"at_time": "08:30",
"model": "ora-fin-0.1.1",
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"golden": {
"type": "yes_no",
"instructions": "Is the 50-day moving average above the 200-day?"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"breadth_proxy": {
"type": "yes_no",
"ask": "sum(C > C[-1], 20) >= 11"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
}
},
"actions": [
{
"id": "defensive",
"when": "trend < 0.4 or drop5 >= 0.5",
"do": "slack",
"connection": "investment-committee",
"message": "{{symbol}} ({{as_of}}): regime is risk-off (above 200-day {{trend|pct}}, 5% drawdown odds {{drop5|pct}}). Consider the defensive dial."
},
{
"id": "neutral",
"when": "else",
"do": "slack",
"connection": "investment-committee",
"message": "{{symbol}} ({{as_of}}): regime normal. Above the 200-day {{trend|pct}}; higher volatility next month {{vol_up|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?"
},
"golden": {
"type": "yes_no",
"instructions": "Is the 50-day moving average above the 200-day?"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"breadth_proxy": {
"type": "yes_no",
"ask": "sum(C > C[-1], 20) >= 11"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
}
},
"actions": [
{
"id": "defensive",
"when": "trend < 0.4 or drop5 >= 0.5",
"do": "slack",
"connection": "investment-committee",
"message": "{{symbol}} ({{as_of}}): regime is risk-off (above 200-day {{trend|pct}}, 5% drawdown odds {{drop5|pct}}). Consider the defensive dial."
},
{
"id": "neutral",
"when": "else",
"do": "slack",
"connection": "investment-committee",
"message": "{{symbol}} ({{as_of}}): regime normal. Above the 200-day {{trend|pct}}; higher volatility next month {{vol_up|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"
},
"golden": {
"yes_no": 0.9463,
"rule": "sma(C, 50) > sma(C, 200)",
"basis": "comparison"
},
"hv": {
"yes_no": 0.0537,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
"basis": "rule"
},
"breadth_proxy": {
"yes_no": 0.2154,
"rule": "sum(C > C[-1], 20) >= 11",
"basis": "rule"
},
"drop5": {
"yes_no": 0.203
},
"vol_up": {
"yes_no": 0.69
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "defensive",
"fired": false,
"status": "skipped"
},
{
"id": "neutral",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "investment-committee",
"preview": {
"text": "SPY (2026-10-30): regime normal. Above the 200-day 95%; higher volatility next month 69%."
}
}
]
}Wealth manager · example 7
Single-stock review for clients holding JPM
A bank stock widely held across households: check earnings quality, dividend growth and trend for the annual review.
- StateJPM
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"JPM"} 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 | rule | eps_growth_yoy > 10EPS up more than 10% on the year |
raised | rule | raised_last > 0.5Raised its last dividend |
grower | rule | years_of_growth >= 10Ten years of dividend growth |
trend | English → rule | Is the stock above its 200-day moving average? |
beat_next | forecast | Will the stock beat earnings next quarter? Beating earnings next quarter |
Answers
| Question | Answer | Reading |
|---|---|---|
beatBeat on EPS and revenue last quarter | 0.1409 | false |
eps_gEPS up more than 10% on the year | 0.6893 | true |
raisedRaised its last dividend | 0.8591 | true |
growerTen years of dividend growth | 0.9463 | true |
trendIs the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.8854 | true |
beat_nextBeating earnings next quarter | 0.506 | 51% · close to even |
What it means
For JPM on the session of 2026-10-30: True now: EPS up more than 10% on the year; Raised its last dividend; Ten years of dividend growth; Is the stock above its 200-day moving average. Not true: Beat on EPS and revenue last quarter. Forecasts: Beating earnings next quarter 51%.
Earnings and dividend facts make the annual review concrete; the beat-next-quarter forecast is shown as odds, not a recommendation.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JPM"
},
"questions": {
"beat": {
"type": "yes_no",
"ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
},
"eps_g": {
"type": "yes_no",
"ask": "eps_growth_yoy > 10"
},
"raised": {
"type": "yes_no",
"ask": "raised_last > 0.5"
},
"grower": {
"type": "yes_no",
"ask": "years_of_growth >= 10"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"beat_next": {
"type": "yes_no",
"instructions": "Will the stock beat earnings next quarter?"
}
}
}Response JSON (JPM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"beat": {
"yes_no": 0.1409,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "rule"
},
"eps_g": {
"yes_no": 0.6893,
"rule": "eps_growth_yoy > 10",
"basis": "rule"
},
"raised": {
"yes_no": 0.8591,
"rule": "raised_last > 0.5",
"basis": "rule"
},
"grower": {
"yes_no": 0.9463,
"rule": "years_of_growth >= 10",
"basis": "rule"
},
"trend": {
"yes_no": 0.8854,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"beat_next": {
"yes_no": 0.506
}
},
"context": {
"symbol": "JPM",
"as_of": "2026-10-30"
}
}beat_eps_last beat_revenue_last eps_growth_yoy raised_last sma years_of_growth
Wealth manager · example 8
Cash sleeve: are T-bill ETFs SGOV and BIL behaving like cash?
Confirm that the cash-equivalent funds used for client sweeps are calm, with tiny ranges and no drawdown.
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SGOV"} then BIL, one request each. The server fills in the latest completed session.
Questions
atr_low | English → rule | Is the 14-day ATR less than 2% of the price? |
hv_low | English → rule | Is 20-day historical volatility below 20%? |
trend | rule | C > sma(C, 50)Above the 50-day average |
cum_up | rule | cum(C > C[-1]) > cum(C < C[-1])More up days than down days over the full history |
Answers
| Symbol | atr_lowrule | hv_lowrule | trendrule | cum_uprule |
|---|---|---|---|---|
SGOV | 0.9463 | 0.9463 | 0.9451 | 0.9463 |
BIL | 0.9463 | 0.9463 | 0.9307 | 0.9463 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 2 symbols: Is the 14-day ATR less than 2% of the price: true for SGOV, BIL of 2. Is 20-day historical volatility below 20%: true for SGOV, BIL of 2. Above the 50-day average: true for SGOV, BIL of 2. More up days than down days over the full history: true for SGOV, BIL of 2.
Cash-like funds should answer yes to the calm checks; a no would be worth a look before sweeping more client cash into them.
Request JSON (SGOV; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SGOV"
},
"questions": {
"atr_low": {
"type": "yes_no",
"instructions": "Is the 14-day ATR less than 2% of the price?"
},
"hv_low": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility below 20%?"
},
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"cum_up": {
"type": "yes_no",
"ask": "cum(C > C[-1]) > cum(C < C[-1])"
}
}
}Response JSON (SGOV, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"atr_low": {
"yes_no": 0.9463,
"rule": "atr(14) / C < 0.02",
"basis": "pattern"
},
"hv_low": {
"yes_no": 0.9463,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2",
"basis": "pattern"
},
"trend": {
"yes_no": 0.9451,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"cum_up": {
"yes_no": 0.9463,
"rule": "cum(C > C[-1]) > cum(C < C[-1])",
"basis": "rule"
}
},
"context": {
"symbol": "SGOV",
"as_of": "2026-10-30"
}
}Wealth manager · example 9
Is the technology overweight (XLK) still earning its place?
Check trend strength and leadership for the tech sector ETF the models overweight.
- StateXLK
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XLK"} The server fills in the latest completed session.
Questions
adx | rule | adx(14) > 25Trending (ADX above 25) |
diplus | rule | diplus(14) > diminus(14)+DI above -DI (buyers in control) |
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 |
leader | rule | roc(C, 63) > 10 and C >= 0.95 * max(H, 63)Up more than 10% in a quarter, near the high |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Question | Answer | Reading |
|---|---|---|
adxTrending (ADX above 25) | 0.6205 | true |
diplus+DI above -DI (buyers in control) | 0.0637 | false |
stackedStacked averages: close > 20 EMA > 50 > 200 | 0.0701 | false |
leaderUp more than 10% in a quarter, near the high | 0.0624 | false |
beat_spyBeating SPY over a month | 0.498 | 50% · close to even |
What it means
For XLK on the session of 2026-10-30: True now: Trending (ADX above 25). Not true: +DI above -DI (buyers in control); Stacked averages: close > 20 EMA > 50 > 200; Up more than 10% in a quarter, near the high. Forecasts: Beating SPY over a month 50%.
A strong, directional trend with leadership supports keeping the overweight; if the trend weakens the committee revisits it.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLK"
},
"questions": {
"adx": {
"type": "yes_no",
"ask": "adx(14) > 25"
},
"diplus": {
"type": "yes_no",
"ask": "diplus(14) > diminus(14)"
},
"stacked": {
"type": "yes_no",
"ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
},
"leader": {
"type": "yes_no",
"ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (XLK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"adx": {
"yes_no": 0.6205,
"rule": "adx(14) > 25",
"basis": "rule"
},
"diplus": {
"yes_no": 0.0637,
"rule": "diplus(14) > diminus(14)",
"basis": "rule"
},
"stacked": {
"yes_no": 0.0701,
"rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"leader": {
"yes_no": 0.0624,
"rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.498
}
},
"context": {
"symbol": "XLK",
"as_of": "2026-10-30"
}
}Wealth manager · example 10
Earnings week across top client holdings
Tell advisors which of the most widely held stocks report soon so they can prepare for client questions.
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then AMZN, NVDA, JNJ, PG, one request each. The server fills in the latest completed session.
Questions
soon | rule | days_to_earnings <= 10Reports earnings within 10 days |
bmo | English → rule | Does the stock report before the market opens next time? |
big_move | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
streak | rule | beat_streak >= 4Beat four quarters in a row |
Answers
| Symbol | soonrule | bmorule | big_moverule | streakrule | Fired |
|---|---|---|---|---|---|
AAPL | 0.9392 | 0.1409 | 0.9463 | 0.9463 | prep |
AMZN | 0.0537 | 0.1409 | 0.0537 | 0.0537 | none |
NVDA | 0.0563 | 0.1409 | 0.9463 | 0.9463 | none |
JNJ | 0.0537 | 0.8591 | 0.9463 | 0.1409 | none |
PG | 0.0537 | 0.8591 | 0.9463 | 0.9463 | 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.
soon >= 0.6→Emailadvisor-desk{
"subject": "AAPL reports within 10 days",
"text": "AAPL (2026-10-30): earnings within 10 days. Before the open: 14%. Last reaction over 5%: 95%. Beat streak of 4: 95%."
}What it means
Session of 2026-10-30, 5 symbols: Reports earnings within 10 days: true for AAPL of 5. Does the stock report before the market opens next time: true for JNJ, PG of 5. Last earnings move bigger than 5%: true for AAPL, NVDA, JNJ, PG of 5. Beat four quarters in a row: true for AAPL, NVDA, PG of 5. prep fired for AAPL.
Only names reporting soon produce an email; the reaction and streak facts help advisors set expectations with clients.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"soon": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"bmo": {
"type": "yes_no",
"instructions": "Does the stock report before the market opens next time?"
},
"big_move": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
},
"streak": {
"type": "yes_no",
"ask": "beat_streak >= 4"
}
},
"actions": [
{
"id": "prep",
"when": "soon >= 0.6",
"do": "email",
"connection": "advisor-desk",
"subject": "{{symbol}} reports within 10 days",
"message": "{{symbol}} ({{as_of}}): earnings within 10 days. Before the open: {{bmo|pct}}. Last reaction over 5%: {{big_move|pct}}. Beat streak of 4: {{streak|pct}}."
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"soon": {
"yes_no": 0.9392,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"bmo": {
"yes_no": 0.1409,
"rule": "next_report_bmo > 0.5",
"basis": "pattern"
},
"big_move": {
"yes_no": 0.9463,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
},
"streak": {
"yes_no": 0.9463,
"rule": "beat_streak >= 4",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "prep",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "advisor-desk",
"preview": {
"subject": "AAPL reports within 10 days",
"text": "AAPL (2026-10-30): earnings within 10 days. Before the open: 14%. Last reaction over 5%: 95%. Beat streak of 4: 95%."
}
}
]
}abs beat_streak days_to_earnings last_earnings_move next_report_bmo
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, Family office, Hedge fund PM, Quant researcher, Portfolio manager (long-only), Risk manager, Private equity, VC / growth investor, Fund-of-funds allocator.