Use cases · Buy side
Portfolio manager (long-only): 20 ways to use Ora
Benchmark-aware stock picking: entry timing, trims, earnings risk and sector tilts. 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 (64)
sma 11ref 5abs 4roc 4max 4offset 3atr 2last_earnings_move 2adx 2diminus 2diplus 2ema 2beat_eps_last 2last_earnings_gap 2min 2avg 2between 1rsi 1wma 1cci 1willr 1beats_last4 1days_to_earnings 1linreg 1beat_revenue_last 1eps_year_ago 1last_eps 1pre_earnings_close 1revenue_growth_yoy 1harami_bull 1morning_star 1piercing_line 1cut_last 1div_yield_ttm 1years_of_growth 1crossdown 1lowest 1median 1obv 1sign 1sum 1tr 1doji 1highestbars 1macdhist 1dark_cloud 1engulfing_bear 1evening_star 1days_since_earnings 1lowestbars 1zscore 1gap_down 1hlc3 1mean 1rec 1rma 1days_since_split 1days_to_ex_div 1days_to_split 1last_split_ratio 1raised_last 1swinghigh 1swinglow 1three_black_crows 1
Examples 1–10 of 20 · page 1 of 2
Portfolio manager (long-only) · example 1
Timing an add to MSFT in a long-only book
The thesis is set; the PM wants to add on weakness inside the trend rather than into strength.
- StateMSFT
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MSFT"} The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
pullback | rule | (C > sma(C, 50)) and (sma(C, 50) > sma(C, 200)) and (L <= sma(C, 20) * 1.01) and (C >= sma(C, 20))Uptrend pullback to the 20-day (entry zone) |
rsi_mid | rule | between(rsi(C, 14), 35, 55)RSI(14) between 35 and 55 |
wma_up | rule | wma(C, 10) > wma(C, 30)10-day weighted average above the 30-day |
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 |
pullbackUptrend pullback to the 20-day (entry zone) | 0.2573 | false |
rsi_midRSI(14) between 35 and 55 | 0.95 | true |
wma_up10-day weighted average above the 30-day | 0.5008 | on the line (true) |
up_weekHigher in a week | 0.574 | 57% · close to even |
What it means
For MSFT on the session of 2026-10-30: True now: Is the stock above its 200-day moving average; RSI(14) between 35 and 55. Not true: Uptrend pullback to the 20-day (entry zone). On the line: 10-day weighted average above the 30-day. Forecasts: Higher in a week 57%.
Trend true with a pullback to the 20-day is the add zone; if the stock is extended instead, the PM leaves the order resting lower.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"pullback": {
"type": "yes_no",
"ask": "(C > sma(C, 50)) and (sma(C, 50) > sma(C, 200)) and (L <= sma(C, 20) * 1.01) and (C >= sma(C, 20))"
},
"rsi_mid": {
"type": "yes_no",
"ask": "between(rsi(C, 14), 35, 55)"
},
"wma_up": {
"type": "yes_no",
"ask": "wma(C, 10) > wma(C, 30)"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"pullback": {
"yes_no": 0.2573,
"rule": "(C > sma(C, 50)) and (sma(C, 50) > sma(C, 200)) and (L <= sma(C, 20) * 1.01) and (C >= sma(C, 20))",
"basis": "rule"
},
"rsi_mid": {
"yes_no": 0.95,
"rule": "between(rsi(C, 14), 35, 55)",
"basis": "rule"
},
"wma_up": {
"yes_no": 0.5008,
"rule": "wma(C, 10) > wma(C, 30)",
"basis": "rule"
},
"up_week": {
"yes_no": 0.574
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 2
Trim LLY into strength or hold the overweight?
LLY has grown into a large active weight; decide whether price is stretched enough to trim part of it.
- StateLLY
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"LLY"} The server fills in the latest completed session.
Questions
stretched | rule | C > sma(C, 20) + 2 * atr(14)Stretched: more than 2 ATR above the 20-day |
ext | English → rule | Is the stock more than 10% above its 200-day moving average? |
cci_hot | rule | cci(20) > 150CCI(20) above 150 |
willr_top | rule | willr(14) > -20Williams %R above −20 |
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 |
|---|---|---|
stretchedStretched: more than 2 ATR above the 20-day | 0.919 | true |
extIs the stock more than 10% above its 200-day moving average compiled to C > sma(C, 200) * 1.1 | 0.9463 | true |
cci_hotCCI(20) above 150 | 0.7458 | true |
willr_topWilliams %R above −20 | 0.6655 | true |
drop5A 5% drawdown within a month | 0.583 | 58% · close to even |
Actions
Rules on the answers decide what to send.
stretched >= 0.6 and (cci_hot >= 0.6 or willr_top >= 0.6)→Emailpm-teamelse→Emailpm-team{
"subject": "LLY: trim candidate (2026-10-30)",
"text": "LLY is 2 ATR over its 20-day with an overbought oscillator (CCI 75%, Williams %R 67%). 5% drawdown odds within a month: 58%. Proposal: trim a third of the active weight."
}What it means
For LLY on the session of 2026-10-30: True now: Stretched: more than 2 ATR above the 20-day; Is the stock more than 10% above its 200-day moving average; CCI(20) above 150; Williams %R above −20. Forecasts: A 5% drawdown within a month 58%. Fired: trim (Email → pm-team).
The trim email needs price stretch and an oscillator to agree; the else branch documents that the weight was reviewed and kept.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "LLY"
},
"questions": {
"stretched": {
"type": "yes_no",
"ask": "C > sma(C, 20) + 2 * atr(14)"
},
"ext": {
"type": "yes_no",
"instructions": "Is the stock more than 10% above its 200-day moving average?"
},
"cci_hot": {
"type": "yes_no",
"ask": "cci(20) > 150"
},
"willr_top": {
"type": "yes_no",
"ask": "willr(14) > -20"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "trim",
"when": "stretched >= 0.6 and (cci_hot >= 0.6 or willr_top >= 0.6)",
"do": "email",
"connection": "pm-team",
"subject": "{{symbol}}: trim candidate ({{as_of}})",
"message": "{{symbol}} is 2 ATR over its 20-day with an overbought oscillator (CCI {{cci_hot|pct}}, Williams %R {{willr_top|pct}}). 5% drawdown odds within a month: {{drop5|pct}}. Proposal: trim a third of the active weight."
},
{
"id": "hold",
"when": "else",
"do": "email",
"connection": "pm-team",
"subject": "{{symbol}}: hold the weight",
"message": "{{symbol}} ({{as_of}}) is not stretched (rule {{stretched|pct}}). No trim proposed."
}
],
"dry_run": true
}Response JSON (LLY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"stretched": {
"yes_no": 0.919,
"rule": "C > sma(C, 20) + 2 * atr(14)",
"basis": "rule"
},
"ext": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200) * 1.1",
"basis": "comparison"
},
"cci_hot": {
"yes_no": 0.7458,
"rule": "cci(20) > 150",
"basis": "rule"
},
"willr_top": {
"yes_no": 0.6655,
"rule": "willr(14) > -20",
"basis": "rule"
},
"drop5": {
"yes_no": 0.583
}
},
"context": {
"symbol": "LLY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "trim",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "pm-team",
"preview": {
"subject": "LLY: trim candidate (2026-10-30)",
"text": "LLY is 2 ATR over its 20-day with an overbought oscillator (CCI 75%, Williams %R 67%). 5% drawdown odds within a month: 58%. Proposal: trim a third of the active weight."
}
},
{
"id": "hold",
"fired": false,
"status": "skipped"
}
]
}Portfolio manager (long-only) · example 3
Which holdings report in the next two weeks?
Before the earnings season, list the core holdings with a report coming and how they reacted last time.
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} then AMZN, JPM, UNH, COST, one request each. The server fills in the latest completed session.
Questions
soon | English → rule | Is earnings in the next 14 days? |
big_last | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
beat_streak | English → rule | Has the stock beaten EPS estimates in at least 3 of the last 4 quarters? |
pre_trend | rule | days_to_earnings <= 10 and C > sma(C, 50)Earnings within 10 days, above the 50-day |
Answers
| Symbol | soonrule | big_lastrule | beat_streakrule | pre_trendrule |
|---|---|---|---|---|
AAPL | 0.9463 | 0.9463 | 0.8591 | 0.9119 |
AMZN | 0.0537 | 0.0537 | 0.1409 | 0.0537 |
JPM | 0.0537 | 0.0664 | 0.1409 | 0.0537 |
UNH | 0.0537 | 0.0537 | 0.8591 | 0.0537 |
COST | 0.0537 | 0.0537 | 0.55 | 0.0537 |
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 earnings in the next 14 days: true for AAPL of 5. Last earnings move bigger than 5%: true for AAPL of 5. Has the stock beaten EPS estimates in at least 3 of the last 4 quarters: true for AAPL, UNH of 5. Earnings within 10 days, above the 50-day: true for AAPL of 5.
Names with a report close and a large last reaction are where position sizing matters most going into the print.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"soon": {
"type": "yes_no",
"instructions": "Is earnings in the next 14 days?"
},
"big_last": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
},
"beat_streak": {
"type": "yes_no",
"instructions": "Has the stock beaten EPS estimates in at least 3 of the last 4 quarters?"
},
"pre_trend": {
"type": "yes_no",
"ask": "days_to_earnings <= 10 and C > sma(C, 50)"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"soon": {
"yes_no": 0.9463,
"rule": "days_to_earnings <= 14",
"basis": "pattern"
},
"big_last": {
"yes_no": 0.9463,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
},
"beat_streak": {
"yes_no": 0.8591,
"rule": "beats_last4 >= 3",
"basis": "pattern"
},
"pre_trend": {
"yes_no": 0.9119,
"rule": "days_to_earnings <= 10 and C > sma(C, 50)",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 4
Sector tilt check: technology vs health care
Compare the two largest sector bets in the portfolio on trend, momentum and odds of beating the market.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XLK"} then XLV, one request each. The server fills in the latest completed session.
Questions
trend | 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 |
mom | rule | roc(C, 20) > 5Up more than 5% in 20 sessions |
linreg_up | rule | linreg(C, 50) > ref(linreg(C, 50), -10)50-day regression line rising over two weeks |
adx | rule | adx(14) > 20 and diplus(14) > diminus(14)Trending up (ADX over 20 and +DI over −DI) |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | momrule | linreg_uprule | adxrule | beat_spyforecast |
|---|---|---|---|---|---|
XLK | 0.0701 | 0.0537 | 0.1211 | 0.0637 | 0.498 |
XLV | 0.9384 | 0.9157 | 0.941 | 0.9042 | 0.534 |
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: Stacked averages: close > 20 EMA > 50 > 200: true for XLV of 2. Up more than 5% in 20 sessions: true for XLV of 2. 50-day regression line rising over two weeks: true for XLV of 2. Trending up (ADX over 20 and +DI over −DI): true for XLV of 2. Highest odds for “Beating SPY over a month”: XLV at 53%.
The sleeve with more trend rules true and better odds against SPY keeps its overweight; the weaker one is the funding source.
Request JSON (XLK; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLK"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
},
"mom": {
"type": "yes_no",
"ask": "roc(C, 20) > 5"
},
"linreg_up": {
"type": "yes_no",
"ask": "linreg(C, 50) > ref(linreg(C, 50), -10)"
},
"adx": {
"type": "yes_no",
"ask": "adx(14) > 20 and diplus(14) > diminus(14)"
},
"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": {
"trend": {
"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"
},
"mom": {
"yes_no": 0.0537,
"rule": "roc(C, 20) > 5",
"basis": "rule"
},
"linreg_up": {
"yes_no": 0.1211,
"rule": "linreg(C, 50) > ref(linreg(C, 50), -10)",
"basis": "rule"
},
"adx": {
"yes_no": 0.0637,
"rule": "adx(14) > 20 and diplus(14) > diminus(14)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.498
}
},
"context": {
"symbol": "XLK",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 5
NFLX post-earnings review for the investment committee
Summarize what the last report did: beat or miss, revenue growth, the gap and whether the stock holds above the pre-report close.
- StateNFLX
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"NFLX"} The server fills in the latest completed session.
Questions
beat_both | rule | beat_eps_last > 0.5 and beat_revenue_last > 0.5Beat on EPS and revenue last quarter |
rev_growth | English → rule | Did revenue grow more than 5% year over year? |
gap | rule | last_earnings_gap > 0Gapped up after the last report |
above_pre | rule | C > pre_earnings_closeHolding above the pre-earnings close |
eps_up | English → rule | Is EPS up year over year? |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
beat_bothBeat on EPS and revenue last quarter | 0.8591 | true |
rev_growthDid revenue grow more than 5% year over year compiled to revenue_growth_yoy > 5 | 0.9463 | true |
gapGapped up after the last report | 0.0537 | false |
above_preHolding above the pre-earnings close | 0.1227 | false |
eps_upIs EPS up year over year compiled to last_eps > eps_year_ago | 0.9463 | true |
up_weekHigher in a week | 0.506 | 51% · close to even |
Actions
Rules on the answers decide what to send.
beat_both >= 0.6→Slackinvestment-committeeelse→Slackinvestment-committee{
"text": "NFLX (2026-10-30): beat on EPS and revenue (86%), revenue growth over 5% 95%, holding above pre-earnings close 12%."
}What it means
For NFLX on the session of 2026-10-30: True now: Beat on EPS and revenue last quarter; Did revenue grow more than 5% year over year; Is EPS up year over year. Not true: Gapped up after the last report; Holding above the pre-earnings close. Forecasts: Higher in a week 51%. Fired: ic_note (Slack → investment-committee).
The committee gets one line either way: a beat summary, or a flag to revisit the thesis.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NFLX"
},
"questions": {
"beat_both": {
"type": "yes_no",
"ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
},
"rev_growth": {
"type": "yes_no",
"instructions": "Did revenue grow more than 5% year over year?"
},
"gap": {
"type": "yes_no",
"ask": "last_earnings_gap > 0"
},
"above_pre": {
"type": "yes_no",
"ask": "C > pre_earnings_close"
},
"eps_up": {
"type": "yes_no",
"instructions": "Is EPS up year over year?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "ic_note",
"when": "beat_both >= 0.6",
"do": "slack",
"connection": "investment-committee",
"message": "{{symbol}} ({{as_of}}): beat on EPS and revenue ({{beat_both|pct}}), revenue growth over 5% {{rev_growth|pct}}, holding above pre-earnings close {{above_pre|pct}}."
},
{
"id": "miss_note",
"when": "else",
"do": "slack",
"connection": "investment-committee",
"message": "{{symbol}} ({{as_of}}): did not beat on both lines ({{beat_both|pct}}). Thesis review on the agenda."
}
],
"dry_run": true
}Response JSON (NFLX, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"beat_both": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "rule"
},
"rev_growth": {
"yes_no": 0.9463,
"rule": "revenue_growth_yoy > 5",
"basis": "pattern"
},
"gap": {
"yes_no": 0.0537,
"rule": "last_earnings_gap > 0",
"basis": "rule"
},
"above_pre": {
"yes_no": 0.1227,
"rule": "C > pre_earnings_close",
"basis": "rule"
},
"eps_up": {
"yes_no": 0.9463,
"rule": "last_eps > eps_year_ago",
"basis": "pattern"
},
"up_week": {
"yes_no": 0.506
}
},
"context": {
"symbol": "NFLX",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "ic_note",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "investment-committee",
"preview": {
"text": "NFLX (2026-10-30): beat on EPS and revenue (86%), revenue growth over 5% 95%, holding above pre-earnings close 12%."
}
},
{
"id": "miss_note",
"fired": false,
"status": "skipped"
}
]
}beat_eps_last beat_revenue_last eps_year_ago last_earnings_gap last_eps pre_earnings_close revenue_growth_yoy
Portfolio manager (long-only) · example 6
Is the cap-weighted index leaving equal-weight behind?
A concentrated benchmark makes underweights painful; compare SPY with the equal-weight RSP on trend and momentum.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} then RSP, one request each. The server fills in the latest completed session.
Questions
mom3m | rule | C > C[-63]Higher than three months ago |
roc | rule | roc(C, 63) > 5Up more than 5% over three months |
near_high | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
ema_trend | 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 | mom3mrule | rocrule | near_highrule | ema_trendrule | beat_spyforecast |
|---|---|---|---|---|---|
SPY | 0.3809 | 0.0537 | 0.0834 | 0.123 | 0.514 |
RSP | 0.5971 | 0.1214 | 0.4049 | 0.8238 | 0.446 |
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: Higher than three months ago: true for none of 2. Up more than 5% over three months: true for none of 2. Within 2% of the 52-week high: true for none of 2. Above the 50-day exponential average: true for RSP of 2. Highest odds for “Beating SPY over a month”: SPY at 51%.
If SPY shows momentum that RSP lacks, breadth is narrow and the book's equal-ish weights will lag the benchmark.
Request JSON (SPY; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"mom3m": {
"type": "yes_no",
"ask": "C > C[-63]"
},
"roc": {
"type": "yes_no",
"ask": "roc(C, 63) > 5"
},
"near_high": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
},
"ema_trend": {
"type": "yes_no",
"ask": "C > ema(C, 50)"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"mom3m": {
"yes_no": 0.3809,
"rule": "C > C[-63]",
"basis": "rule"
},
"roc": {
"yes_no": 0.0537,
"rule": "roc(C, 63) > 5",
"basis": "rule"
},
"near_high": {
"yes_no": 0.0834,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"ema_trend": {
"yes_no": 0.123,
"rule": "C > ema(C, 50)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.514
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 7
Did UNH print a reversal candle near its lows?
A beaten-down holding: look for a morning star, piercing line or bullish harami before adding back.
- StateUNH
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"UNH"} The server fills in the latest completed session.
Questions
star | rule | morning_star()morning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first. |
piercing | rule | piercing_line()piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open). |
harami | rule | harami_bull()harami bull candle: A small green body inside yesterday's red body. |
near_low | English → rule | Is the stock within 10% of its 52-week low? |
below_200d | English → rule | Is the stock below its 200-day moving average? |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
starmorning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first. | 0.0925 | false |
piercingpiercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open). | 0.1039 | false |
haramiharami bull candle: A small green body inside yesterday's red body. | 0.1039 | false |
near_lowIs the stock within 10% of its 52-week low compiled to abs(C / min(L, 252) - 1) <= 0.1 | 0.0537 | false |
below_200dIs the stock below its 200-day moving average compiled to C < sma(C, 200) | 0.0537 | false |
up_weekHigher in a week | 0.485 | 49% · close to even |
What it means
For UNH on the session of 2026-10-30: Not true: morning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first.; piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open).; harami bull candle: A small green body inside yesterday's red body.; Is the stock within 10% of its 52-week low; Is the stock below its 200-day moving average. Forecasts: Higher in a week 49%.
A reversal candle near the 52-week low is a reason to re-examine the add, while the 200-day rule says whether the downtrend is still intact.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "UNH"
},
"questions": {
"star": {
"type": "yes_no",
"ask": "morning_star()"
},
"piercing": {
"type": "yes_no",
"ask": "piercing_line()"
},
"harami": {
"type": "yes_no",
"ask": "harami_bull()"
},
"near_low": {
"type": "yes_no",
"instructions": "Is the stock within 10% of its 52-week low?"
},
"below_200d": {
"type": "yes_no",
"instructions": "Is the stock below its 200-day moving average?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (UNH, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"star": {
"yes_no": 0.0925,
"rule": "morning_star()",
"basis": "rule"
},
"piercing": {
"yes_no": 0.1039,
"rule": "piercing_line()",
"basis": "rule"
},
"harami": {
"yes_no": 0.1039,
"rule": "harami_bull()",
"basis": "rule"
},
"near_low": {
"yes_no": 0.0537,
"rule": "abs(C / min(L, 252) - 1) <= 0.1",
"basis": "comparison"
},
"below_200d": {
"yes_no": 0.0537,
"rule": "C < sma(C, 200)",
"basis": "comparison"
},
"up_week": {
"yes_no": 0.485
}
},
"context": {
"symbol": "UNH",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 8
Quality dividend sleeve: who still qualifies?
Monthly screen of the dividend sleeve: pays, has grown for a decade, did not cut, and is above its 200-day.
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"JNJ"} then PG, PEP, KO, MCD, one request each. The server fills in the latest completed session.
Questions
grower | rule | years_of_growth >= 10Ten years of dividend growth |
no_cut | rule | cut_last < 0.5Did not cut its last dividend |
trend | English → rule | Is the stock above its 200-day moving average? |
yield | English → rule | Is the dividend yield above 3%? |
Answers
| Symbol | growerrule | no_cutrule | trendrule | yieldrule |
|---|---|---|---|---|
JNJ | 0.9463 | 0.8591 | 0.9454 | 0.0648 |
PG | 0.9463 | 0.8591 | 0.9431 | 0.2091 |
PEP | 0.9463 | 0.8591 | 0.1034 | 0.9463 |
KO | 0.9463 | 0.8591 | 0.9463 | 0.0537 |
MCD | 0.9463 | 0.8591 | 0.0657 | 0.0537 |
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: Ten years of dividend growth: true for JNJ, PG, PEP, KO, MCD of 5. Did not cut its last dividend: true for JNJ, PG, PEP, KO, MCD of 5. Is the stock above its 200-day moving average: true for JNJ, PG, KO of 5. Is the dividend yield above 3%: true for PEP of 5.
A name that fails the growth or no-cut fact leaves the sleeve; the trend rule decides whether new money goes in now or later.
Request JSON (JNJ; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JNJ"
},
"questions": {
"grower": {
"type": "yes_no",
"ask": "years_of_growth >= 10"
},
"no_cut": {
"type": "yes_no",
"ask": "cut_last < 0.5"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"yield": {
"type": "yes_no",
"instructions": "Is the dividend yield above 3%?"
}
}
}Response JSON (JNJ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"grower": {
"yes_no": 0.9463,
"rule": "years_of_growth >= 10",
"basis": "rule"
},
"no_cut": {
"yes_no": 0.8591,
"rule": "cut_last < 0.5",
"basis": "rule"
},
"trend": {
"yes_no": 0.9454,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"yield": {
"yes_no": 0.0648,
"rule": "div_yield_ttm > 3",
"basis": "pattern"
}
},
"context": {
"symbol": "JNJ",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 9
Daily breakdown watch on the top holdings
After each close, flag any top holding that closed below its 20-day low or crossed under its 50-day.
- ScheduleMon–Fri at 16:30 ET
- State6 symbols
- Questions3 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then MSFT, NVDA, AMZN, JPM, LLY, one request each. The server fills in the latest completed session.
Questions
breakdown | rule | C < lowest(L, 20)Closed under the 20-day low |
lose_50d | rule | crossdown(C, sma(C, 50))Closed below the 50-day today |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | breakdownrule | lose_50drule | drop5forecast | Fired |
|---|---|---|---|---|
AAPL | 0.0744 | 0.05 | 0.365 | none |
MSFT | 0.365 | 0.05 | 0.422 | none |
NVDA | 0.7554 | 0.05 | 0.523 | flag |
AMZN | 0.5418 | 0.05 | 0.462 | none |
JPM | 0.1005 | 0.95 | 0.30 | flag |
LLY | 0.0537 | 0.05 | 0.583 | 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.
breakdown >= 0.6 or lose_50d >= 0.6→Slackpm-desk{
"text": "NVDA (2026-10-30): broke its 20-day low (76%) or lost the 50-day (5%). 5% drawdown odds: 52%."
}{
"text": "JPM (2026-10-30): broke its 20-day low (10%) or lost the 50-day (95%). 5% drawdown odds: 30%."
}What it means
Session of 2026-10-30, 6 symbols: Closed under the 20-day low: true for NVDA of 6. Closed below the 50-day today: true for JPM of 6. Highest odds for “A 5% drawdown within a month”: LLY at 58%. flag fired for NVDA, JPM.
A quiet channel means no top holding broke a level; a message starts a thesis check, not an automatic sale.
As a scheduled workflow (Mon–Fri at 16:30 ET)
Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.
{
"name": "Daily breakdown watch on the top holdings",
"symbols": "AAPL MSFT NVDA AMZN JPM LLY",
"days": [
1,
2,
3,
4,
5
],
"at_time": "16:30",
"model": "ora-fin-0.1.1",
"questions": {
"breakdown": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"lose_50d": {
"type": "yes_no",
"ask": "crossdown(C, sma(C, 50))"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "flag",
"when": "breakdown >= 0.6 or lose_50d >= 0.6",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} ({{as_of}}): broke its 20-day low ({{breakdown|pct}}) or lost the 50-day ({{lose_50d|pct}}). 5% drawdown odds: {{drop5|pct}}."
}
]
}Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"breakdown": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"lose_50d": {
"type": "yes_no",
"ask": "crossdown(C, sma(C, 50))"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "flag",
"when": "breakdown >= 0.6 or lose_50d >= 0.6",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} ({{as_of}}): broke its 20-day low ({{breakdown|pct}}) or lost the 50-day ({{lose_50d|pct}}). 5% drawdown odds: {{drop5|pct}}."
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"breakdown": {
"yes_no": 0.0744,
"rule": "C < lowest(L, 20)",
"basis": "rule"
},
"lose_50d": {
"yes_no": 0.05,
"rule": "crossdown(C, sma(C, 50))",
"basis": "rule"
},
"drop5": {
"yes_no": 0.365
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "flag",
"fired": false,
"status": "skipped"
}
]
}Portfolio manager (long-only) · example 10
AAPL momentum quality: smooth trend or noisy spike?
Check whether the recent gains came with steady up days and rising volume, the kind of trend a long-only book prefers to hold.
- StateAAPL
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} The server fills in the latest completed session.
Questions
mostly_up | rule | sum(C > C[-1], 10) >= 6Up on at least six of the last ten days |
sign_sum | rule | sum(sign(C - C[-1]), 20) > 4At least 5 more up days than down days in 20 sessions |
obv | rule | obv() > sma(obv(), 20)On-balance volume above its 20-day average |
median_vol | rule | V > median(V, 20)Volume above its 20-day median |
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 |
|---|---|---|
mostly_upUp on at least six of the last ten days | 0.0615 | false |
sign_sumAt least 5 more up days than down days in 20 sessions | 0.109 | false |
obvOn-balance volume above its 20-day average | 0.2873 | false |
median_volVolume above its 20-day median | 0.9395 | true |
rally5A 5% rally within a month | 0.446 | 45% · close to even |
What it means
For AAPL on the session of 2026-10-30: True now: Volume above its 20-day median. Not true: Up on at least six of the last ten days; At least 5 more up days than down days in 20 sessions; On-balance volume above its 20-day average. Forecasts: A 5% rally within a month 45%.
Up days outnumbering down days with OBV rising describes accumulation; a trend built on one spike day reads differently.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"mostly_up": {
"type": "yes_no",
"ask": "sum(C > C[-1], 10) >= 6"
},
"sign_sum": {
"type": "yes_no",
"ask": "sum(sign(C - C[-1]), 20) > 4"
},
"obv": {
"type": "yes_no",
"ask": "obv() > sma(obv(), 20)"
},
"median_vol": {
"type": "yes_no",
"ask": "V > median(V, 20)"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"mostly_up": {
"yes_no": 0.0615,
"rule": "sum(C > C[-1], 10) >= 6",
"basis": "rule"
},
"sign_sum": {
"yes_no": 0.109,
"rule": "sum(sign(C - C[-1]), 20) > 4",
"basis": "rule"
},
"obv": {
"yes_no": 0.2873,
"rule": "obv() > sma(obv(), 20)",
"basis": "rule"
},
"median_vol": {
"yes_no": 0.9395,
"rule": "V > median(V, 20)",
"basis": "rule"
},
"rally5": {
"yes_no": 0.446
}
},
"context": {
"symbol": "AAPL",
"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: Financial advisor / RIA, Wealth manager, Family office, Hedge fund PM, Quant researcher, Risk manager, Private equity, VC / growth investor, Fund-of-funds allocator.