Use cases · Buy side
Financial advisor / RIA: 20 ways to use Ora
Client portfolios, rebalancing, reviews and timely notes before clients call. Each example is a complete, runnable request with the real answers it returned (37 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 14max 7offset 5atr 4days_to_earnings 3rsi 3abs 3log 3sqrt 3std 3ref 3pays_dividend 2swinglow 2cut_last 2min 2beat_eps_last 1beat_revenue_last 1shooting_star 1swinghigh 1div_yield_ttm 1years_of_growth 1beat_streak 1last_earnings_move 1next_report_amc 1misses_last4 1macd 1avg 1days_since_earnings 1harami_bull 1morning_star 1piercing_line 1tweezer_bottom 1crossdown 1bblower 1ema 1roc 1linreg 1days_since_split 1days_to_split 1last_split_ratio 1reverse_split_last 1splits_5y 1highest 1lowest 1atr_pct 1adx 1diminus 1diplus 1wma 1days_to_ex_div 1
Examples 1–10 of 20 · page 1 of 2
Financial advisor / RIA · example 1
Client review prep: is AAPL still a healthy core holding?
Before a quarterly client meeting, summarize the trend, the last earnings report and the near-term risk of a large position in one request.
- StateAAPL
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} 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 |
beat | English → rule | Did the stock beat on both EPS and revenue last quarter? |
earn_soon | English → rule | Is earnings in the next 14 days? |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
trendIs the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.9463 | true |
golden50-day above the 200-day | 0.9463 | true |
beatDid the stock beat on both EPS and revenue last quarter compiled to beat_eps_last > 0.5 and beat_revenue_last > 0.5 | 0.8591 | true |
earn_soonIs earnings in the next 14 days compiled to days_to_earnings <= 14 | 0.9463 | true |
drop5A 5% drawdown within a month | 0.365 | 37% · unlikely |
up_weekHigher in a week | 0.59 | 59% · close to even |
What it means
For AAPL on the session of 2026-10-30: True now: Is the stock above its 200-day moving average; 50-day above the 200-day; Did the stock beat on both EPS and revenue last quarter; Is earnings in the next 14 days. Forecasts: A 5% drawdown within a month 37%; Higher in a week 59%.
Trend and earnings facts give the advisor a plain-language status for the review; the two forecasts frame the near-term risk without promising a direction.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"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)"
},
"beat": {
"type": "yes_no",
"instructions": "Did the stock beat on both EPS and revenue last quarter?"
},
"earn_soon": {
"type": "yes_no",
"instructions": "Is earnings in the next 14 days?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"golden": {
"yes_no": 0.9463,
"rule": "sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"beat": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "pattern"
},
"earn_soon": {
"yes_no": 0.9463,
"rule": "days_to_earnings <= 14",
"basis": "pattern"
},
"drop5": {
"yes_no": 0.365
},
"up_week": {
"yes_no": 0.59
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}Financial advisor / RIA · example 2
Concentrated NVDA position: is it stretched enough to trim for a client?
A client holds a large NVDA position after a long run; check whether the stock is extended before suggesting a partial trim and log the decision in the CRM.
- StateNVDA
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
ext_200d | English → rule | Is the stock more than 10% above its 200-day moving average? |
stretched | rule | C > sma(C, 20) + 2 * atr(14)Stretched: more than 2 ATR above the 20-day |
rsi70 | rule | rsi(C, 14) > 70RSI above 70 |
shooting | rule | shooting_star()shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise. |
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 |
|---|---|---|
ext_200dIs the stock more than 10% above its 200-day moving average compiled to C > sma(C, 200) * 1.1 | 0.06 | false |
stretchedStretched: more than 2 ATR above the 20-day | 0.0537 | false |
rsi70RSI above 70 | 0.0537 | false |
shootingshooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise. | 0.0537 | false |
drop10A 10% drawdown within a month | 0.523 | 52% · close to even |
Actions
Rules on the answers decide what to send.
stretched >= 0.6 or (ext_200d >= 0.6 and rsi70 >= 0.6)→Webhookcrm-noteselse→Webhookcrm-notes{
"type": "advisor_note",
"symbol": "NVDA",
"topic": "concentration_review",
"suggestion": "no_action",
"p_stretched": 0.0537,
"as_of": "2026-10-30"
}What it means
For NVDA on the session of 2026-10-30: Not true: Is the stock more than 10% above its 200-day moving average; Stretched: more than 2 ATR above the 20-day; RSI above 70; shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.. Forecasts: A 10% drawdown within a month 52%. Fired: no_trim (Webhook → crm-notes).
Either way a note lands in the CRM, so the file shows the check was done; the trim branch fires only when the stretch rules agree.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"ext_200d": {
"type": "yes_no",
"instructions": "Is the stock more than 10% above its 200-day moving average?"
},
"stretched": {
"type": "yes_no",
"ask": "C > sma(C, 20) + 2 * atr(14)"
},
"rsi70": {
"type": "yes_no",
"ask": "rsi(C, 14) > 70"
},
"shooting": {
"type": "yes_no",
"ask": "shooting_star()"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
},
"actions": [
{
"id": "trim_note",
"when": "stretched >= 0.6 or (ext_200d >= 0.6 and rsi70 >= 0.6)",
"do": "webhook",
"connection": "crm-notes",
"body": {
"type": "advisor_note",
"symbol": "{{symbol}}",
"topic": "concentration_review",
"suggestion": "discuss_partial_trim",
"p_stretched": "{{stretched}}",
"p_overbought": "{{rsi70}}",
"p_drop10": "{{drop10}}",
"as_of": "{{as_of}}"
}
},
{
"id": "no_trim",
"when": "else",
"do": "webhook",
"connection": "crm-notes",
"body": {
"type": "advisor_note",
"symbol": "{{symbol}}",
"topic": "concentration_review",
"suggestion": "no_action",
"p_stretched": "{{stretched}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"ext_200d": {
"yes_no": 0.06,
"rule": "C > sma(C, 200) * 1.1",
"basis": "comparison"
},
"stretched": {
"yes_no": 0.0537,
"rule": "C > sma(C, 20) + 2 * atr(14)",
"basis": "rule"
},
"rsi70": {
"yes_no": 0.0537,
"rule": "rsi(C, 14) > 70",
"basis": "rule"
},
"shooting": {
"yes_no": 0.0537,
"rule": "shooting_star()",
"basis": "rule"
},
"drop10": {
"yes_no": 0.523
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "trim_note",
"fired": false,
"status": "skipped"
},
{
"id": "no_trim",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "crm-notes",
"preview": {
"body": {
"type": "advisor_note",
"symbol": "NVDA",
"topic": "concentration_review",
"suggestion": "no_action",
"p_stretched": 0.0537,
"as_of": "2026-10-30"
}
}
}
]
}Financial advisor / RIA · example 3
60/40 rebalancing band check on SPY and AGG
Check the stock and bond sleeves of a balanced model each Monday and email the advisor when either sleeve has moved enough to warrant a rebalance review.
- ScheduleMon at 09:15 ET
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"SPY"} then AGG, one request each. 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? |
down_5m | English → rule | Is the stock down more than 5% over the last month? |
trend | English → rule | Is the stock above its 200-day moving average? |
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
| Symbol | up_10_3mrule | down_5mrule | trendrule | big_moveforecast | Fired |
|---|---|---|---|---|---|
SPY | 0.0537 | 0.0652 | 0.9451 | 0.425 | none |
AGG | 0.0537 | 0.0537 | 0.248 | 0.274 | 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.
up_10_3m >= 0.6 or down_5m >= 0.6→EmailmeWhat it means
Session of 2026-10-30, 2 symbols: Is the stock up more than 10% over the last three months: true for none of 2. Is the stock down more than 5% over the last month: true for none of 2. Is the stock above its 200-day moving average: true for SPY of 2. Highest odds for “A big move either way in 5 days”: SPY at 43%. review fired for none.
A quiet Monday means both sleeves are inside their normal range; an email means one leg moved enough that drift is worth checking.
As a scheduled workflow (Mon at 09:15 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": "60/40 rebalancing band check on SPY and AGG",
"symbols": "SPY AGG",
"days": [
1
],
"at_time": "09:15",
"model": "ora-fin-0.1.1",
"questions": {
"up_10_3m": {
"type": "yes_no",
"instructions": "Is the stock up more than 10% over the last three months?"
},
"down_5m": {
"type": "yes_no",
"instructions": "Is the stock down more than 5% over the last month?"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"big_move": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
},
"actions": [
{
"id": "review",
"when": "up_10_3m >= 0.6 or down_5m >= 0.6",
"do": "email",
"connection": "me",
"subject": "Rebalance review: {{symbol}} moved",
"message": "{{symbol}} ({{as_of}}): up over 10% in three months {{up_10_3m|pct}}, down 5% this month {{down_5m|pct}}. Check the 60/40 drift across client accounts."
}
]
}Request JSON (SPY; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"up_10_3m": {
"type": "yes_no",
"instructions": "Is the stock up more than 10% over the last three months?"
},
"down_5m": {
"type": "yes_no",
"instructions": "Is the stock down more than 5% over the last month?"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"big_move": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
},
"actions": [
{
"id": "review",
"when": "up_10_3m >= 0.6 or down_5m >= 0.6",
"do": "email",
"connection": "me",
"subject": "Rebalance review: {{symbol}} moved",
"message": "{{symbol}} ({{as_of}}): up over 10% in three months {{up_10_3m|pct}}, down 5% this month {{down_5m|pct}}. Check the 60/40 drift across client accounts."
}
],
"dry_run": true
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"up_10_3m": {
"yes_no": 0.0537,
"rule": "C / C[-63] - 1 > 0.1",
"basis": "pattern"
},
"down_5m": {
"yes_no": 0.0652,
"rule": "C / C[-21] - 1 < -0.05",
"basis": "pattern"
},
"trend": {
"yes_no": 0.9451,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"big_move": {
"yes_no": 0.425
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "review",
"fired": false,
"status": "skipped"
}
]
}Financial advisor / RIA · example 4
Tax-loss harvesting candidate: is PFE down enough and still weak?
In the fourth quarter, find positions with a meaningful loss and a weak trend that may be worth harvesting and replacing.
- StatePFE
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"PFE"} 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? |
lh_ll | English → rule | Is the stock making lower swing highs and lower swing lows? |
pays | English → rule | Does the stock pay a dividend? |
rally5 | forecast | Will it rally at least 5% at some point in the next month? A 5% rally within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
drawdownMore than 20% off the 52-week high | 0.0537 | false |
below_200dIs the stock below its 200-day moving average compiled to C < sma(C, 200) | 0.0537 | false |
lh_llIs the stock making lower swing highs and lower swing lows compiled to (swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2)) | 0.1586 | false |
paysDoes the stock pay a dividend compiled to pays_dividend > 0.5 | 0.8591 | true |
rally5A 5% rally within a month | 0.435 | 44% · close to even |
Actions
Rules on the answers decide what to send.
drawdown >= 0.6 and below_200d >= 0.6→EmailmeWhat it means
For PFE on the session of 2026-10-30: True now: Does the stock pay a dividend. Not true: More than 20% off the 52-week high; Is the stock below its 200-day moving average; Is the stock making lower swing highs and lower swing lows. Forecasts: A 5% rally within a month 44%. No action fired: every rule was false.
Harvesting is a tax decision first; the rules only flag positions that are both down and in a downtrend, and the forecast is context for timing.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "PFE"
},
"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?"
},
"lh_ll": {
"type": "yes_no",
"instructions": "Is the stock making lower swing highs and lower swing lows?"
},
"pays": {
"type": "yes_no",
"instructions": "Does the stock pay a dividend?"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "harvest_flag",
"when": "drawdown >= 0.6 and below_200d >= 0.6",
"do": "email",
"connection": "me",
"subject": "Harvest candidate: {{symbol}}",
"message": "{{symbol}} ({{as_of}}) is 20% off its high and below the 200-day. Review lots with losses; mind the wash-sale window. Odds of a 5% rally within a month: {{rally5|pct}}."
}
],
"dry_run": true
}Response JSON (PFE, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"drawdown": {
"yes_no": 0.0537,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"below_200d": {
"yes_no": 0.0537,
"rule": "C < sma(C, 200)",
"basis": "comparison"
},
"lh_ll": {
"yes_no": 0.1586,
"rule": "(swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))",
"basis": "pattern"
},
"pays": {
"yes_no": 0.8591,
"rule": "pays_dividend > 0.5",
"basis": "pattern"
},
"rally5": {
"yes_no": 0.435
}
},
"context": {
"symbol": "PFE",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "harvest_flag",
"fired": false,
"status": "skipped"
}
]
}Financial advisor / RIA · example 5
Retiree income check: are JNJ, PG and KO dividends intact?
For clients living on dividends, confirm each holding still pays, has not cut and keeps growing its payout.
- State3 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"JNJ"} then PG, KO, one request each. The server fills in the latest completed session.
Questions
pays | rule | pays_dividend > 0.5Pays a dividend |
no_cut | rule | cut_last < 0.5Did not cut its last dividend |
grow25 | English → rule | Has the stock grown its dividend for 25 years in a row? |
yield3 | English → rule | Is the dividend yield above 3%? |
raise_next | forecast | Will the company raise its dividend next year? Raising the dividend next year |
Answers
| Symbol | paysrule | no_cutrule | grow25rule | yield3rule | raise_nextforecast |
|---|---|---|---|---|---|
JNJ | 0.8591 | 0.8591 | 0.9463 | 0.0648 | 0.495 |
PG | 0.8591 | 0.8591 | 0.9463 | 0.2091 | 0.46 |
KO | 0.8591 | 0.8591 | 0.0683 | 0.0537 | 0.517 |
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 JNJ, PG, KO of 3. Did not cut its last dividend: true for JNJ, PG, KO of 3. Has the stock grown its dividend for 25 years in a row: true for JNJ, PG of 3. Is the dividend yield above 3%: true for none of 3. Highest odds for “Raising the dividend next year”: KO at 52%.
Payout facts answer from the dividend record; a cut or a broken growth streak is the trigger to talk to the client, not the price.
Request JSON (JNJ; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JNJ"
},
"questions": {
"pays": {
"type": "yes_no",
"ask": "pays_dividend > 0.5"
},
"no_cut": {
"type": "yes_no",
"ask": "cut_last < 0.5"
},
"grow25": {
"type": "yes_no",
"instructions": "Has the stock grown its dividend for 25 years in a row?"
},
"yield3": {
"type": "yes_no",
"instructions": "Is the dividend yield above 3%?"
},
"raise_next": {
"type": "yes_no",
"instructions": "Will the company raise its dividend next year?"
}
}
}Response JSON (JNJ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"pays": {
"yes_no": 0.8591,
"rule": "pays_dividend > 0.5",
"basis": "rule"
},
"no_cut": {
"yes_no": 0.8591,
"rule": "cut_last < 0.5",
"basis": "rule"
},
"grow25": {
"yes_no": 0.9463,
"rule": "years_of_growth >= 25",
"basis": "pattern"
},
"yield3": {
"yes_no": 0.0648,
"rule": "div_yield_ttm > 3",
"basis": "pattern"
},
"raise_next": {
"yes_no": 0.495
}
},
"context": {
"symbol": "JNJ",
"as_of": "2026-10-30"
}
}Financial advisor / RIA · example 6
Heads-up before MSFT earnings for clients who own it
When a widely held stock reports within days, send the team a Slack heads-up so advisors can expect client calls.
- StateMSFT
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"MSFT"} The server fills in the latest completed session.
Questions
soon | rule | days_to_earnings <= 10Reports earnings within 10 days |
amc | English → rule | Does the stock report after the close 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 |
big5 | 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 |
|---|---|---|
soonReports earnings within 10 days | 0.0537 | false |
amcDoes the stock report after the close next time compiled to next_report_amc > 0.5 | 0.8591 | true |
big_moveLast earnings move bigger than 5% | 0.0537 | false |
streakBeat four quarters in a row | 0.9463 | true |
big5A big move either way in 5 days | 0.397 | 40% · unlikely |
Actions
Rules on the answers decide what to send.
soon >= 0.6→Slackadvisor-teamelse→Slackadvisor-team{
"text": "MSFT (2026-10-30): no report in the next 10 days."
}What it means
For MSFT on the session of 2026-10-30: True now: Does the stock report after the close next time; Beat four quarters in a row. Not true: Reports earnings within 10 days; Last earnings move bigger than 5%. Forecasts: A big move either way in 5 days 40%. Fired: not_yet (Slack → advisor-team).
The team hears about the report before clients do; the else branch keeps the channel honest when nothing is close.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"soon": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"amc": {
"type": "yes_no",
"instructions": "Does the stock report after the close next time?"
},
"big_move": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
},
"streak": {
"type": "yes_no",
"ask": "beat_streak >= 4"
},
"big5": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
},
"actions": [
{
"id": "heads_up",
"when": "soon >= 0.6",
"do": "slack",
"connection": "advisor-team",
"message": "{{symbol}} reports within 10 days (after the close: {{amc|pct}}). Last reaction over 5%: {{big_move|pct}}. Big move in 5 days: {{big5|pct}}. Expect client calls."
},
{
"id": "not_yet",
"when": "else",
"do": "slack",
"connection": "advisor-team",
"message": "{{symbol}} ({{as_of}}): no report in the next 10 days."
}
],
"dry_run": true
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"soon": {
"yes_no": 0.0537,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"amc": {
"yes_no": 0.8591,
"rule": "next_report_amc > 0.5",
"basis": "pattern"
},
"big_move": {
"yes_no": 0.0537,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
},
"streak": {
"yes_no": 0.9463,
"rule": "beat_streak >= 4",
"basis": "rule"
},
"big5": {
"yes_no": 0.397
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "heads_up",
"fired": false,
"status": "skipped"
},
{
"id": "not_yet",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "advisor-team",
"preview": {
"text": "MSFT (2026-10-30): no report in the next 10 days."
}
}
]
}abs beat_streak days_to_earnings last_earnings_move next_report_amc
Financial advisor / RIA · example 7
Should we send a client letter? SPY drawdown and volatility check
Decide whether market conditions justify a reassurance note to clients: drawdown depth, volatility and trend.
- StateSPY
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
pullback | English → rule | Has the stock pulled back at least 5% from its 20-day high? |
bear | English → rule | Is the stock in bear-market territory, more than 20% below its 52-week high? |
hv | English → rule | Is 20-day historical volatility above 25%? |
trend | English → rule | Is the stock above its 200-day moving average? |
vol_up | forecast | Will volatility be higher over the next month? Higher volatility next month |
Answers
| Question | Answer | Reading |
|---|---|---|
pullbackHas the stock pulled back at least 5% from its 20-day high compiled to C <= max(H, 20) * 0.95 | 0.0647 | false |
bearIs the stock in bear-market territory, more than 20% below its 52-week high compiled to C < 0.8 * max(H, 252) | 0.0537 | false |
hvIs 20-day historical volatility above 25% compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.25 | 0.0537 | false |
trendIs the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.9451 | true |
vol_upHigher volatility next month | 0.69 | 69% · likely |
Actions
Rules on the answers decide what to send.
pullback >= 0.6 or hv >= 0.6→Emailcompliance-reviewWhat it means
For SPY on the session of 2026-10-30: True now: Is the stock above its 200-day moving average. Not true: Has the stock pulled back at least 5% from its 20-day high; Is the stock in bear-market territory, more than 20% below its 52-week high; Is 20-day historical volatility above 25%. Forecasts: Higher volatility next month 69%. No action fired: every rule was false.
The letter goes to compliance for review only when the market has actually pulled back or turned volatile; otherwise no outreach is needed.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"pullback": {
"type": "yes_no",
"instructions": "Has the stock pulled back at least 5% from its 20-day high?"
},
"bear": {
"type": "yes_no",
"instructions": "Is the stock in bear-market territory, more than 20% below its 52-week high?"
},
"hv": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility above 25%?"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
}
},
"actions": [
{
"id": "draft_letter",
"when": "pullback >= 0.6 or hv >= 0.6",
"do": "email",
"connection": "compliance-review",
"subject": "Draft client letter: market pullback ({{as_of}})",
"message": "SPY is 5% off its 20-day high ({{pullback|pct}}) or volatility is elevated ({{hv|pct}}). Trend above the 200-day: {{trend|pct}}. Please review a reassurance letter for distribution."
}
],
"dry_run": true
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"pullback": {
"yes_no": 0.0647,
"rule": "C <= max(H, 20) * 0.95",
"basis": "pattern"
},
"bear": {
"yes_no": 0.0537,
"rule": "C < 0.8 * max(H, 252)",
"basis": "pattern"
},
"hv": {
"yes_no": 0.0537,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.25",
"basis": "pattern"
},
"trend": {
"yes_no": 0.9451,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"vol_up": {
"yes_no": 0.69
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "draft_letter",
"fired": false,
"status": "skipped"
}
]
}Financial advisor / RIA · example 8
Onboarding a new client: screen their legacy holdings
Run the same quality and trend questions on each stock a new client transfers in, to prioritize what to review first.
- State5 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"T"} then VZ, INTC, DIS, BA, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
drawdown | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
cut | English → rule | Did the stock cut its dividend last time? |
miss | English → rule | Has the stock missed EPS estimates in any of the last 4 quarters? |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Symbol | trendrule | drawdownrule | cutrule | missrule | drop10forecast |
|---|---|---|---|---|---|
T | 0.0674 | 0.845 | 0.1409 | 0.1409 | 0.463 |
VZ | 0.3448 | 0.0879 | 0.1409 | 0.1409 | 0.421 |
INTC | 0.0861 | 0.9463 | 0.1409 | 0.1409 | 0.836 |
DIS | 0.9435 | 0.0537 | 0.1409 | 0.1409 | 0.328 |
BA | 0.0554 | 0.9296 | 0.1409 | 0.8591 | 0.426 |
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: Is the stock above its 200-day moving average: true for DIS of 5. More than 20% off the 52-week high: true for T, INTC, BA of 5. Did the stock cut its dividend last time: true for none of 5. Has the stock missed EPS estimates in any of the last 4 quarters: true for BA of 5. Highest odds for “A 10% drawdown within a month”: INTC at 84%.
Holdings in a drawdown with a recent dividend cut or earnings misses go to the top of the review list; the rest can wait for the regular cycle.
Request JSON (T; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "T"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"drawdown": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"cut": {
"type": "yes_no",
"instructions": "Did the stock cut its dividend last time?"
},
"miss": {
"type": "yes_no",
"instructions": "Has the stock missed EPS estimates in any of the last 4 quarters?"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
}
}Response JSON (T, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.0674,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"drawdown": {
"yes_no": 0.845,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"cut": {
"yes_no": 0.1409,
"rule": "cut_last > 0.5",
"basis": "pattern"
},
"miss": {
"yes_no": 0.1409,
"rule": "misses_last4 >= 1",
"basis": "pattern"
},
"drop10": {
"yes_no": 0.463
}
},
"context": {
"symbol": "T",
"as_of": "2026-10-30"
}
}Financial advisor / RIA · example 9
Is TLT still falling? Duration check for conservative models
Before adding duration for a conservative client, check the long-bond ETF's trend, momentum and recent volatility.
- StateTLT
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TLT"} The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
sma50_falling | English → rule | Is the 50-day moving average falling, lower than 5 sessions ago? |
macd | English → rule | Is MACD above zero? |
hv_low | English → rule | Is 20-day historical volatility below 20%? |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
trendIs the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.1127 | false |
sma50_fallingIs the 50-day moving average falling, lower than 5 sessions ago compiled to sma(C, 50) < ref(sma(C, 50), -5) | 0.7064 | true |
macdIs MACD above zero compiled to macd(C) > 0 | 0.8818 | true |
hv_lowIs 20-day historical volatility below 20% compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2 | 0.9463 | true |
up_weekHigher in a week | 0.561 | 56% · close to even |
What it means
For TLT on the session of 2026-10-30: True now: Is the 50-day moving average falling, lower than 5 sessions ago; Is MACD above zero; Is 20-day historical volatility below 20%. Not true: Is the stock above its 200-day moving average. Forecasts: Higher in a week 56%.
A falling 50-day and a price below the 200-day argue for staging any duration add; the forecast adds the near-term odds.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TLT"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"sma50_falling": {
"type": "yes_no",
"instructions": "Is the 50-day moving average falling, lower than 5 sessions ago?"
},
"macd": {
"type": "yes_no",
"instructions": "Is MACD above zero?"
},
"hv_low": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility below 20%?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (TLT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.1127,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"sma50_falling": {
"yes_no": 0.7064,
"rule": "sma(C, 50) < ref(sma(C, 50), -5)",
"basis": "pattern"
},
"macd": {
"yes_no": 0.8818,
"rule": "macd(C) > 0",
"basis": "pattern"
},
"hv_low": {
"yes_no": 0.9463,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2",
"basis": "pattern"
},
"up_week": {
"yes_no": 0.561
}
},
"context": {
"symbol": "TLT",
"as_of": "2026-10-30"
}
}Financial advisor / RIA · example 10
A client asks about HD's big drop: was it unusual?
When a client calls about a down day, check if the move was large for the stock and whether there was an event behind it.
- StateHD
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"HD"} The server fills in the latest completed session.
Questions
big_atr | rule | abs(C - C[-1]) > 1.5 * atr(14)Today's move was bigger than 1.5 ATR |
down_vol | rule | C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)Down on heavy volume |
earn_recent | English → rule | Did the stock report earnings in the last 7 days? |
below_50d | English → rule | Is the stock more than 5% below its 50-day moving average? |
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 |
|---|---|---|
big_atrToday's move was bigger than 1.5 ATR | 0.0537 | false |
down_volDown on heavy volume | 0.0692 | false |
earn_recentDid the stock report earnings in the last 7 days compiled to days_since_earnings <= 7 | 0.0537 | false |
below_50dIs the stock more than 5% below its 50-day moving average compiled to C < sma(C, 50) * 0.95 | 0.0677 | false |
drop5A 5% drawdown within a month | 0.457 | 46% · close to even |
What it means
For HD on the session of 2026-10-30: Not true: Today's move was bigger than 1.5 ATR; Down on heavy volume; Did the stock report earnings in the last 7 days; Is the stock more than 5% below its 50-day moving average. Forecasts: A 5% drawdown within a month 46%.
If the move was within its normal ATR range and not around earnings, the advisor can explain it as ordinary volatility.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "HD"
},
"questions": {
"big_atr": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"down_vol": {
"type": "yes_no",
"ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
},
"earn_recent": {
"type": "yes_no",
"instructions": "Did the stock report earnings in the last 7 days?"
},
"below_50d": {
"type": "yes_no",
"instructions": "Is the stock more than 5% below its 50-day moving average?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
}
}Response JSON (HD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"big_atr": {
"yes_no": 0.0537,
"rule": "abs(C - C[-1]) > 1.5 * atr(14)",
"basis": "rule"
},
"down_vol": {
"yes_no": 0.0692,
"rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"earn_recent": {
"yes_no": 0.0537,
"rule": "days_since_earnings <= 7",
"basis": "pattern"
},
"below_50d": {
"yes_no": 0.0677,
"rule": "C < sma(C, 50) * 0.95",
"basis": "comparison"
},
"drop5": {
"yes_no": 0.457
}
},
"context": {
"symbol": "HD",
"as_of": "2026-10-30"
}
}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: Wealth manager, Family office, Hedge fund PM, Quant researcher, Portfolio manager (long-only), Risk manager, Private equity, VC / growth investor, Fund-of-funds allocator.