Use cases · Buy side
Risk manager: 20 ways to use Ora
Limits, drawdowns, volatility regimes and pre-trade checks, with escalations that write themselves. Each example is a complete, runnable request with the real answers it returned (52 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 (38)
offset 10sma 8atr 8log 5std 5max 5ref 5sqrt 4abs 3atr_pct 2avg 2percentrank 2swinglow 2crossdown 2rsi 2swinghigh 2min 1tr 1zscore 1days_to_earnings 1last_earnings_gap 1last_earnings_move 1highest 1lowest 1adx 1between 1gap_down 1gap_up 1gravestone_doji 1hanging_man 1harami_bear 1shooting_star 1iif 1willr 1marubozu 1outside_bar 1cut_last 1div_yield_ttm 1
Examples 11–20 of 20 · page 2 of 2
Risk manager · example 11
Crowded momentum: are the mega caps extended together?
When the biggest names are all stretched at once, the book's factor risk is concentrated; check each for extension.
- State4 symbols
- Questions3 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} then MSFT, NVDA, AMZN, one request each. The server fills in the latest completed session.
Questions
ext | English → rule | Is price extended more than 2 ATR above its 20-day average? |
pct_rank | rule | percentrank(C, 252) > 95Close in the top 5% of its 1-year range of closes |
rsi | rule | rsi(C, 14) > 70RSI above 70 |
Answers
| Symbol | extrule | pct_rankrule | rsirule |
|---|---|---|---|
AAPL | 0.114 | 0.8119 | 0.0657 |
MSFT | 0.0696 | 0.381 | 0.0537 |
NVDA | 0.0537 | 0.0537 | 0.0537 |
AMZN | 0.0537 | 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, 4 symbols: Is price extended more than 2 ATR above its 20-day average: true for none of 4. Close in the top 5% of its 1-year range of closes: true for AAPL of 4. RSI above 70: true for none of 4.
Several extended names at once mean a single factor reversal could hit the whole book; the risk team may ask for a hedge.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"ext": {
"type": "yes_no",
"instructions": "Is price extended more than 2 ATR above its 20-day average?"
},
"pct_rank": {
"type": "yes_no",
"ask": "percentrank(C, 252) > 95"
},
"rsi": {
"type": "yes_no",
"ask": "rsi(C, 14) > 70"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"ext": {
"yes_no": 0.114,
"rule": "C - sma(C, 20) > 2 * atr(14)",
"basis": "pattern"
},
"pct_rank": {
"yes_no": 0.8119,
"rule": "percentrank(C, 252) > 95",
"basis": "rule"
},
"rsi": {
"yes_no": 0.0657,
"rule": "rsi(C, 14) > 70",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}Risk manager · example 12
Overnight gap risk on NVDA
Before holding size overnight, check recent gap behavior and the odds of a gap tomorrow.
- StateNVDA
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
gap_vs_atr | rule | abs(O - C[-1]) > 0.5 * ref(atr(14), -1)Gap bigger than half an ATR |
unfilled_dn | rule | gap_down()gap down candle: Today's whole range is below yesterday's low. |
unfilled_up | rule | gap_up()gap up candle: Today's whole range is above yesterday's high: an unfilled gap up. |
gap_up | forecast | Will it gap up tomorrow? A gap up tomorrow |
gap_dn | forecast | Will it gap down tomorrow? A gap down tomorrow |
Answers
| Question | Answer | Reading |
|---|---|---|
gap_vs_atrGap bigger than half an ATR | 0.8363 | true |
unfilled_dngap down candle: Today's whole range is below yesterday's low. | 0.8033 | true |
unfilled_upgap up candle: Today's whole range is above yesterday's high: an unfilled gap up. | 0.0537 | false |
gap_upA gap up tomorrow | 0.191 | 19% · unlikely |
gap_dnA gap down tomorrow | 0.116 | 12% · unlikely |
What it means
For NVDA on the session of 2026-10-30: True now: Gap bigger than half an ATR; gap down candle: Today's whole range is below yesterday's low.. Not true: gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.. Forecasts: A gap up tomorrow 19%; A gap down tomorrow 12%.
Recent large gaps and higher gap odds argue for a smaller overnight position or an options hedge.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"gap_vs_atr": {
"type": "yes_no",
"ask": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)"
},
"unfilled_dn": {
"type": "yes_no",
"ask": "gap_down()"
},
"unfilled_up": {
"type": "yes_no",
"ask": "gap_up()"
},
"gap_up": {
"type": "yes_no",
"instructions": "Will it gap up tomorrow?"
},
"gap_dn": {
"type": "yes_no",
"instructions": "Will it gap down tomorrow?"
}
}
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"gap_vs_atr": {
"yes_no": 0.8363,
"rule": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)",
"basis": "rule"
},
"unfilled_dn": {
"yes_no": 0.8033,
"rule": "gap_down()",
"basis": "rule"
},
"unfilled_up": {
"yes_no": 0.0537,
"rule": "gap_up()",
"basis": "rule"
},
"gap_up": {
"yes_no": 0.191
},
"gap_dn": {
"yes_no": 0.116
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
}
}Risk manager · example 13
Bank book trend break: JPM, BAC, WFC, C
A sector concentration limit applies to banks; flag the sector when most names lose their 50-day together.
- State4 symbols
- Questions3 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"JPM"} then BAC, WFC, C, one request each. The server fills in the latest completed session.
Questions
below_50 | rule | C < sma(C, 50)Below the 50-day average |
lh | rule | swinghigh(3, 1) < swinghigh(3, 2)Lower swing high (strength 3) |
cross | rule | crossdown(C, sma(C, 50))Lost the 50-day today |
Answers
| Symbol | below_50rule | lhrule | crossrule |
|---|---|---|---|
JPM | 0.6966 | 0.1339 | 0.95 |
BAC | 0.9049 | 0.392 | 0.05 |
WFC | 0.6704 | 0.5023 | 0.95 |
C | 0.9235 | 0.1836 | 0.05 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 4 symbols: Below the 50-day average: true for JPM, BAC, WFC, C of 4. Lower swing high (strength 3): true for none of 4. Lost the 50-day today: true for JPM, WFC of 4.
If most of the bank names are below their 50-day, the sector limit is reviewed as a group rather than name by name.
Request JSON (JPM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JPM"
},
"questions": {
"below_50": {
"type": "yes_no",
"ask": "C < sma(C, 50)"
},
"lh": {
"type": "yes_no",
"ask": "swinghigh(3, 1) < swinghigh(3, 2)"
},
"cross": {
"type": "yes_no",
"ask": "crossdown(C, sma(C, 50))"
}
}
}Response JSON (JPM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"below_50": {
"yes_no": 0.6966,
"rule": "C < sma(C, 50)",
"basis": "rule"
},
"lh": {
"yes_no": 0.1339,
"rule": "swinghigh(3, 1) < swinghigh(3, 2)",
"basis": "rule"
},
"cross": {
"yes_no": 0.95,
"rule": "crossdown(C, sma(C, 50))",
"basis": "rule"
}
},
"context": {
"symbol": "JPM",
"as_of": "2026-10-30"
}
}Risk manager · example 14
Reversal candles on QQQ after a run
Shooting stars, gravestone dojis and bearish haramis at a high are early warnings for net exposure.
- StateQQQ
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"QQQ"} The server fills in the latest completed session.
Questions
star | 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. |
grave | rule | gravestone_doji()gravestone doji candle: Doji with a long upper wick and almost no lower wick. |
harami | rule | harami_bear()harami bear candle: A small red body inside yesterday's green body. |
hang | rule | hanging_man()hanging man candle: Hammer shape, closing above the close five bars back. |
near_high | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
down_week | forecast | Will the stock be lower in a week? Lower in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
starshooting 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 |
gravegravestone doji candle: Doji with a long upper wick and almost no lower wick. | 0.0537 | false |
haramiharami bear candle: A small red body inside yesterday's green body. | 0.0543 | false |
hanghanging man candle: Hammer shape, closing above the close five bars back. | 0.1466 | false |
near_highWithin 2% of the 52-week high | 0.0537 | false |
down_weekLower in a week | 0.534 | 53% · close to even |
What it means
For QQQ on the session of 2026-10-30: Not true: shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.; gravestone doji candle: Doji with a long upper wick and almost no lower wick.; harami bear candle: A small red body inside yesterday's green body.; hanging man candle: Hammer shape, closing above the close five bars back.; Within 2% of the 52-week high. Forecasts: Lower in a week 53%.
A topping candle near the high is a reason to check net exposure, not a short signal.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "QQQ"
},
"questions": {
"star": {
"type": "yes_no",
"ask": "shooting_star()"
},
"grave": {
"type": "yes_no",
"ask": "gravestone_doji()"
},
"harami": {
"type": "yes_no",
"ask": "harami_bear()"
},
"hang": {
"type": "yes_no",
"ask": "hanging_man()"
},
"near_high": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
},
"down_week": {
"type": "yes_no",
"instructions": "Will the stock be lower in a week?"
}
}
}Response JSON (QQQ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"star": {
"yes_no": 0.0537,
"rule": "shooting_star()",
"basis": "rule"
},
"grave": {
"yes_no": 0.0537,
"rule": "gravestone_doji()",
"basis": "rule"
},
"harami": {
"yes_no": 0.0543,
"rule": "harami_bear()",
"basis": "rule"
},
"hang": {
"yes_no": 0.1466,
"rule": "hanging_man()",
"basis": "rule"
},
"near_high": {
"yes_no": 0.0537,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"down_week": {
"yes_no": 0.534
}
},
"context": {
"symbol": "QQQ",
"as_of": "2026-10-30"
}
}Risk manager · example 15
Realized volatility inputs for the VaR model
Check whether short-term realized volatility has jumped above long-term, which signals that a VaR model with a long lookback underestimates risk.
- State3 symbols
- Questions3 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} then TLT, GLD, one request each. The server fills in the latest completed session.
Questions
vol_jump | rule | std(log(C / C[-1]), 10) > 1.5 * std(log(C / C[-1]), 120)10-day realized vol over 1.5x the 120-day |
atr_exp | rule | atr(14) > 1.2 * ref(atr(14), -10)ATR up 20% in two weeks |
hv30 | forecast | Will annualized volatility over the next 21 sessions exceed 30%? Next-month volatility above 30% |
Answers
| Symbol | vol_jumprule | atr_exprule | hv30forecast |
|---|---|---|---|
SPY | 0.0655 | 0.2117 | 0.564 |
TLT | 0.095 | 0.0537 | 0.497 |
GLD | 0.0537 | 0.0733 | 0.567 |
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: 10-day realized vol over 1.5x the 120-day: true for none of 3. ATR up 20% in two weeks: true for none of 3. Highest odds for “Next-month volatility above 30%”: GLD at 57%.
When short-term volatility runs well above long-term, the risk team adds a stressed-VaR overlay for that asset.
Request JSON (SPY; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"vol_jump": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 10) > 1.5 * std(log(C / C[-1]), 120)"
},
"atr_exp": {
"type": "yes_no",
"ask": "atr(14) > 1.2 * ref(atr(14), -10)"
},
"hv30": {
"type": "yes_no",
"instructions": "Will annualized volatility over the next 21 sessions exceed 30%?"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"vol_jump": {
"yes_no": 0.0655,
"rule": "std(log(C / C[-1]), 10) > 1.5 * std(log(C / C[-1]), 120)",
"basis": "rule"
},
"atr_exp": {
"yes_no": 0.2117,
"rule": "atr(14) > 1.2 * ref(atr(14), -10)",
"basis": "rule"
},
"hv30": {
"yes_no": 0.564
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}Risk manager · example 16
Counterparty watch: broker and bank equities
Equity weakness at a counterparty can lead credit events; monitor drawdowns and down-on-volume days at the firm's brokers.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"GS"} then SCHW, C, one request each. The server fills in the latest completed session.
Questions
dd | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
down_vol | rule | C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)Down on heavy volume |
ll | English → rule | Is the stock making lower swing highs and lower swing lows? |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Symbol | ddrule | down_volrule | llrule | drop10forecast | Fired |
|---|---|---|---|---|---|
GS | 0.706 | 0.0751 | 0.944 | 0.515 | watch |
SCHW | 0.7231 | 0.3005 | 0.793 | 0.511 | watch |
C | 0.1573 | 0.5062 | 0.8617 | 0.461 | 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.
dd >= 0.6 or (down_vol >= 0.6 and ll >= 0.6)→Webhookteams-risk{
"text": "Counterparty watch: GS (2026-10-30) drawdown over 20% 71%, heavy-volume selling 8%, 10% drop odds 52%."
}{
"text": "Counterparty watch: SCHW (2026-10-30) drawdown over 20% 72%, heavy-volume selling 30%, 10% drop odds 51%."
}What it means
Session of 2026-10-30, 3 symbols: More than 20% off the 52-week high: true for GS, SCHW of 3. Down on heavy volume: true for none of 3. Is the stock making lower swing highs and lower swing lows: true for GS, SCHW, C of 3. Highest odds for “A 10% drawdown within a month”: GS at 52%. watch fired for GS, SCHW.
A Teams post goes to the counterparty group only on a real drawdown or heavy-volume selling into lower lows.
Request JSON (GS; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "GS"
},
"questions": {
"dd": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"down_vol": {
"type": "yes_no",
"ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
},
"ll": {
"type": "yes_no",
"instructions": "Is the stock making lower swing highs and lower swing lows?"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
},
"actions": [
{
"id": "watch",
"when": "dd >= 0.6 or (down_vol >= 0.6 and ll >= 0.6)",
"do": "webhook",
"connection": "teams-risk",
"body": {
"text": "Counterparty watch: {{symbol}} ({{as_of}}) drawdown over 20% {{dd|pct}}, heavy-volume selling {{down_vol|pct}}, 10% drop odds {{drop10|pct}}."
}
}
],
"dry_run": true
}Response JSON (GS, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"dd": {
"yes_no": 0.706,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"down_vol": {
"yes_no": 0.0751,
"rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"ll": {
"yes_no": 0.944,
"rule": "(swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))",
"basis": "pattern"
},
"drop10": {
"yes_no": 0.515
}
},
"context": {
"symbol": "GS",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "watch",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "teams-risk",
"preview": {
"body": {
"text": "Counterparty watch: GS (2026-10-30) drawdown over 20% 71%, heavy-volume selling 8%, 10% drop odds 52%."
}
}
}
]
}Risk manager · example 17
Regime-aware oversold threshold for risk add-backs
Allow re-risking on oversold names only with a threshold that tightens in a downtrend.
- StateXLY
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XLY"} The server fills in the latest completed session.
Questions
oversold | rule | rsi(C, 14) < iif(C > sma(C, 200), 40, 25)RSI under 40 in an uptrend, under 25 in a downtrend |
regime | rule | (C > sma(C, 200) and rsi(C, 14) < 40) or (C < sma(C, 200) and rsi(C, 14) < 25)Oversold, with the line set by the trend |
willr | rule | willr(14) < -80Williams %R below -80 |
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 |
|---|---|---|
oversoldRSI under 40 in an uptrend, under 25 in a downtrend | 0.0626 | false |
regimeOversold, with the line set by the trend | 0.0679 | false |
willrWilliams %R below -80 | 0.0769 | false |
rally5A 5% rally within a month | 0.252 | 25% · unlikely |
What it means
For XLY on the session of 2026-10-30: Not true: RSI under 40 in an uptrend, under 25 in a downtrend; Oversold, with the line set by the trend; Williams %R below -80. Forecasts: A 5% rally within a month 25%.
The threshold changes with the regime, so the add-back rule asks for more pain before re-risking in a downtrend.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLY"
},
"questions": {
"oversold": {
"type": "yes_no",
"ask": "rsi(C, 14) < iif(C > sma(C, 200), 40, 25)"
},
"regime": {
"type": "yes_no",
"ask": "(C > sma(C, 200) and rsi(C, 14) < 40) or (C < sma(C, 200) and rsi(C, 14) < 25)"
},
"willr": {
"type": "yes_no",
"ask": "willr(14) < -80"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
}
}Response JSON (XLY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"oversold": {
"yes_no": 0.0626,
"rule": "rsi(C, 14) < iif(C > sma(C, 200), 40, 25)",
"basis": "rule"
},
"regime": {
"yes_no": 0.0679,
"rule": "(C > sma(C, 200) and rsi(C, 14) < 40) or (C < sma(C, 200) and rsi(C, 14) < 25)",
"basis": "rule"
},
"willr": {
"yes_no": 0.0769,
"rule": "willr(14) < -80",
"basis": "rule"
},
"rally5": {
"yes_no": 0.252
}
},
"context": {
"symbol": "XLY",
"as_of": "2026-10-30"
}
}Risk manager · example 18
Energy shock monitor: USO and XLE
Oil shocks spill into inflation-sensitive books; flag large moves and wide ranges in crude and energy equities.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"USO"} then XLE, one request each. The server fills in the latest completed session.
Questions
big | rule | abs(C - C[-1]) > 1.5 * atr(14)Today's move was bigger than 1.5 ATR |
wide | English → rule | Was today's range more than 1.5 ATR? |
outside | rule | outside_bar()outside bar candle: Today's high above yesterday's and low below it. |
marubozu | rule | marubozu()marubozu candle: Body at least 90% of the range: almost no wicks. |
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
| Symbol | bigrule | widerule | outsiderule | marubozurule | big5forecast |
|---|---|---|---|---|---|
USO | 0.0537 | 0.0537 | 0.0772 | 0.0717 | 0.403 |
XLE | 0.0975 | 0.0537 | 0.0814 | 0.1449 | 0.398 |
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: Today's move was bigger than 1.5 ATR: true for none of 2. Was today's range more than 1.5 ATR: true for none of 2. outside bar candle: Today's high above yesterday's and low below it.: true for none of 2. marubozu candle: Body at least 90% of the range: almost no wicks.: true for none of 2. Highest odds for “A big move either way in 5 days”: USO at 40%.
A full-bodied outside bar on an ATR-sized move is a shock day; the risk team checks inflation-sensitive positions next.
Request JSON (USO; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "USO"
},
"questions": {
"big": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"wide": {
"type": "yes_no",
"instructions": "Was today's range more than 1.5 ATR?"
},
"outside": {
"type": "yes_no",
"ask": "outside_bar()"
},
"marubozu": {
"type": "yes_no",
"ask": "marubozu()"
},
"big5": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
}
}Response JSON (USO, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"big": {
"yes_no": 0.0537,
"rule": "abs(C - C[-1]) > 1.5 * atr(14)",
"basis": "rule"
},
"wide": {
"yes_no": 0.0537,
"rule": "(H - L) > 1.5 * atr(14)",
"basis": "pattern"
},
"outside": {
"yes_no": 0.0772,
"rule": "outside_bar()",
"basis": "rule"
},
"marubozu": {
"yes_no": 0.0717,
"rule": "marubozu()",
"basis": "rule"
},
"big5": {
"yes_no": 0.403
}
},
"context": {
"symbol": "USO",
"as_of": "2026-10-30"
}
}Risk manager · example 19
Friday limit review: sector ETF stretch
Each Friday, check which sector exposures are stretched beyond two ATR from their 20-day, for next week's limit review.
- ScheduleFri at 16:45 ET
- State4 symbols
- Questions3 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"XLK"} then XLF, XLE, XLV, one request each. The server fills in the latest completed session.
Questions
up_stretch | English → rule | Is price extended more than 2 ATR above its 20-day average? |
down_stretch | rule | sma(C, 20) - C > 2 * atr(14)More than 2 ATR below the 20-day |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | up_stretchrule | down_stretchrule | drop5forecast | Fired |
|---|---|---|---|---|
XLK | 0.0537 | 0.7271 | 0.474 | review |
XLF | 0.3748 | 0.0641 | 0.199 | none |
XLE | 0.5464 | 0.0537 | 0.491 | none |
XLV | 0.8257 | 0.0537 | 0.371 | review |
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_stretch >= 0.6 or down_stretch >= 0.6→Emailrisk-committee{
"subject": "Limit review: XLK stretched (2026-10-30)",
"text": "XLK: up-stretch 5%, down-stretch 73%, 5% drawdown odds 47%."
}{
"subject": "Limit review: XLV stretched (2026-10-30)",
"text": "XLV: up-stretch 83%, down-stretch 5%, 5% drawdown odds 37%."
}What it means
Session of 2026-10-30, 4 symbols: Is price extended more than 2 ATR above its 20-day average: true for XLV of 4. More than 2 ATR below the 20-day: true for XLK of 4. Highest odds for “A 5% drawdown within a month”: XLE at 49%. review fired for XLK, XLV.
Stretched sleeves are put on the Monday committee agenda; others carry their limits forward.
As a scheduled workflow (Fri at 16:45 ET)
Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.
{
"name": "Friday limit review: sector ETF stretch",
"symbols": "XLK XLF XLE XLV",
"days": [
5
],
"at_time": "16:45",
"model": "ora-fin-0.1.1",
"questions": {
"up_stretch": {
"type": "yes_no",
"instructions": "Is price extended more than 2 ATR above its 20-day average?"
},
"down_stretch": {
"type": "yes_no",
"ask": "sma(C, 20) - C > 2 * atr(14)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "review",
"when": "up_stretch >= 0.6 or down_stretch >= 0.6",
"do": "email",
"connection": "risk-committee",
"subject": "Limit review: {{symbol}} stretched ({{as_of}})",
"message": "{{symbol}}: up-stretch {{up_stretch|pct}}, down-stretch {{down_stretch|pct}}, 5% drawdown odds {{drop5|pct}}."
}
]
}Request JSON (XLK; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLK"
},
"questions": {
"up_stretch": {
"type": "yes_no",
"instructions": "Is price extended more than 2 ATR above its 20-day average?"
},
"down_stretch": {
"type": "yes_no",
"ask": "sma(C, 20) - C > 2 * atr(14)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "review",
"when": "up_stretch >= 0.6 or down_stretch >= 0.6",
"do": "email",
"connection": "risk-committee",
"subject": "Limit review: {{symbol}} stretched ({{as_of}})",
"message": "{{symbol}}: up-stretch {{up_stretch|pct}}, down-stretch {{down_stretch|pct}}, 5% drawdown odds {{drop5|pct}}."
}
],
"dry_run": true
}Response JSON (XLK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"up_stretch": {
"yes_no": 0.0537,
"rule": "C - sma(C, 20) > 2 * atr(14)",
"basis": "pattern"
},
"down_stretch": {
"yes_no": 0.7271,
"rule": "sma(C, 20) - C > 2 * atr(14)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.474
}
},
"context": {
"symbol": "XLK",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "review",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "risk-committee",
"preview": {
"subject": "Limit review: XLK stretched (2026-10-30)",
"text": "XLK: up-stretch 5%, down-stretch 73%, 5% drawdown odds 47%."
}
}
]
}Risk manager · example 20
Dividend cut early warning in the income book
A dividend cut often follows a deep drawdown; check payers for cuts, drawdowns and broken trends.
- State3 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"T"} then VZ, MO, one request each. The server fills in the latest completed session.
Questions
cut | English → rule | Did the stock cut its dividend last time? |
dd | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
below | English → rule | Is the stock below its 200-day moving average? |
yield_high | English → rule | Is the dividend yield above 6%? |
raise | forecast | Will the company raise its dividend next year? Raising the dividend next year |
Answers
| Symbol | cutrule | ddrule | belowrule | yield_highrule | raiseforecast |
|---|---|---|---|---|---|
T | 0.1409 | 0.845 | 0.9326 | 0.0537 | 0.423 |
VZ | 0.1409 | 0.0879 | 0.6552 | 0.7708 | 0.442 |
MO | 0.1409 | 0.0537 | 0.0537 | 0.0537 | 0.551 |
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: Did the stock cut its dividend last time: true for none of 3. More than 20% off the 52-week high: true for T of 3. Is the stock below its 200-day moving average: true for T, VZ of 3. Is the dividend yield above 6%: true for VZ of 3. Highest odds for “Raising the dividend next year”: MO at 55%.
A high yield on a stock in a deep drawdown is a risk flag; the cut fact says whether the payout already broke.
Request JSON (T; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "T"
},
"questions": {
"cut": {
"type": "yes_no",
"instructions": "Did the stock cut its dividend last time?"
},
"dd": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"below": {
"type": "yes_no",
"instructions": "Is the stock below its 200-day moving average?"
},
"yield_high": {
"type": "yes_no",
"instructions": "Is the dividend yield above 6%?"
},
"raise": {
"type": "yes_no",
"instructions": "Will the company raise its dividend next year?"
}
}
}Response JSON (T, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"cut": {
"yes_no": 0.1409,
"rule": "cut_last > 0.5",
"basis": "pattern"
},
"dd": {
"yes_no": 0.845,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"below": {
"yes_no": 0.9326,
"rule": "C < sma(C, 200)",
"basis": "comparison"
},
"yield_high": {
"yes_no": 0.0537,
"rule": "div_yield_ttm > 6",
"basis": "pattern"
},
"raise": {
"yes_no": 0.423
}
},
"context": {
"symbol": "T",
"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, Portfolio manager (long-only), Private equity, VC / growth investor, Fund-of-funds allocator.