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 11–20 of 20 · page 2 of 2
Portfolio manager (long-only) · example 11
Can the fund build a position in CMG without moving the price?
Before building a new position, check average dollar volume and how wide the daily ranges are.
- StateCMG
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"CMG"} The server fills in the latest completed session.
Questions
liquid | rule | avg(C * V, 20) > 100000000Trades more than $100 million a day |
liquid_50m | English → rule | Does the stock trade more than $50 million a day on average? |
atr_low | English → rule | Is the 14-day ATR less than 2% of the price? |
wide_day | rule | tr() > 1.5 * ref(atr(14), -1)True range 1.5× yesterday's ATR |
vol_up | forecast | Will volatility be higher over the next month? Higher volatility next month |
Answers
| Question | Answer | Reading |
|---|---|---|
liquidTrades more than $100 million a day | 0.9463 | true |
liquid_50mDoes the stock trade more than $50 million a day on average compiled to avg(C * V, 20) > 50000000 | 0.9463 | true |
atr_lowIs the 14-day ATR less than 2% of the price compiled to atr(14) / C < 0.02 | 0.0537 | false |
wide_dayTrue range 1.5× yesterday's ATR | 0.1121 | false |
vol_upHigher volatility next month | 0.158 | 16% · unlikely |
What it means
For CMG on the session of 2026-10-30: True now: Trades more than $100 million a day; Does the stock trade more than $50 million a day on average. Not true: Is the 14-day ATR less than 2% of the price; True range 1.5× yesterday's ATR. Forecasts: Higher volatility next month 16%.
Ample dollar volume and moderate ranges mean the order can be worked over a few days; wide ranges argue for a slower build.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "CMG"
},
"questions": {
"liquid": {
"type": "yes_no",
"ask": "avg(C * V, 20) > 100000000"
},
"liquid_50m": {
"type": "yes_no",
"instructions": "Does the stock trade more than $50 million a day on average?"
},
"atr_low": {
"type": "yes_no",
"instructions": "Is the 14-day ATR less than 2% of the price?"
},
"wide_day": {
"type": "yes_no",
"ask": "tr() > 1.5 * ref(atr(14), -1)"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
}
}
}Response JSON (CMG, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"liquid": {
"yes_no": 0.9463,
"rule": "avg(C * V, 20) > 100000000",
"basis": "rule"
},
"liquid_50m": {
"yes_no": 0.9463,
"rule": "avg(C * V, 20) > 50000000",
"basis": "pattern"
},
"atr_low": {
"yes_no": 0.0537,
"rule": "atr(14) / C < 0.02",
"basis": "pattern"
},
"wide_day": {
"yes_no": 0.1121,
"rule": "tr() > 1.5 * ref(atr(14), -1)",
"basis": "rule"
},
"vol_up": {
"yes_no": 0.158
}
},
"context": {
"symbol": "CMG",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 12
Underweight NVDA: is the trend still running away?
Being underweight the largest benchmark name hurts; check whether its trend is strengthening or tiring before closing the gap.
- StateNVDA
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
adx | rule | adx(14) > 25Trending (ADX above 25) |
di | rule | diplus(14) > diminus(14)+DI above -DI (buyers in control) |
new_high | rule | highestbars(H, 20) <= 3Set its 20-day high in the last four sessions |
macd_hist | rule | macdhist(C) > ref(macdhist(C), -1)MACD histogram rising |
doji | rule | doji() and roc(C, 20) > 10Doji after a 10% month |
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.0578 | false |
di+DI above -DI (buyers in control) | 0.0637 | false |
new_highSet its 20-day high in the last four sessions | 0.0566 | false |
macd_histMACD histogram rising | 0.1232 | false |
dojiDoji after a 10% month | 0.0537 | false |
beat_spyBeating SPY over a month | 0.499 | 50% · close to even |
Actions
Rules on the answers decide what to send.
adx >= 0.6 and di >= 0.6 and beat_spy >= 0.55→Webhookomselse→Slackpm-desk{
"text": "NVDA (2026-10-30): trend strength 6%, buyers in control 6%, beat SPY 50%. Keeping the underweight for now."
}What it means
For NVDA on the session of 2026-10-30: Not true: Trending (ADX above 25); +DI above -DI (buyers in control); Set its 20-day high in the last four sessions; MACD histogram rising; Doji after a 10% month. Forecasts: Beating SPY over a month 50%. Fired: wait (Slack → pm-desk).
A strong, buyer-led trend with decent odds against SPY sends an order intent to the OMS; otherwise the desk gets a note that the underweight stays.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"adx": {
"type": "yes_no",
"ask": "adx(14) > 25"
},
"di": {
"type": "yes_no",
"ask": "diplus(14) > diminus(14)"
},
"new_high": {
"type": "yes_no",
"ask": "highestbars(H, 20) <= 3"
},
"macd_hist": {
"type": "yes_no",
"ask": "macdhist(C) > ref(macdhist(C), -1)"
},
"doji": {
"type": "yes_no",
"ask": "doji() and roc(C, 20) > 10"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
},
"actions": [
{
"id": "close_gap",
"when": "adx >= 0.6 and di >= 0.6 and beat_spy >= 0.55",
"do": "webhook",
"connection": "oms",
"body": {
"symbol": "{{symbol}}",
"intent": "raise_toward_benchmark_weight",
"p_adx": "{{adx}}",
"p_beat_spy": "{{beat_spy}}",
"as_of": "{{as_of}}"
}
},
{
"id": "wait",
"when": "else",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} ({{as_of}}): trend strength {{adx|pct}}, buyers in control {{di|pct}}, beat SPY {{beat_spy|pct}}. Keeping the underweight for now."
}
],
"dry_run": true
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"adx": {
"yes_no": 0.0578,
"rule": "adx(14) > 25",
"basis": "rule"
},
"di": {
"yes_no": 0.0637,
"rule": "diplus(14) > diminus(14)",
"basis": "rule"
},
"new_high": {
"yes_no": 0.0566,
"rule": "highestbars(H, 20) <= 3",
"basis": "rule"
},
"macd_hist": {
"yes_no": 0.1232,
"rule": "macdhist(C) > ref(macdhist(C), -1)",
"basis": "rule"
},
"doji": {
"yes_no": 0.0537,
"rule": "doji() and roc(C, 20) > 10",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.499
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "close_gap",
"fired": false,
"status": "skipped"
},
{
"id": "wait",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "pm-desk",
"preview": {
"text": "NVDA (2026-10-30): trend strength 6%, buyers in control 6%, beat SPY 50%. Keeping the underweight for now."
}
}
]
}Portfolio manager (long-only) · example 13
Topping candles on COST at the highs?
A long-held winner near its highs: check for an evening star, bearish engulfing or dark cloud cover.
- StateCOST
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"COST"} The server fills in the latest completed session.
Questions
evening | rule | evening_star()evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first. |
engulf | rule | engulfing_bear()engulfing bear candle: A red body that engulfs yesterday's green body. |
cloud | rule | dark_cloud()dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open). |
near_high | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
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 |
|---|---|---|
eveningevening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first. | 0.0678 | false |
engulfengulfing bear candle: A red body that engulfs yesterday's green body. | 0.0912 | false |
clouddark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open). | 0.0812 | false |
near_highWithin 2% of the 52-week high | 0.0786 | false |
drop5A 5% drawdown within a month | 0.319 | 32% · unlikely |
What it means
For COST on the session of 2026-10-30: Not true: evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.; engulfing bear candle: A red body that engulfs yesterday's green body.; dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).; Within 2% of the 52-week high. Forecasts: A 5% drawdown within a month 32%.
A bearish candle at the high is a prompt to check the thesis and the weight, not an exit signal on its own.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "COST"
},
"questions": {
"evening": {
"type": "yes_no",
"ask": "evening_star()"
},
"engulf": {
"type": "yes_no",
"ask": "engulfing_bear()"
},
"cloud": {
"type": "yes_no",
"ask": "dark_cloud()"
},
"near_high": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
}
}Response JSON (COST, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"evening": {
"yes_no": 0.0678,
"rule": "evening_star()",
"basis": "rule"
},
"engulf": {
"yes_no": 0.0912,
"rule": "engulfing_bear()",
"basis": "rule"
},
"cloud": {
"yes_no": 0.0812,
"rule": "dark_cloud()",
"basis": "rule"
},
"near_high": {
"yes_no": 0.0786,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.319
}
},
"context": {
"symbol": "COST",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 14
Pre-open earnings season digest for the PM
Each morning in season, list holdings that reported in the last day and whether they beat.
- ScheduleMon–Fri at 08:00 ET
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"JPM"} then BAC, WFC, GS, C, one request each. The server fills in the latest completed session.
Questions
reported | English → rule | Did the stock report earnings in the last 1 days? |
beat | English → rule | Did the stock beat EPS estimates last quarter? |
gap | English → rule | Did the stock gap up after its last earnings? |
big | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
Answers
| Symbol | reportedrule | beatrule | gaprule | bigrule | Fired |
|---|---|---|---|---|---|
JPM | 0.0537 | 0.1409 | 0.9463 | 0.0664 | none |
BAC | 0.0537 | 0.1409 | 0.0537 | 0.4222 | none |
WFC | 0.0537 | 0.8591 | 0.0537 | 0.0537 | none |
GS | 0.0537 | 0.8591 | 0.9463 | 0.0599 | none |
C | 0.0537 | 0.8591 | 0.0537 | 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.
reported >= 0.6→EmailmeWhat it means
Session of 2026-10-30, 5 symbols: Did the stock report earnings in the last 1 days: true for none of 5. Did the stock beat EPS estimates last quarter: true for WFC, GS, C of 5. Did the stock gap up after its last earnings: true for JPM, GS of 5. Last earnings move bigger than 5%: true for C of 5. reported_note fired for none.
Only names that just reported produce mail, so the inbox mirrors the earnings calendar of the book.
As a scheduled workflow (Mon–Fri at 08:00 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": "Pre-open earnings season digest for the PM",
"symbols": "JPM BAC WFC GS C",
"days": [
1,
2,
3,
4,
5
],
"at_time": "08:00",
"model": "ora-fin-0.1.1",
"questions": {
"reported": {
"type": "yes_no",
"instructions": "Did the stock report earnings in the last 1 days?"
},
"beat": {
"type": "yes_no",
"instructions": "Did the stock beat EPS estimates last quarter?"
},
"gap": {
"type": "yes_no",
"instructions": "Did the stock gap up after its last earnings?"
},
"big": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
}
},
"actions": [
{
"id": "reported_note",
"when": "reported >= 0.6",
"do": "email",
"connection": "me",
"subject": "{{symbol}} reported ({{as_of}})",
"message": "{{symbol}} reported. Beat EPS {{beat|pct}}, gapped up {{gap|pct}}, reaction over 5% {{big|pct}}."
}
]
}Request JSON (JPM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JPM"
},
"questions": {
"reported": {
"type": "yes_no",
"instructions": "Did the stock report earnings in the last 1 days?"
},
"beat": {
"type": "yes_no",
"instructions": "Did the stock beat EPS estimates last quarter?"
},
"gap": {
"type": "yes_no",
"instructions": "Did the stock gap up after its last earnings?"
},
"big": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
}
},
"actions": [
{
"id": "reported_note",
"when": "reported >= 0.6",
"do": "email",
"connection": "me",
"subject": "{{symbol}} reported ({{as_of}})",
"message": "{{symbol}} reported. Beat EPS {{beat|pct}}, gapped up {{gap|pct}}, reaction over 5% {{big|pct}}."
}
],
"dry_run": true
}Response JSON (JPM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"reported": {
"yes_no": 0.0537,
"rule": "days_since_earnings <= 1",
"basis": "pattern"
},
"beat": {
"yes_no": 0.1409,
"rule": "beat_eps_last > 0.5",
"basis": "pattern"
},
"gap": {
"yes_no": 0.9463,
"rule": "last_earnings_gap > 0",
"basis": "pattern"
},
"big": {
"yes_no": 0.0664,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
}
},
"context": {
"symbol": "JPM",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "reported_note",
"fired": false,
"status": "skipped"
}
]
}abs beat_eps_last days_since_earnings last_earnings_gap last_earnings_move
Portfolio manager (long-only) · example 15
DIS: deep drawdown or still in a range?
A value holding: measure how far it sits from its 52-week high and whether the decline is slowing.
- StateDIS
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"DIS"} The server fills in the latest completed session.
Questions
dd20 | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
lowbars | rule | lowestbars(L, 60) >= 20The 60-day low is at least 20 sessions old |
zlow | rule | zscore(C, 20) < -2Two deviations under the 20-day mean |
higher_lows | rule | min(L, 5) > ref(min(L, 5), -5)This week's low is above last week's |
rally10 | forecast | Will it rally at least 10% at some point in the next month? A 10% rally within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
dd20More than 20% off the 52-week high | 0.0537 | false |
lowbarsThe 60-day low is at least 20 sessions old | 0.5435 | on the line (true) |
zlowTwo deviations under the 20-day mean | 0.0621 | false |
higher_lowsThis week's low is above last week's | 0.4398 | on the line (false) |
rally10A 10% rally within a month | 0.36 | 36% · unlikely |
What it means
For DIS on the session of 2026-10-30: Not true: More than 20% off the 52-week high; Two deviations under the 20-day mean. On the line: The 60-day low is at least 20 sessions old; This week's low is above last week's. Forecasts: A 10% rally within a month 36%.
An old low with higher weekly lows says selling has slowed; a fresh low means patience before adding.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "DIS"
},
"questions": {
"dd20": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"lowbars": {
"type": "yes_no",
"ask": "lowestbars(L, 60) >= 20"
},
"zlow": {
"type": "yes_no",
"ask": "zscore(C, 20) < -2"
},
"higher_lows": {
"type": "yes_no",
"ask": "min(L, 5) > ref(min(L, 5), -5)"
},
"rally10": {
"type": "yes_no",
"instructions": "Will it rally at least 10% at some point in the next month?"
}
}
}Response JSON (DIS, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"dd20": {
"yes_no": 0.0537,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"lowbars": {
"yes_no": 0.5435,
"rule": "lowestbars(L, 60) >= 20",
"basis": "rule"
},
"zlow": {
"yes_no": 0.0621,
"rule": "zscore(C, 20) < -2",
"basis": "rule"
},
"higher_lows": {
"yes_no": 0.4398,
"rule": "min(L, 5) > ref(min(L, 5), -5)",
"basis": "rule"
},
"rally10": {
"yes_no": 0.36
}
},
"context": {
"symbol": "DIS",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 16
Quarterly rebalance: which sector ETFs ran furthest?
Rank the sector sleeves by how stretched they are versus their 200-day before the quarterly rebalance.
- State6 symbols
- Questions3 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XLF"} then XLE, XLI, XLY, XLP, XLU, one request each. The server fills in the latest completed session.
Questions
ext | rule | C > sma(C, 200) * 1.10More than 10% above the 200-day |
near_200 | rule | abs(C / sma(C, 200) - 1) < 0.03Within 3% of the 200-day |
mom | rule | roc(C, 63) > 10 and C >= 0.95 * max(H, 63)Up more than 10% in a quarter, near the high |
Answers
| Symbol | extrule | near_200rule | momrule |
|---|---|---|---|
XLF | 0.1018 | 0.185 | 0.0785 |
XLE | 0.9463 | 0.0537 | 0.9336 |
XLI | 0.0548 | 0.4522 | 0.0537 |
XLY | 0.0537 | 0.9113 | 0.0537 |
XLP | 0.1053 | 0.0736 | 0.0812 |
XLU | 0.0537 | 0.7477 | 0.0549 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 6 symbols: More than 10% above the 200-day: true for XLE of 6. Within 3% of the 200-day: true for XLY, XLU of 6. Up more than 10% in a quarter, near the high: true for XLE of 6.
Sleeves far above their 200-day are trimmed back to target first; sleeves near it are where new money goes.
Request JSON (XLF; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLF"
},
"questions": {
"ext": {
"type": "yes_no",
"ask": "C > sma(C, 200) * 1.10"
},
"near_200": {
"type": "yes_no",
"ask": "abs(C / sma(C, 200) - 1) < 0.03"
},
"mom": {
"type": "yes_no",
"ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
}
}
}Response JSON (XLF, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"ext": {
"yes_no": 0.1018,
"rule": "C > sma(C, 200) * 1.10",
"basis": "rule"
},
"near_200": {
"yes_no": 0.185,
"rule": "abs(C / sma(C, 200) - 1) < 0.03",
"basis": "rule"
},
"mom": {
"yes_no": 0.0785,
"rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
"basis": "rule"
}
},
"context": {
"symbol": "XLF",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 17
A holding gapped down: PYPL triage
When a holding opens sharply lower, decide quickly whether the gap is being bought or extending.
- StatePYPL
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"PYPL"} The server fills in the latest completed session.
Questions
gap_down | rule | gap_down()gap down candle: Today's whole range is below yesterday's low. |
reclaimed | rule | O < L[-1] and C > C[-1]Opened under yesterday's low, closed up on the day |
close_low | rule | (C - L) / (H - L) < 0.25Closed in the bottom quarter of the day's range |
down_vol | rule | C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)Down on heavy volume |
fill | forecast | Will the gap fill within 5 sessions? |
Answers
| Question | Answer | Reading |
|---|---|---|
gap_downgap down candle: Today's whole range is below yesterday's low. | 0.1328 | false |
reclaimedOpened under yesterday's low, closed up on the day | 0.2205 | false |
close_lowClosed in the bottom quarter of the day's range | 0.1933 | false |
down_volDown on heavy volume | 0.3255 | false |
fillWill the gap fill within 5 sessions | 0.336 | 34% · unlikely |
Actions
Rules on the answers decide what to send.
gap_down >= 0.6 and down_vol >= 0.6→Slackpm-deskWhat it means
For PYPL on the session of 2026-10-30: Not true: gap down candle: Today's whole range is below yesterday's low.; Opened under yesterday's low, closed up on the day; Closed in the bottom quarter of the day's range; Down on heavy volume. Forecasts: Will the gap fill within 5 sessions 34%. No action fired: every rule was false.
A gap down on heavy volume that closes near the low is an escalation; a reclaimed gap is usually noise for a long-only holder.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "PYPL"
},
"questions": {
"gap_down": {
"type": "yes_no",
"ask": "gap_down()"
},
"reclaimed": {
"type": "yes_no",
"ask": "O < L[-1] and C > C[-1]"
},
"close_low": {
"type": "yes_no",
"ask": "(C - L) / (H - L) < 0.25"
},
"down_vol": {
"type": "yes_no",
"ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
},
"fill": {
"type": "yes_no",
"instructions": "Will the gap fill within 5 sessions?"
}
},
"actions": [
{
"id": "escalate",
"when": "gap_down >= 0.6 and down_vol >= 0.6",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} ({{as_of}}): unfilled gap down on heavy volume. Gap fill within 5 sessions: {{fill|pct}}. Call with the analyst at 14:00."
}
],
"dry_run": true
}Response JSON (PYPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"gap_down": {
"yes_no": 0.1328,
"rule": "gap_down()",
"basis": "rule"
},
"reclaimed": {
"yes_no": 0.2205,
"rule": "O < L[-1] and C > C[-1]",
"basis": "rule"
},
"close_low": {
"yes_no": 0.1933,
"rule": "(C - L) / (H - L) < 0.25",
"basis": "rule"
},
"down_vol": {
"yes_no": 0.3255,
"rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"fill": {
"yes_no": 0.336
}
},
"context": {
"symbol": "PYPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "escalate",
"fired": false,
"status": "skipped"
}
]
}Portfolio manager (long-only) · example 18
HD trend with a smoothed filter
Use a slower, smoothed trend line to avoid reacting to every wiggle in a core holding.
- StateHD
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"HD"} The server fills in the latest completed session.
Questions
rec_trend | rule | C > rec(C, self + 0.05 * (C - self))Above a smoothed recursive trend line |
rma | rule | C > rma(C, 50)Above the 50-day Wilder average |
mean100 | rule | C > mean(C, 100)Above the 100-day average |
hlc3_trend | rule | hlc3() > sma(hlc3(), 20)Typical price above its 20-day 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 |
|---|---|---|
rec_trendAbove a smoothed recursive trend line | 0.8929 | true |
rmaAbove the 50-day Wilder average | 0.8048 | true |
mean100Above the 100-day average | 0.699 | true |
hlc3_trendTypical price above its 20-day average | 0.9195 | true |
drop5A 5% drawdown within a month | 0.457 | 46% · close to even |
What it means
For HD on the session of 2026-10-30: True now: Above a smoothed recursive trend line; Above the 50-day Wilder average; Above the 100-day average; Typical price above its 20-day average. Forecasts: A 5% drawdown within a month 46%.
When the slow filters agree the holding stays untouched; disagreement between them is a cue to look more closely.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "HD"
},
"questions": {
"rec_trend": {
"type": "yes_no",
"ask": "C > rec(C, self + 0.05 * (C - self))"
},
"rma": {
"type": "yes_no",
"ask": "C > rma(C, 50)"
},
"mean100": {
"type": "yes_no",
"ask": "C > mean(C, 100)"
},
"hlc3_trend": {
"type": "yes_no",
"ask": "hlc3() > sma(hlc3(), 20)"
},
"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": {
"rec_trend": {
"yes_no": 0.8929,
"rule": "C > rec(C, self + 0.05 * (C - self))",
"basis": "rule"
},
"rma": {
"yes_no": 0.8048,
"rule": "C > rma(C, 50)",
"basis": "rule"
},
"mean100": {
"yes_no": 0.699,
"rule": "C > mean(C, 100)",
"basis": "rule"
},
"hlc3_trend": {
"yes_no": 0.9195,
"rule": "hlc3() > sma(hlc3(), 20)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.457
}
},
"context": {
"symbol": "HD",
"as_of": "2026-10-30"
}
}Portfolio manager (long-only) · example 19
Corporate-action housekeeping on WMT and NVDA
Before reconciling share counts and income, check recent splits and dividend changes.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"WMT"} then NVDA, one request each. The server fills in the latest completed session.
Questions
split_3y | rule | days_since_split <= 1095Split in the last three years |
ratio | rule | last_split_ratio >= 4Last split at least 4-for-1 |
raised | rule | raised_last > 0.5Raised its last dividend |
ex_soon | rule | days_to_ex_div <= 30Goes ex-dividend within 30 days |
split_next | rule | days_to_split <= 365A split is announced |
Answers
| Symbol | split_3yrule | ratiorule | raisedrule | ex_soonrule | split_nextrule |
|---|---|---|---|---|---|
WMT | 0.9463 | 0.0683 | 0.1409 | 0.0537 | 0.0537 |
NVDA | 0.9463 | 0.9463 | 0.1409 | 0.0537 | 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, 2 symbols: Split in the last three years: true for WMT, NVDA of 2. Last split at least 4-for-1: true for NVDA of 2. Raised its last dividend: true for none of 2. Goes ex-dividend within 30 days: true for none of 2.
Split and dividend facts tell operations which positions need a share-count or accrual check this month.
Request JSON (WMT; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "WMT"
},
"questions": {
"split_3y": {
"type": "yes_no",
"ask": "days_since_split <= 1095"
},
"ratio": {
"type": "yes_no",
"ask": "last_split_ratio >= 4"
},
"raised": {
"type": "yes_no",
"ask": "raised_last > 0.5"
},
"ex_soon": {
"type": "yes_no",
"ask": "days_to_ex_div <= 30"
},
"split_next": {
"type": "yes_no",
"ask": "days_to_split <= 365"
}
}
}Response JSON (WMT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"split_3y": {
"yes_no": 0.9463,
"rule": "days_since_split <= 1095",
"basis": "rule"
},
"ratio": {
"yes_no": 0.0683,
"rule": "last_split_ratio >= 4",
"basis": "rule"
},
"raised": {
"yes_no": 0.1409,
"rule": "raised_last > 0.5",
"basis": "rule"
},
"ex_soon": {
"yes_no": 0.0537,
"rule": "days_to_ex_div <= 30",
"basis": "rule"
},
"split_next": {
"yes_no": 0.0537,
"rule": "days_to_split <= 365",
"basis": "rule"
}
},
"context": {
"symbol": "WMT",
"as_of": "2026-10-30"
}
}days_since_split days_to_ex_div days_to_split last_split_ratio raised_last
Portfolio manager (long-only) · example 20
Consumer holdings: is weakness spreading?
Check two consumer holdings for lower swing highs and lows and closes under their 50-day.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TGT"} then LOW, one request each. The server fills in the latest completed session.
Questions
lh_ll | English → rule | Is the stock making lower swing highs and lower swing lows? |
below_50 | rule | C < sma(C, 50)Below the 50-day average |
lower_high | rule | swinghigh(5, 1) < swinghigh(5, 2)Latest swing high below the one before |
three_crows | rule | three_black_crows()three black crows candle: Three red bars, each closing lower and opening inside the previous body. |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Symbol | lh_llrule | below_50rule | lower_highrule | three_crowsrule | drop10forecast |
|---|---|---|---|---|---|
TGT | 0.5531 | 0.6641 | 0.5531 | 0.0931 | 0.489 |
LOW | 0.0537 | 0.0998 | 0.0537 | 0.0537 | 0.575 |
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 stock making lower swing highs and lower swing lows: true for none of 2. Below the 50-day average: true for TGT of 2. Latest swing high below the one before: true for none of 2. three black crows candle: Three red bars, each closing lower and opening inside the previous body.: true for none of 2. Highest odds for “A 10% drawdown within a month”: LOW at 57%.
Lower highs and lows in both names point to a sector problem rather than a single-stock one.
Request JSON (TGT; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TGT"
},
"questions": {
"lh_ll": {
"type": "yes_no",
"instructions": "Is the stock making lower swing highs and lower swing lows?"
},
"below_50": {
"type": "yes_no",
"ask": "C < sma(C, 50)"
},
"lower_high": {
"type": "yes_no",
"ask": "swinghigh(5, 1) < swinghigh(5, 2)"
},
"three_crows": {
"type": "yes_no",
"ask": "three_black_crows()"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
}
}Response JSON (TGT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"lh_ll": {
"yes_no": 0.5531,
"rule": "(swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))",
"basis": "pattern"
},
"below_50": {
"yes_no": 0.6641,
"rule": "C < sma(C, 50)",
"basis": "rule"
},
"lower_high": {
"yes_no": 0.5531,
"rule": "swinghigh(5, 1) < swinghigh(5, 2)",
"basis": "rule"
},
"three_crows": {
"yes_no": 0.0931,
"rule": "three_black_crows()",
"basis": "rule"
},
"drop10": {
"yes_no": 0.489
}
},
"context": {
"symbol": "TGT",
"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.