Use cases · Builders
Robo-advisor: 20 ways to use Ora
Automated portfolios: rebalancing triggers, tax-loss harvesting candidates and risk dials. Each example is a complete, runnable request with the real answers it returned (43 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 (25)
sma 16offset 9max 7atr 6ref 5log 4sqrt 4std 4pays_dividend 3div_yield_ttm 2lowest 2macd 1macdsignal 1zscore 1div_count_ttm 1roc 1min 1adx 1diminus 1diplus 1avg 1bblower 1cci 1ema 1rsi 1
Examples 11–20 of 20 · page 2 of 2
Robo-advisor · example 11
Emerging markets guardrail: EEM and IEMG
Limit new purchases into emerging markets when volatility is elevated and the trend is down.
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"EEM"} then IEMG, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
adx | rule | adx(14) > 25 and diminus(14) > diplus(14)a strong trend (ADX above 25) with sellers in control |
atr | rule | atr(14) > 1.2 * ref(atr(14), -10)ATR up 20% in two weeks |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | trendrule | adxrule | atrrule | drop5forecast | Fired |
|---|---|---|---|---|---|
EEM | 0.1449 | 0.8639 | 0.1307 | 0.422 | throttle |
IEMG | 0.1343 | 0.8685 | 0.1522 | 0.414 | throttle |
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.
adx >= 0.6 and trend < 0.4→Webhookorder-throttle{
"sleeve": "EEM",
"max_buy_fraction": 0.5,
"reason": "strong_downtrend",
"p_downtrend": 0.8639,
"as_of": "2026-10-30"
}{
"sleeve": "IEMG",
"max_buy_fraction": 0.5,
"reason": "strong_downtrend",
"p_downtrend": 0.8685,
"as_of": "2026-10-30"
}What it means
Session of 2026-10-30, 2 symbols: Is the stock above its 200-day moving average: true for none of 2. a strong trend (ADX above 25) with sellers in control: true for EEM, IEMG of 2. ATR up 20% in two weeks: true for none of 2. Highest odds for “A 5% drawdown within a month”: EEM at 42%. throttle fired for EEM, IEMG.
Throttling halves new buys rather than stopping them, so the model keeps averaging in while the downtrend lasts.
Request JSON (EEM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "EEM"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"adx": {
"type": "yes_no",
"ask": "adx(14) > 25 and diminus(14) > diplus(14)"
},
"atr": {
"type": "yes_no",
"ask": "atr(14) > 1.2 * ref(atr(14), -10)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "throttle",
"when": "adx >= 0.6 and trend < 0.4",
"do": "webhook",
"connection": "order-throttle",
"body": {
"sleeve": "{{symbol}}",
"max_buy_fraction": 0.5,
"reason": "strong_downtrend",
"p_downtrend": "{{adx}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (EEM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.1449,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"adx": {
"yes_no": 0.8639,
"rule": "adx(14) > 25 and diminus(14) > diplus(14)",
"basis": "rule"
},
"atr": {
"yes_no": 0.1307,
"rule": "atr(14) > 1.2 * ref(atr(14), -10)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.422
}
},
"context": {
"symbol": "EEM",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "throttle",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "order-throttle",
"preview": {
"body": {
"sleeve": "EEM",
"max_buy_fraction": 0.5,
"reason": "strong_downtrend",
"p_downtrend": 0.8639,
"as_of": "2026-10-30"
}
}
}
]
}Robo-advisor · example 12
Credit watch for the high-yield sleeve: HYG and JNK
Spot stress in high-yield bond funds early: breakdowns, volume spikes and rising volatility.
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"HYG"} then JNK, one request each. The server fills in the latest completed session.
Questions
breakdown | rule | C < lowest(L, 20)Closed under the 20-day low |
vol | rule | V > 2 * ref(avg(V, 20), -1)Volume more than twice the previous 20-day average |
stress | rule | C < bblower(C, 20, 2.5)close under a 2.5 standard-deviation lower band |
vol_rise | forecast | Will volatility rise over the next 5 days? Volatility rising over 5 days |
Answers
| Symbol | breakdownrule | volrule | stressrule | vol_riseforecast | Fired |
|---|---|---|---|---|---|
HYG | 0.0811 | 0.0911 | 0.0607 | 0.383 | none |
JNK | 0.0813 | 0.1352 | 0.0618 | 0.406 | 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 stress >= 0.6→Slackinvestment-committeeWhat it means
Session of 2026-10-30, 2 symbols: Closed under the 20-day low: true for none of 2. Volume more than twice the previous 20-day average: true for none of 2. close under a 2.5 standard-deviation lower band: true for none of 2. Highest odds for “Volatility rising over 5 days”: JNK at 41%. credit_flag fired for none.
Credit funds move slowly, so a breakdown on volume is an early signal for the committee, not an automatic sale.
Request JSON (HYG; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "HYG"
},
"questions": {
"breakdown": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"vol": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"stress": {
"type": "yes_no",
"ask": "C < bblower(C, 20, 2.5)"
},
"vol_rise": {
"type": "yes_no",
"instructions": "Will volatility rise over the next 5 days?"
}
},
"actions": [
{
"id": "credit_flag",
"when": "breakdown >= 0.6 or stress >= 0.6",
"do": "slack",
"connection": "investment-committee",
"message": "{{symbol}} ({{as_of}}): high-yield stress. 20-day breakdown {{breakdown|pct}}, below the 2.5-sigma band {{stress|pct}}, volume spike {{vol|pct}}."
}
],
"dry_run": true
}Response JSON (HYG, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"breakdown": {
"yes_no": 0.0811,
"rule": "C < lowest(L, 20)",
"basis": "rule"
},
"vol": {
"yes_no": 0.0911,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"stress": {
"yes_no": 0.0607,
"rule": "C < bblower(C, 20, 2.5)",
"basis": "rule"
},
"vol_rise": {
"yes_no": 0.383
}
},
"context": {
"symbol": "HYG",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "credit_flag",
"fired": false,
"status": "skipped"
}
]
}Robo-advisor · example 13
Gold hedge sleeve: is GLD trending and calm enough to add?
Add to the gold hedge only when the trend is intact and the fund is not stretched.
- StateGLD
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"GLD"} 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 |
stretched | rule | C > sma(C, 20) + 2 * atr(14)Stretched: more than 2 ATR above the 20-day |
cci | rule | cci(20) > 200CCI above 200: very extended |
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 |
|---|---|---|
trendStacked averages: close > 20 EMA > 50 > 200 | 0.0537 | false |
stretchedStretched: more than 2 ATR above the 20-day | 0.063 | false |
cciCCI above 200: very extended | 0.0537 | false |
drop5A 5% drawdown within a month | 0.435 | 44% · close to even |
What it means
For GLD on the session of 2026-10-30: Not true: Stacked averages: close > 20 EMA > 50 > 200; Stretched: more than 2 ATR above the 20-day; CCI above 200: very extended. Forecasts: A 5% drawdown within a month 44%.
An intact but stretched trend waits for a pullback; the hedge is added on calm days so it is not bought at a spike.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "GLD"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
},
"stretched": {
"type": "yes_no",
"ask": "C > sma(C, 20) + 2 * atr(14)"
},
"cci": {
"type": "yes_no",
"ask": "cci(20) > 200"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
}
}Response JSON (GLD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.0537,
"rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"stretched": {
"yes_no": 0.063,
"rule": "C > sma(C, 20) + 2 * atr(14)",
"basis": "rule"
},
"cci": {
"yes_no": 0.0537,
"rule": "cci(20) > 200",
"basis": "rule"
},
"drop5": {
"yes_no": 0.435
}
},
"context": {
"symbol": "GLD",
"as_of": "2026-10-30"
}
}Robo-advisor · example 14
First-purchase timing for new clients: spread the buy if SPY is stretched
When a new client funds an account, decide whether to invest at once or in three tranches based on how stretched the market is.
- StateSPY
- Questions4 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
stretched | English → rule | Is price extended more than 2 ATR above its 20-day average? |
rsi70 | rule | rsi(C, 14) > 70RSI above 70 |
ext200 | English → rule | Is the stock more than 10% above its 200-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 |
|---|---|---|
stretchedIs price extended more than 2 ATR above its 20-day average compiled to C - sma(C, 20) > 2 * atr(14) | 0.0537 | false |
rsi70RSI above 70 | 0.0537 | false |
ext200Is the stock more than 10% above its 200-day moving average compiled to C > sma(C, 200) * 1.1 | 0.0537 | false |
drop5A 5% drawdown within a month | 0.203 | 20% · unlikely |
Actions
Rules on the answers decide what to send.
stretched >= 0.6 or rsi70 >= 0.6→Webhookonboardingelse→Webhookonboarding{
"plan": "lump_sum",
"as_of": "2026-10-30"
}What it means
For SPY on the session of 2026-10-30: Not true: Is price extended more than 2 ATR above its 20-day average; RSI above 70; Is the stock more than 10% above its 200-day moving average. Forecasts: A 5% drawdown within a month 20%. Fired: lump (Webhook → onboarding).
Either plan ends fully invested; the rule only chooses how fast, which keeps the choice simple to explain.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"stretched": {
"type": "yes_no",
"instructions": "Is price extended more than 2 ATR above its 20-day average?"
},
"rsi70": {
"type": "yes_no",
"ask": "rsi(C, 14) > 70"
},
"ext200": {
"type": "yes_no",
"instructions": "Is the stock more than 10% above its 200-day moving average?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "tranches",
"when": "stretched >= 0.6 or rsi70 >= 0.6",
"do": "webhook",
"connection": "onboarding",
"body": {
"plan": "three_tranches",
"weeks_apart": 2,
"reason": "market_stretched",
"as_of": "{{as_of}}"
}
},
{
"id": "lump",
"when": "else",
"do": "webhook",
"connection": "onboarding",
"body": {
"plan": "lump_sum",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"stretched": {
"yes_no": 0.0537,
"rule": "C - sma(C, 20) > 2 * atr(14)",
"basis": "pattern"
},
"rsi70": {
"yes_no": 0.0537,
"rule": "rsi(C, 14) > 70",
"basis": "rule"
},
"ext200": {
"yes_no": 0.0537,
"rule": "C > sma(C, 200) * 1.1",
"basis": "comparison"
},
"drop5": {
"yes_no": 0.203
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "tranches",
"fired": false,
"status": "skipped"
},
{
"id": "lump",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "onboarding",
"preview": {
"body": {
"plan": "lump_sum",
"as_of": "2026-10-30"
}
}
}
]
}Robo-advisor · example 15
Thematic sleeve check: clean energy funds ICLN and TAN
Thematic sleeves are volatile; check trend, volatility and drawdown before the quarterly top-up.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"ICLN"} then TAN, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
hv | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
dd | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
rally10 | forecast | Will it rally at least 10% at some point in the next month? A 10% rally within a month |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Symbol | trendrule | hvrule | ddrule | rally10forecast | drop10forecast |
|---|---|---|---|---|---|
ICLN | 0.0537 | 0.0537 | 0.9463 | 0.622 | 0.547 |
TAN | 0.0537 | 0.0733 | 0.9463 | 0.701 | 0.61 |
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 above its 200-day moving average: true for none of 2. Annualized 20-day volatility above 40%: true for none of 2. More than 20% off the 52-week high: true for ICLN, TAN of 2. Highest odds for “A 10% rally within a month”: TAN at 70%.
Thematic funds can sit far below their highs for long periods; the top-up keeps to the policy weight and the forecasts only set the pace.
Request JSON (ICLN; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "ICLN"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"dd": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"rally10": {
"type": "yes_no",
"instructions": "Will it rally at least 10% at some point in the next month?"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
}
}Response JSON (ICLN, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.0537,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"hv": {
"yes_no": 0.0537,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
"basis": "rule"
},
"dd": {
"yes_no": 0.9463,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"rally10": {
"yes_no": 0.622
},
"drop10": {
"yes_no": 0.547
}
},
"context": {
"symbol": "ICLN",
"as_of": "2026-10-30"
}
}Robo-advisor · example 16
Small-cap sleeve: IWM, IJR and VB trend agreement
Only tilt toward small caps when all three small-cap funds agree on trend.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"IWM"} then IJR, VB, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 50)Above the 50-day average |
golden | English → rule | Is the 50-day moving average above the 200-day? |
momentum | English → rule | Is the stock up over the last month? |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | goldenrule | momentumrule | beat_spyforecast |
|---|---|---|---|---|
IWM | 0.2176 | 0.8318 | 0.5236 | 0.459 |
IJR | 0.5379 | 0.8644 | 0.8142 | 0.46 |
VB | 0.3698 | 0.8951 | 0.703 | 0.462 |
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: Above the 50-day average: true for none of 3. Is the 50-day moving average above the 200-day: true for IWM, IJR, VB of 3. Is the stock up over the last month: true for IJR, VB of 3. Highest odds for “Beating SPY over a month”: VB at 46%.
Agreement across three funds filters out one fund's noise; the tilt is applied only if every fund's trend rule is true.
Request JSON (IWM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "IWM"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"golden": {
"type": "yes_no",
"instructions": "Is the 50-day moving average above the 200-day?"
},
"momentum": {
"type": "yes_no",
"instructions": "Is the stock up over the last month?"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (IWM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.2176,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"golden": {
"yes_no": 0.8318,
"rule": "sma(C, 50) > sma(C, 200)",
"basis": "comparison"
},
"momentum": {
"yes_no": 0.5236,
"rule": "C > C[-21]",
"basis": "pattern"
},
"beat_spy": {
"yes_no": 0.459
}
},
"context": {
"symbol": "IWM",
"as_of": "2026-10-30"
}
}Robo-advisor · example 17
Weekly model report for the investment committee
Every Monday, email the committee a one-line status per core fund: trend, drawdown and next-month odds.
- ScheduleMon at 07:30 ET
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"VTI"} then VXUS, BND, BNDX, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
dd | rule | C < 0.8 * max(H, 252)More than 20% off 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 |
rally5 | forecast | Will it rally at least 5% at some point in the next month? A 5% rally within a month |
Answers
| Symbol | trendrule | ddrule | drop5forecast | rally5forecast | Fired |
|---|---|---|---|---|---|
VTI | 0.9415 | 0.0537 | 0.187 | 0.204 | line |
VXUS | 0.3255 | 0.0537 | 0.233 | 0.269 | line |
BND | 0.2013 | 0.0537 | 0.007 | 0.007 | line |
BNDX | 0.2297 | 0.0537 | 0.006 | 0.006 | line |
true false not known for rules; forecasts are odds. Hover a column for its question.
Actions
Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.
trend >= 0→Emailinvestment-committee{
"subject": "Model status VTI (2026-10-30)",
"text": "VTI: above the 200-day 94%, 20% drawdown 5%, 5% drop within a month 19%, 5% rally within a month 20%."
}{
"subject": "Model status VXUS (2026-10-30)",
"text": "VXUS: above the 200-day 33%, 20% drawdown 5%, 5% drop within a month 23%, 5% rally within a month 27%."
}{
"subject": "Model status BND (2026-10-30)",
"text": "BND: above the 200-day 20%, 20% drawdown 5%, 5% drop within a month 1%, 5% rally within a month 1%."
}{
"subject": "Model status BNDX (2026-10-30)",
"text": "BNDX: above the 200-day 23%, 20% drawdown 5%, 5% drop within a month 1%, 5% rally within a month 1%."
}What it means
Session of 2026-10-30, 4 symbols: Is the stock above its 200-day moving average: true for VTI of 4. More than 20% off the 52-week high: true for none of 4. Highest odds for “A 5% drawdown within a month”: VXUS at 23%. line fired for VTI, VXUS, BND, BNDX.
The committee sees the same four numbers for every core fund each week, which makes changes easy to spot.
As a scheduled workflow (Mon at 07:30 ET)
Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.
{
"name": "Weekly model report for the investment committee",
"symbols": "VTI VXUS BND BNDX",
"days": [
1
],
"at_time": "07:30",
"model": "ora-fin-0.1.1",
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"dd": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "line",
"when": "trend >= 0",
"do": "email",
"connection": "investment-committee",
"subject": "Model status {{symbol}} ({{as_of}})",
"message": "{{symbol}}: above the 200-day {{trend|pct}}, 20% drawdown {{dd|pct}}, 5% drop within a month {{drop5|pct}}, 5% rally within a month {{rally5|pct}}."
}
]
}Request JSON (VTI; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "VTI"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"dd": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "line",
"when": "trend >= 0",
"do": "email",
"connection": "investment-committee",
"subject": "Model status {{symbol}} ({{as_of}})",
"message": "{{symbol}}: above the 200-day {{trend|pct}}, 20% drawdown {{dd|pct}}, 5% drop within a month {{drop5|pct}}, 5% rally within a month {{rally5|pct}}."
}
],
"dry_run": true
}Response JSON (VTI, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9415,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"dd": {
"yes_no": 0.0537,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.187
},
"rally5": {
"yes_no": 0.204
}
},
"context": {
"symbol": "VTI",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "line",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "investment-committee",
"preview": {
"subject": "Model status VTI (2026-10-30)",
"text": "VTI: above the 200-day 94%, 20% drawdown 5%, 5% drop within a month 19%, 5% rally within a month 20%."
}
}
]
}Robo-advisor · example 18
Municipal bond sleeve for taxable accounts: MUB and VTEB
Check the tax-exempt bond funds for trend and calm before routing new taxable-account cash into them.
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MUB"} then VTEB, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 50)Above the 50-day average |
calm | English → rule | Is the 14-day ATR less than 2% of the price? |
pays | rule | pays_dividend > 0.5Pays a dividend |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Symbol | trendrule | calmrule | paysrule | up_weekforecast |
|---|---|---|---|---|
MUB | 0.8666 | 0.9463 | 0.8591 | 0.588 |
VTEB | 0.8783 | 0.9463 | 0.8591 | 0.561 |
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: Above the 50-day average: true for MUB, VTEB of 2. Is the 14-day ATR less than 2% of the price: true for MUB, VTEB of 2. Pays a dividend: true for MUB, VTEB of 2. Highest odds for “Higher in a week”: MUB at 59%.
Munis are a placement choice for taxable accounts; these checks only confirm nothing unusual is happening before the cash moves.
Request JSON (MUB; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MUB"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"calm": {
"type": "yes_no",
"instructions": "Is the 14-day ATR less than 2% of the price?"
},
"pays": {
"type": "yes_no",
"ask": "pays_dividend > 0.5"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (MUB, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.8666,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"calm": {
"yes_no": 0.9463,
"rule": "atr(14) / C < 0.02",
"basis": "pattern"
},
"pays": {
"yes_no": 0.8591,
"rule": "pays_dividend > 0.5",
"basis": "rule"
},
"up_week": {
"yes_no": 0.588
}
},
"context": {
"symbol": "MUB",
"as_of": "2026-10-30"
}
}Robo-advisor · example 19
Volatility-targeted equity weight from SPY's realized and forecast volatility
Scale the equity weight down when realized volatility and the next-month forecast are both high.
- StateSPY
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
hv20 | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.220-day realized volatility above 20% a year |
vol5 | English → rule | Is 5-day volatility higher than 20-day volatility? |
hv_next | forecast | Will annualized volatility over the next 21 sessions exceed 30%? Next-month volatility above 30% |
vol_up | forecast | Will volatility be higher over the next month? Higher volatility next month |
Answers
| Question | Answer | Reading |
|---|---|---|
hv2020-day realized volatility above 20% a year | 0.0537 | false |
vol5Is 5-day volatility higher than 20-day volatility compiled to std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19) | 0.8872 | true |
hv_nextNext-month volatility above 30% | 0.564 | 56% · close to even |
vol_upHigher volatility next month | 0.69 | 69% · likely |
What it means
For SPY on the session of 2026-10-30: True now: Is 5-day volatility higher than 20-day volatility. Not true: 20-day realized volatility above 20% a year. Forecasts: Next-month volatility above 30% 56%; Higher volatility next month 69%.
The weight formula uses realized volatility today and the forecast for the month; both are logged with the trade for audit.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"hv20": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.2"
},
"vol5": {
"type": "yes_no",
"instructions": "Is 5-day volatility higher than 20-day volatility?"
},
"hv_next": {
"type": "yes_no",
"instructions": "Will annualized volatility over the next 21 sessions exceed 30%?"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"hv20": {
"yes_no": 0.0537,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.2",
"basis": "rule"
},
"vol5": {
"yes_no": 0.8872,
"rule": "std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19)",
"basis": "pattern"
},
"hv_next": {
"yes_no": 0.564
},
"vol_up": {
"yes_no": 0.69
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}Robo-advisor · example 20
Single-stock concentration review for clients holding AAPL
Clients with a large employer or legacy position in AAPL get a review flag when the stock is stretched or breaking down.
- StateAAPL
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} 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 |
breakdown | rule | C < lowest(L, 20)Closed under the 20-day low |
chandelier | English → rule | Has the stock closed below its chandelier stop (22-day high minus 3 ATR)? |
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 |
|---|---|---|
stretchedStretched: more than 2 ATR above the 20-day | 0.114 | false |
breakdownClosed under the 20-day low | 0.0744 | false |
chandelierHas the stock closed below its chandelier stop (22-day high minus 3 ATR) compiled to C < max(H, 22) - 3 * atr(22) | 0.1232 | false |
drop10A 10% drawdown within a month | 0.365 | 37% · unlikely |
Actions
Rules on the answers decide what to send.
stretched >= 0.6 or breakdown >= 0.6 or chandelier >= 0.6→Emailadvisor-queueWhat it means
For AAPL on the session of 2026-10-30: Not true: Stretched: more than 2 ATR above the 20-day; Closed under the 20-day low; Has the stock closed below its chandelier stop (22-day high minus 3 ATR). Forecasts: A 10% drawdown within a month 37%. No action fired: every rule was false.
The robo flags; a human advisor talks to the client, because concentrated positions have tax and personal context the rules cannot see.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"stretched": {
"type": "yes_no",
"ask": "C > sma(C, 20) + 2 * atr(14)"
},
"breakdown": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"chandelier": {
"type": "yes_no",
"instructions": "Has the stock closed below its chandelier stop (22-day high minus 3 ATR)?"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
},
"actions": [
{
"id": "review",
"when": "stretched >= 0.6 or breakdown >= 0.6 or chandelier >= 0.6",
"do": "email",
"connection": "advisor-queue",
"subject": "Concentration review: {{symbol}}",
"message": "{{symbol}} ({{as_of}}) is stretched ({{stretched|pct}}) or breaking down ({{breakdown|pct}}, chandelier {{chandelier|pct}}). Review clients with a concentrated position."
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"stretched": {
"yes_no": 0.114,
"rule": "C > sma(C, 20) + 2 * atr(14)",
"basis": "rule"
},
"breakdown": {
"yes_no": 0.0744,
"rule": "C < lowest(L, 20)",
"basis": "rule"
},
"chandelier": {
"yes_no": 0.1232,
"rule": "C < max(H, 22) - 3 * atr(22)",
"basis": "pattern"
},
"drop10": {
"yes_no": 0.365
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "review",
"fired": false,
"status": "skipped"
}
]
}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 Builders: Quant developer, Fintech app builder, Broker app, Algo / bot developer, Data vendor / platform, Trading educator / newsletter.