Use cases · Builders
Broker app: 20 ways to use Ora
Pre-trade warnings, event badges and smart alerts for millions of self-directed accounts. Each example is a complete, runnable request with the real answers it returned (37 requests, captured 2026-10-31), what they mean and, where it fits, the action it would send.
ora-fin-0.1.1. Another model changes the request JSON and the Playground link; run it there to see its answers.Rule functions and facts used by this player (36)
offset 8sma 7atr 5log 3sqrt 3std 3max 3ref 3days_to_earnings 2avg 2highest 2lowest 2days_since_split 2days_to_ex_div 2days_to_split 2rsi 2abs 1last_earnings_move 1next_report_amc 1atr_pct 1tr 1gap_down 1gap_up 1div_yield_ttm 1raised_last 1years_of_growth 1days_since_reverse_split 1reverse_split_last 1adx 1ema 1bbupper 1macd 1hanging_man 1shooting_star 1three_black_crows 1inside_bar 1
Examples 1–10 of 20 · page 1 of 2
Broker app · example 1
Pre-trade warning: 'NVDA reports soon' on the buy ticket
Show a warning on the order ticket when a customer buys a stock that reports within a few days and moves a lot on reports.
- StateNVDA
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
soon | rule | days_to_earnings <= 10Reports earnings within 10 days |
big | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
amc | English → rule | Does the stock report after the close next time? |
move5 | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
soonReports earnings within 10 days | 0.0563 | false |
bigLast earnings move bigger than 5% | 0.9463 | true |
amcDoes the stock report after the close next time compiled to next_report_amc > 0.5 | 0.8591 | true |
move5A big move either way in 5 days | 0.318 | 32% · unlikely |
Actions
Rules on the answers decide what to send.
soon >= 0.6→Webhookticket-bannersWhat it means
For NVDA on the session of 2026-10-30: True now: Last earnings move bigger than 5%; Does the stock report after the close next time. Not true: Reports earnings within 10 days. Forecasts: A big move either way in 5 days 32%. No action fired: every rule was false.
The ticket shows an informational banner; it never blocks the order, and the wording comes from the fact rules, not the forecast.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"soon": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"big": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
},
"amc": {
"type": "yes_no",
"instructions": "Does the stock report after the close next time?"
},
"move5": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
},
"actions": [
{
"id": "ticket_warning",
"when": "soon >= 0.6",
"do": "webhook",
"connection": "ticket-banners",
"body": {
"symbol": "{{symbol}}",
"banner": "earnings_soon",
"large_past_reaction": "{{big}}",
"reports_after_close": "{{amc}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"soon": {
"yes_no": 0.0563,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"big": {
"yes_no": 0.9463,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
},
"amc": {
"yes_no": 0.8591,
"rule": "next_report_amc > 0.5",
"basis": "pattern"
},
"move5": {
"yes_no": 0.318
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "ticket_warning",
"fired": false,
"status": "skipped"
}
]
}Broker app · example 2
Require an acknowledgement before buying a leveraged ETF in a volatile week (SQQQ)
Ask customers to confirm they understand daily-reset risk when a leveraged fund is in a high-volatility regime.
- StateSQQQ
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"SQQQ"} The server fills in the latest completed session.
Questions
atr | English → rule | Is the 14-day ATR more than 3% of the price? |
hv | English → rule | Is 20-day historical volatility above 40%? |
wide | English → rule | Was today's range more than 1.5 ATR? |
vol_rise | forecast | Will volatility rise over the next 5 days? Volatility rising over 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
atrIs the 14-day ATR more than 3% of the price compiled to atr(14) / C > 0.03 | 0.934 | true |
hvIs 20-day historical volatility above 40% compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4 | 0.9339 | true |
wideWas today's range more than 1.5 ATR compiled to (H - L) > 1.5 * atr(14) | 0.1926 | false |
vol_riseVolatility rising over 5 days | 0.232 | 23% · unlikely |
Actions
Rules on the answers decide what to send.
atr >= 0.6 or hv >= 0.6→Webhookticket-banners{
"symbol": "SQQQ",
"banner": "leveraged_volatility_ack",
"require_ack": true,
"p_atr_over_3": 0.934,
"p_hv_over_40": 0.9339,
"as_of": "2026-10-30"
}What it means
For SQQQ on the session of 2026-10-30: True now: Is the 14-day ATR more than 3% of the price; Is 20-day historical volatility above 40%. Not true: Was today's range more than 1.5 ATR. Forecasts: Volatility rising over 5 days 23%. Fired: ack (Webhook → ticket-banners).
The acknowledgement depends on exact volatility rules; it is the same for every customer on that day, which keeps it fair and auditable.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SQQQ"
},
"questions": {
"atr": {
"type": "yes_no",
"instructions": "Is the 14-day ATR more than 3% of the price?"
},
"hv": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility above 40%?"
},
"wide": {
"type": "yes_no",
"instructions": "Was today's range more than 1.5 ATR?"
},
"vol_rise": {
"type": "yes_no",
"instructions": "Will volatility rise over the next 5 days?"
}
},
"actions": [
{
"id": "ack",
"when": "atr >= 0.6 or hv >= 0.6",
"do": "webhook",
"connection": "ticket-banners",
"body": {
"symbol": "{{symbol}}",
"banner": "leveraged_volatility_ack",
"require_ack": true,
"p_atr_over_3": "{{atr}}",
"p_hv_over_40": "{{hv}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (SQQQ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"atr": {
"yes_no": 0.934,
"rule": "atr(14) / C > 0.03",
"basis": "pattern"
},
"hv": {
"yes_no": 0.9339,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4",
"basis": "pattern"
},
"wide": {
"yes_no": 0.1926,
"rule": "(H - L) > 1.5 * atr(14)",
"basis": "pattern"
},
"vol_rise": {
"yes_no": 0.232
}
},
"context": {
"symbol": "SQQQ",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "ack",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "ticket-banners",
"preview": {
"body": {
"symbol": "SQQQ",
"banner": "leveraged_volatility_ack",
"require_ack": true,
"p_atr_over_3": 0.934,
"p_hv_over_40": 0.9339,
"as_of": "2026-10-30"
}
}
}
]
}Broker app · example 3
Smart price alerts: 'MSFT made a new 52-week high'
Replace fixed price alerts with event alerts customers understand: new highs, new lows and breakouts.
- StateMSFT
- Questions4 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"MSFT"} The server fills in the latest completed session.
Questions
high | English → rule | Did the stock make a new 52-week high today? |
low | English → rule | Did the stock make a new 20-day low today? |
breakout | rule | C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)20-day breakout on 1.5× volume |
near | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
Answers
| Question | Answer | Reading |
|---|---|---|
highDid the stock make a new 52-week high today compiled to H > highest(H, 252) | 0.0968 | false |
lowDid the stock make a new 20-day low today compiled to L < lowest(L, 20) | 0.487 | on the line (false) |
breakout20-day breakout on 1.5× volume | 0.0604 | false |
nearWithin 2% of the 52-week high | 0.1327 | false |
Actions
Rules on the answers decide what to send.
high >= 0.6→Webhookpush-gatewaylow >= 0.6→Webhookpush-gatewayWhat it means
For MSFT on the session of 2026-10-30: Not true: Did the stock make a new 52-week high today; 20-day breakout on 1.5× volume; Within 2% of the 52-week high. On the line: Did the stock make a new 20-day low today. No action fired: every rule was false.
Each event is a separate branch, so a customer subscribed to highs never gets a low alert by accident.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"high": {
"type": "yes_no",
"instructions": "Did the stock make a new 52-week high today?"
},
"low": {
"type": "yes_no",
"instructions": "Did the stock make a new 20-day low today?"
},
"breakout": {
"type": "yes_no",
"ask": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)"
},
"near": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
}
},
"actions": [
{
"id": "high_push",
"when": "high >= 0.6",
"do": "webhook",
"connection": "push-gateway",
"body": {
"topic": "alerts_{{symbol}}",
"event": "new_52w_high",
"symbol": "{{symbol}}",
"as_of": "{{as_of}}"
}
},
{
"id": "low_push",
"when": "low >= 0.6",
"do": "webhook",
"connection": "push-gateway",
"body": {
"topic": "alerts_{{symbol}}",
"event": "new_20d_low",
"symbol": "{{symbol}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"high": {
"yes_no": 0.0968,
"rule": "H > highest(H, 252)",
"basis": "pattern"
},
"low": {
"yes_no": 0.487,
"rule": "L < lowest(L, 20)",
"basis": "pattern"
},
"breakout": {
"yes_no": 0.0604,
"rule": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"near": {
"yes_no": 0.1327,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "high_push",
"fired": false,
"status": "skipped"
},
{
"id": "low_push",
"fired": false,
"status": "skipped"
}
]
}Broker app · example 4
Event badges on positions: earnings, ex-dividend and splits
Put small badges next to each position in the portfolio view for upcoming earnings, ex-dividend dates and recent splits.
- State6 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} then JNJ, NVDA, WMT, KO, JPM, one request each. The server fills in the latest completed session.
Questions
earn | English → rule | Is earnings in the next 14 days? |
ex | rule | days_to_ex_div <= 30Goes ex-dividend within 30 days |
split | rule | days_since_split <= 1095Split in the last three years |
announced | rule | days_to_split <= 365A split is announced |
Answers
| Symbol | earnrule | exrule | splitrule | announcedrule |
|---|---|---|---|---|
AAPL | 0.9463 | 0.0537 | 0.0537 | 0.0537 |
JNJ | 0.0537 | 0.9187 | 0.0537 | 0.0537 |
NVDA | 0.1033 | 0.0537 | 0.9463 | 0.0537 |
WMT | 0.0683 | 0.0537 | 0.9463 | 0.0537 |
KO | 0.50 | 0.2049 | 0.0537 | 0.0537 |
JPM | 0.0537 | 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, 6 symbols: Is earnings in the next 14 days: true for AAPL of 6. Goes ex-dividend within 30 days: true for JNJ of 6. Split in the last three years: true for NVDA, WMT of 6. A split is announced: true for none of 6.
Badges come only from fact rules; an ETF or a stock with no scheduled report shows no earnings badge rather than a guess.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"earn": {
"type": "yes_no",
"instructions": "Is earnings in the next 14 days?"
},
"ex": {
"type": "yes_no",
"ask": "days_to_ex_div <= 30"
},
"split": {
"type": "yes_no",
"ask": "days_since_split <= 1095"
},
"announced": {
"type": "yes_no",
"ask": "days_to_split <= 365"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"earn": {
"yes_no": 0.9463,
"rule": "days_to_earnings <= 14",
"basis": "pattern"
},
"ex": {
"yes_no": 0.0537,
"rule": "days_to_ex_div <= 30",
"basis": "rule"
},
"split": {
"yes_no": 0.0537,
"rule": "days_since_split <= 1095",
"basis": "rule"
},
"announced": {
"yes_no": 0.0537,
"rule": "days_to_split <= 365",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}days_since_split days_to_earnings days_to_ex_div days_to_split
Broker app · example 5
Options-level education prompt when the underlying (TSLA) is wild
Show a short explainer about implied moves when customers open an option chain on a stock in a wide-range regime.
- StateTSLA
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TSLA"} The server fills in the latest completed session.
Questions
atr | rule | atr_pct(14) > 3A typical day moves more than 3% |
tr | rule | tr() > 1.5 * ref(atr(14), -1)True range 1.5× yesterday's ATR |
move2 | forecast | Will the stock move more than 2% in either direction in 5 trading days? A 2%+ move either way in 5 days |
big | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
atrA typical day moves more than 3% | 0.848 | true |
trTrue range 1.5× yesterday's ATR | 0.2396 | false |
move2A 2%+ move either way in 5 days | 0.248 | 25% · unlikely |
bigA big move either way in 5 days | 0.248 | 25% · unlikely |
What it means
For TSLA on the session of 2026-10-30: True now: A typical day moves more than 3%. Not true: True range 1.5× yesterday's ATR. Forecasts: A 2%+ move either way in 5 days 25%; A big move either way in 5 days 25%.
The explainer appears on wide-range days; the forecasts are shown as odds with a plain caveat that they are not guarantees.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TSLA"
},
"questions": {
"atr": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"tr": {
"type": "yes_no",
"ask": "tr() > 1.5 * ref(atr(14), -1)"
},
"move2": {
"type": "yes_no",
"instructions": "Will the stock move more than 2% in either direction in 5 trading days?"
},
"big": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
}
}Response JSON (TSLA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"atr": {
"yes_no": 0.848,
"rule": "atr_pct(14) > 3",
"basis": "rule"
},
"tr": {
"yes_no": 0.2396,
"rule": "tr() > 1.5 * ref(atr(14), -1)",
"basis": "rule"
},
"move2": {
"yes_no": 0.248
},
"big": {
"yes_no": 0.248
}
},
"context": {
"symbol": "TSLA",
"as_of": "2026-10-30"
}
}Broker app · example 6
Margin early warning for concentrated accounts in ARKK
Warn margin customers concentrated in a volatile fund before a further drop could trigger a call.
- StateARKK
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"ARKK"} The server fills in the latest completed session.
Questions
down | English → rule | Did the stock fall more than 3% today? |
breakdown | rule | C < lowest(L, 20)Closed under the 20-day low |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
hv | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
Answers
| Question | Answer | Reading |
|---|---|---|
downDid the stock fall more than 3% today compiled to C / C[-1] - 1 < -0.03 | 0.8912 | true |
breakdownClosed under the 20-day low | 0.4919 | on the line (false) |
drop10A 10% drawdown within a month | 0.61 | 61% · likely |
hvAnnualized 20-day volatility above 40% | 0.7844 | true |
Actions
Rules on the answers decide what to send.
drop10 >= 0.4 and (down >= 0.6 or breakdown >= 0.6)→Emailmargin-desk{
"subject": "Margin early warning: ARKK",
"text": "ARKK (2026-10-30) fell sharply (89%) or broke its 20-day low (49%); odds of a further 10% drop within a month are 61%. Contact concentrated margin accounts."
}What it means
For ARKK on the session of 2026-10-30: True now: Did the stock fall more than 3% today; Annualized 20-day volatility above 40%. On the line: Closed under the 20-day low. Forecasts: A 10% drawdown within a month 61%. Fired: margin_email (Email → margin-desk).
The margin desk gets a heads-up list, not an automatic liquidation; the actual call still follows the house margin rules.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "ARKK"
},
"questions": {
"down": {
"type": "yes_no",
"instructions": "Did the stock fall more than 3% today?"
},
"breakdown": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
}
},
"actions": [
{
"id": "margin_email",
"when": "drop10 >= 0.4 and (down >= 0.6 or breakdown >= 0.6)",
"do": "email",
"connection": "margin-desk",
"subject": "Margin early warning: {{symbol}}",
"message": "{{symbol}} ({{as_of}}) fell sharply ({{down|pct}}) or broke its 20-day low ({{breakdown|pct}}); odds of a further 10% drop within a month are {{drop10|pct}}. Contact concentrated margin accounts."
}
],
"dry_run": true
}Response JSON (ARKK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"down": {
"yes_no": 0.8912,
"rule": "C / C[-1] - 1 < -0.03",
"basis": "pattern"
},
"breakdown": {
"yes_no": 0.4919,
"rule": "C < lowest(L, 20)",
"basis": "rule"
},
"drop10": {
"yes_no": 0.61
},
"hv": {
"yes_no": 0.7844,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
"basis": "rule"
}
},
"context": {
"symbol": "ARKK",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "margin_email",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "margin-desk",
"preview": {
"subject": "Margin early warning: ARKK",
"text": "ARKK (2026-10-30) fell sharply (89%) or broke its 20-day low (49%); odds of a further 10% drop within a month are 61%. Contact concentrated margin accounts."
}
}
]
}Broker app · example 7
Opening-gap banner on the quote page (AMD)
Explain on the quote page that the stock gapped at the open and whether the gap filled during the session.
- StateAMD
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AMD"} The server fills in the latest completed session.
Questions
gap_up | rule | gap_up()gap up candle: Today's whole range is above yesterday's high: an unfilled gap up. |
gap_down | rule | gap_down()gap down candle: Today's whole range is below yesterday's low. |
faded | rule | O > C[-1] and C < C[-1]Gapped up but closed under yesterday's close |
filled | English → rule | Did today's gap up fill? |
held | rule | (O > C[-1]) and (L > C[-1])gapped up and never traded back to yesterday's close |
Answers
| Question | Answer | Reading |
|---|---|---|
gap_upgap up candle: Today's whole range is above yesterday's high: an unfilled gap up. | 0.0537 | false |
gap_downgap down candle: Today's whole range is below yesterday's low. | 0.9363 | true |
fadedGapped up but closed under yesterday's close | 0.0537 | false |
filledDid today's gap up fill compiled to (O > C[-1] * 1) and (L <= C[-1]) | 0.0537 | false |
heldgapped up and never traded back to yesterday's close | 0.0537 | false |
What it means
For AMD on the session of 2026-10-30: True now: 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.; Gapped up but closed under yesterday's close; Did today's gap up fill; gapped up and never traded back to yesterday's close.
Gap facts describe the last completed session; the banner says yesterday's session so customers do not read it as live.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AMD"
},
"questions": {
"gap_up": {
"type": "yes_no",
"ask": "gap_up()"
},
"gap_down": {
"type": "yes_no",
"ask": "gap_down()"
},
"faded": {
"type": "yes_no",
"ask": "O > C[-1] and C < C[-1]"
},
"filled": {
"type": "yes_no",
"instructions": "Did today's gap up fill?"
},
"held": {
"type": "yes_no",
"ask": "(O > C[-1]) and (L > C[-1])"
}
}
}Response JSON (AMD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"gap_up": {
"yes_no": 0.0537,
"rule": "gap_up()",
"basis": "rule"
},
"gap_down": {
"yes_no": 0.9363,
"rule": "gap_down()",
"basis": "rule"
},
"faded": {
"yes_no": 0.0537,
"rule": "O > C[-1] and C < C[-1]",
"basis": "rule"
},
"filled": {
"yes_no": 0.0537,
"rule": "(O > C[-1] * 1) and (L <= C[-1])",
"basis": "pattern"
},
"held": {
"yes_no": 0.0537,
"rule": "(O > C[-1]) and (L > C[-1])",
"basis": "rule"
}
},
"context": {
"symbol": "AMD",
"as_of": "2026-10-30"
}
}Broker app · example 8
Morning watchlist push for the most-held names
Each weekday morning, push one line per watchlist name with yesterday's move and today's odds.
- ScheduleMon–Fri at 08:15 ET
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then TSLA, AMZN, NVDA, one request each. The server fills in the latest completed session.
Questions
up | English → rule | Did the stock close higher than yesterday? |
up2 | English → rule | Did the stock rise more than 2% today? |
down3 | English → rule | Did the stock fall more than 3% today? |
up_today | forecast | Will the stock be up tomorrow? Up tomorrow |
Answers
| Symbol | uprule | up2rule | down3rule | up_todayforecast | Fired |
|---|---|---|---|---|---|
AAPL | 0.127 | 0.0559 | 0.0916 | 0.556 | line |
TSLA | 0.2949 | 0.1241 | 0.1674 | 0.482 | line |
AMZN | 0.1852 | 0.0711 | 0.1582 | 0.476 | line |
NVDA | 0.0732 | 0.0552 | 0.7627 | 0.485 | 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.
up >= 0→Webhookpush-gateway{
"topic": "watchlist_AAPL",
"symbol": "AAPL",
"closed_up": 0.127,
"up_over_2": 0.0559,
"down_over_3": 0.0916,
"p_up_today": 0.556,
"as_of": "2026-10-30"
}{
"topic": "watchlist_TSLA",
"symbol": "TSLA",
"closed_up": 0.2949,
"up_over_2": 0.1241,
"down_over_3": 0.1674,
"p_up_today": 0.482,
"as_of": "2026-10-30"
}{
"topic": "watchlist_AMZN",
"symbol": "AMZN",
"closed_up": 0.1852,
"up_over_2": 0.0711,
"down_over_3": 0.1582,
"p_up_today": 0.476,
"as_of": "2026-10-30"
}{
"topic": "watchlist_NVDA",
"symbol": "NVDA",
"closed_up": 0.0732,
"up_over_2": 0.0552,
"down_over_3": 0.7627,
"p_up_today": 0.485,
"as_of": "2026-10-30"
}What it means
Session of 2026-10-30, 4 symbols: Did the stock close higher than yesterday: true for none of 4. Did the stock rise more than 2% today: true for none of 4. Did the stock fall more than 3% today: true for NVDA of 4. Highest odds for “Up tomorrow”: AAPL at 56%. line fired for AAPL, TSLA, AMZN, NVDA.
The push carries facts about yesterday and one forecast for today, each labeled, so the app can format them consistently.
As a scheduled workflow (Mon–Fri at 08:15 ET)
Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.
{
"name": "Morning watchlist push for the most-held names",
"symbols": "AAPL TSLA AMZN NVDA",
"days": [
1,
2,
3,
4,
5
],
"at_time": "08:15",
"model": "ora-fin-0.1.1",
"questions": {
"up": {
"type": "yes_no",
"instructions": "Did the stock close higher than yesterday?"
},
"up2": {
"type": "yes_no",
"instructions": "Did the stock rise more than 2% today?"
},
"down3": {
"type": "yes_no",
"instructions": "Did the stock fall more than 3% today?"
},
"up_today": {
"type": "yes_no",
"instructions": "Will the stock be up tomorrow?"
}
},
"actions": [
{
"id": "line",
"when": "up >= 0",
"do": "webhook",
"connection": "push-gateway",
"body": {
"topic": "watchlist_{{symbol}}",
"symbol": "{{symbol}}",
"closed_up": "{{up}}",
"up_over_2": "{{up2}}",
"down_over_3": "{{down3}}",
"p_up_today": "{{up_today}}",
"as_of": "{{as_of}}"
}
}
]
}Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"up": {
"type": "yes_no",
"instructions": "Did the stock close higher than yesterday?"
},
"up2": {
"type": "yes_no",
"instructions": "Did the stock rise more than 2% today?"
},
"down3": {
"type": "yes_no",
"instructions": "Did the stock fall more than 3% today?"
},
"up_today": {
"type": "yes_no",
"instructions": "Will the stock be up tomorrow?"
}
},
"actions": [
{
"id": "line",
"when": "up >= 0",
"do": "webhook",
"connection": "push-gateway",
"body": {
"topic": "watchlist_{{symbol}}",
"symbol": "{{symbol}}",
"closed_up": "{{up}}",
"up_over_2": "{{up2}}",
"down_over_3": "{{down3}}",
"p_up_today": "{{up_today}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"up": {
"yes_no": 0.127,
"rule": "C > C[-1]",
"basis": "comparison"
},
"up2": {
"yes_no": 0.0559,
"rule": "C / C[-1] - 1 > 0.02",
"basis": "pattern"
},
"down3": {
"yes_no": 0.0916,
"rule": "C / C[-1] - 1 < -0.03",
"basis": "pattern"
},
"up_today": {
"yes_no": 0.556
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "line",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "push-gateway",
"preview": {
"body": {
"topic": "watchlist_AAPL",
"symbol": "AAPL",
"closed_up": 0.127,
"up_over_2": 0.0559,
"down_over_3": 0.0916,
"p_up_today": 0.556,
"as_of": "2026-10-30"
}
}
}
]
}Broker app · example 9
Prompt to turn on dividend reinvestment for JNJ holders
When a holding goes ex-dividend soon, prompt holders without reinvestment switched on.
- StateJNJ
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"JNJ"} The server fills in the latest completed session.
Questions
ex | rule | days_to_ex_div <= 30Goes ex-dividend within 30 days |
grower | English → rule | Has the stock grown its dividend for 25 years in a row? |
raised | rule | raised_last > 0.5Raised its last dividend |
yield | English → rule | Is the dividend yield above 3%? |
Answers
| Question | Answer | Reading |
|---|---|---|
exGoes ex-dividend within 30 days | 0.9187 | true |
growerHas the stock grown its dividend for 25 years in a row compiled to years_of_growth >= 25 | 0.9463 | true |
raisedRaised its last dividend | 0.1409 | false |
yieldIs the dividend yield above 3% compiled to div_yield_ttm > 3 | 0.0648 | false |
Actions
Rules on the answers decide what to send.
ex >= 0.6→Webhookin-app-messages{
"segment": "holders_no_drip_JNJ",
"template": "drip_prompt",
"symbol": "JNJ",
"long_grower": 0.9463,
"as_of": "2026-10-30"
}What it means
For JNJ on the session of 2026-10-30: True now: Goes ex-dividend within 30 days; Has the stock grown its dividend for 25 years in a row. Not true: Raised its last dividend; Is the dividend yield above 3%. Fired: drip_prompt (Webhook → in-app-messages).
The prompt runs only on a declared ex-date; the long growth record is shown as context, never as a promise of future raises.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JNJ"
},
"questions": {
"ex": {
"type": "yes_no",
"ask": "days_to_ex_div <= 30"
},
"grower": {
"type": "yes_no",
"instructions": "Has the stock grown its dividend for 25 years in a row?"
},
"raised": {
"type": "yes_no",
"ask": "raised_last > 0.5"
},
"yield": {
"type": "yes_no",
"instructions": "Is the dividend yield above 3%?"
}
},
"actions": [
{
"id": "drip_prompt",
"when": "ex >= 0.6",
"do": "webhook",
"connection": "in-app-messages",
"body": {
"segment": "holders_no_drip_{{symbol}}",
"template": "drip_prompt",
"symbol": "{{symbol}}",
"long_grower": "{{grower}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (JNJ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"ex": {
"yes_no": 0.9187,
"rule": "days_to_ex_div <= 30",
"basis": "rule"
},
"grower": {
"yes_no": 0.9463,
"rule": "years_of_growth >= 25",
"basis": "pattern"
},
"raised": {
"yes_no": 0.1409,
"rule": "raised_last > 0.5",
"basis": "rule"
},
"yield": {
"yes_no": 0.0648,
"rule": "div_yield_ttm > 3",
"basis": "pattern"
}
},
"context": {
"symbol": "JNJ",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "drip_prompt",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "in-app-messages",
"preview": {
"body": {
"segment": "holders_no_drip_JNJ",
"template": "drip_prompt",
"symbol": "JNJ",
"long_grower": 0.9463,
"as_of": "2026-10-30"
}
}
}
]
}Broker app · example 10
Corporate-action notice: reverse split check on a small-cap (MARA)
Show a corporate-action notice on positions that recently did a reverse split, so share counts do not confuse customers.
- StateMARA
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MARA"} The server fills in the latest completed session.
Questions
rev | English → rule | Was the last split a reverse split? |
rev1y | English → rule | Has the stock done a reverse split in the past year? |
split3y | rule | days_since_split <= 1095Split in the last three years |
coming | English → rule | Is a stock split coming up? |
Answers
| Question | Answer | Reading |
|---|---|---|
revWas the last split a reverse split compiled to reverse_split_last > 0.5 | 0.8591 | true |
rev1yHas the stock done a reverse split in the past year compiled to days_since_reverse_split <= 365 | 0.0537 | false |
split3ySplit in the last three years | 0.0537 | false |
comingIs a stock split coming up compiled to days_to_split <= 365 | 0.0537 | false |
What it means
For MARA on the session of 2026-10-30: True now: Was the last split a reverse split. Not true: Has the stock done a reverse split in the past year; Split in the last three years; Is a stock split coming up.
Split facts are exact and only count real share splits; a stock that never split simply shows no notice.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MARA"
},
"questions": {
"rev": {
"type": "yes_no",
"instructions": "Was the last split a reverse split?"
},
"rev1y": {
"type": "yes_no",
"instructions": "Has the stock done a reverse split in the past year?"
},
"split3y": {
"type": "yes_no",
"ask": "days_since_split <= 1095"
},
"coming": {
"type": "yes_no",
"instructions": "Is a stock split coming up?"
}
}
}Response JSON (MARA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"rev": {
"yes_no": 0.8591,
"rule": "reverse_split_last > 0.5",
"basis": "pattern"
},
"rev1y": {
"yes_no": 0.0537,
"rule": "days_since_reverse_split <= 365",
"basis": "pattern"
},
"split3y": {
"yes_no": 0.0537,
"rule": "days_since_split <= 1095",
"basis": "rule"
},
"coming": {
"yes_no": 0.0537,
"rule": "days_to_split <= 365",
"basis": "pattern"
}
},
"context": {
"symbol": "MARA",
"as_of": "2026-10-30"
}
}days_since_reverse_split days_since_split days_to_split reverse_split_last
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, Robo-advisor, Algo / bot developer, Data vendor / platform, Trading educator / newsletter.