Use cases · Sell side
Compliance officer: 20 ways to use Ora
Surveillance context: unusual moves around events, restricted lists and documented checks. Each example is a complete, runnable request with the real answers it returned (44 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 (51)
offset 10avg 8ref 7abs 5sma 5atr 4days_to_earnings 3highest 3max 3zscore 2days_since_earnings 2days_to_ex_div 2pays_dividend 2atr_pct 2log 2sqrt 2std 2percentrank 1gap_down 1gap_up 1beat_eps_last 1beat_revenue_last 1eps_surprise_pct 1last_earnings_gap 1last_earnings_move 1days_since_ex_div 1div_yield_ttm 1days_since_reverse_split 1days_since_split 1days_to_split 1last_split_ratio 1marubozu 1outside_bar 1macd 1macdsignal 1rsi 1next_report_amc 1next_report_bmo 1median 1roc 1three_white_soldiers 1doji 1div_ttm 1last_div_amount 1next_div_amount 1barssince 1crossdown 1crossup 1lowest 1engulfing_bull 1hammer 1
Examples 1–10 of 20 · page 1 of 2
Compliance officer · example 1
NVDA: document unusual volume ahead of an earnings report
When volume spikes in the days before a scheduled report, record the market context in the surveillance case system for review.
- StateNVDA
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
earn | rule | days_to_earnings <= 10Reports earnings within 10 days |
spike | rule | V > 2 * ref(avg(V, 20), -1)Volume more than twice the previous 20-day average |
rank | rule | percentrank(V, 50) > 90Volume in the top tenth of 50 sessions |
big | rule | abs(C - C[-1]) > 1.5 * atr(14)Today's move was bigger than 1.5 ATR |
spike_tom | forecast | Will volume spike tomorrow? A volume spike tomorrow |
Answers
| Question | Answer | Reading |
|---|---|---|
earnReports earnings within 10 days | 0.0563 | false |
spikeVolume more than twice the previous 20-day average | 0.1794 | false |
rankVolume in the top tenth of 50 sessions | 0.5398 | on the line (true) |
bigToday's move was bigger than 1.5 ATR | 0.4404 | on the line (false) |
spike_tomA volume spike tomorrow | 0.044 | 4% · unlikely |
Actions
Rules on the answers decide what to send.
earn >= 0.6 and (spike >= 0.6 or rank >= 0.6)→Webhooksurveillance-caseselse→Slackcompliance-log{
"text": "NVDA (2026-10-30): pre-earnings volume check run; no elevated volume (spike 18%, rank 54%)."
}What it means
For NVDA on the session of 2026-10-30: Not true: Reports earnings within 10 days; Volume more than twice the previous 20-day average. On the line: Volume in the top tenth of 50 sessions; Today's move was bigger than 1.5 ATR. Forecasts: A volume spike tomorrow 4%. Fired: log (Slack → compliance-log).
The case record holds market context for a reviewer; it is not a finding about anyone, and the else branch documents that the check ran.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"earn": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"spike": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"rank": {
"type": "yes_no",
"ask": "percentrank(V, 50) > 90"
},
"big": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"spike_tom": {
"type": "yes_no",
"instructions": "Will volume spike tomorrow?"
}
},
"actions": [
{
"id": "case",
"when": "earn >= 0.6 and (spike >= 0.6 or rank >= 0.6)",
"do": "webhook",
"connection": "surveillance-cases",
"body": {
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"type": "market_context",
"reason": "elevated_volume_before_scheduled_earnings",
"facts": {
"earnings_within_10d": "{{earn}}",
"volume_2x_avg": "{{spike}}",
"volume_rank_90": "{{rank}}",
"move_over_1_5_atr": "{{big}}"
},
"note": "Context only; no finding."
}
},
{
"id": "log",
"when": "else",
"do": "slack",
"connection": "compliance-log",
"message": "{{symbol}} ({{as_of}}): pre-earnings volume check run; no elevated volume (spike {{spike|pct}}, rank {{rank|pct}})."
}
],
"dry_run": true
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"earn": {
"yes_no": 0.0563,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"spike": {
"yes_no": 0.1794,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"rank": {
"yes_no": 0.5398,
"rule": "percentrank(V, 50) > 90",
"basis": "rule"
},
"big": {
"yes_no": 0.4404,
"rule": "abs(C - C[-1]) > 1.5 * atr(14)",
"basis": "rule"
},
"spike_tom": {
"yes_no": 0.044
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "case",
"fired": false,
"status": "skipped"
},
{
"id": "log",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "compliance-log",
"preview": {
"text": "NVDA (2026-10-30): pre-earnings volume check run; no elevated volume (spike 18%, rank 54%)."
}
}
]
}Compliance officer · example 2
Restricted-list names: large moves to note in the daily log
Each evening, check names on the restricted list for large moves or shock days and email the log to compliance.
- ScheduleMon–Fri at 17:15 ET
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"JPM"} then GS, BAC, C, 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 |
shock | rule | zscore(C / C[-1] - 1, 20) < -2A two-sigma down day |
vol | rule | V > 2 * ref(avg(V, 20), -1)Volume more than twice the previous 20-day average |
gap | rule | abs(O - C[-1]) > 0.5 * ref(atr(14), -1)Gap bigger than half an ATR |
Answers
| Symbol | bigrule | shockrule | volrule | gaprule | Fired |
|---|---|---|---|---|---|
JPM | 0.101 | 0.5937 | 0.0832 | 0.153 | none |
GS | 0.2824 | 0.6964 | 0.0537 | 0.9104 | log |
BAC | 0.1309 | 0.2192 | 0.061 | 0.1685 | none |
C | 0.1024 | 0.1851 | 0.1207 | 0.6901 | 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.
big >= 0.6 or shock >= 0.6 or vol >= 0.6→Emailcompliance-team{
"subject": "Restricted list: GS large move 2026-10-30",
"text": "GS: move over 1.5 ATR 28%, return shock 70%, volume spike 5%, gap vs ATR 91%. Review employee and firm activity per procedure."
}What it means
Session of 2026-10-30, 4 symbols: Today's move was bigger than 1.5 ATR: true for none of 4. A two-sigma down day: true for GS of 4. Volume more than twice the previous 20-day average: true for none of 4. Gap bigger than half an ATR: true for GS, C of 4. log fired for GS.
Large moves in restricted names trigger the standard review procedure; quiet days send nothing.
As a scheduled workflow (Mon–Fri at 17: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": "Restricted-list names: large moves to note in the daily log",
"symbols": "JPM GS BAC C",
"days": [
1,
2,
3,
4,
5
],
"at_time": "17:15",
"model": "ora-fin-0.1.1",
"questions": {
"big": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"shock": {
"type": "yes_no",
"ask": "zscore(C / C[-1] - 1, 20) < -2"
},
"vol": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"gap": {
"type": "yes_no",
"ask": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)"
}
},
"actions": [
{
"id": "log",
"when": "big >= 0.6 or shock >= 0.6 or vol >= 0.6",
"do": "email",
"connection": "compliance-team",
"subject": "Restricted list: {{symbol}} large move {{as_of}}",
"message": "{{symbol}}: move over 1.5 ATR {{big|pct}}, return shock {{shock|pct}}, volume spike {{vol|pct}}, gap vs ATR {{gap|pct}}. Review employee and firm activity per procedure."
}
]
}Request JSON (JPM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JPM"
},
"questions": {
"big": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"shock": {
"type": "yes_no",
"ask": "zscore(C / C[-1] - 1, 20) < -2"
},
"vol": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"gap": {
"type": "yes_no",
"ask": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)"
}
},
"actions": [
{
"id": "log",
"when": "big >= 0.6 or shock >= 0.6 or vol >= 0.6",
"do": "email",
"connection": "compliance-team",
"subject": "Restricted list: {{symbol}} large move {{as_of}}",
"message": "{{symbol}}: move over 1.5 ATR {{big|pct}}, return shock {{shock|pct}}, volume spike {{vol|pct}}, gap vs ATR {{gap|pct}}. Review employee and firm activity per procedure."
}
],
"dry_run": true
}Response JSON (JPM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"big": {
"yes_no": 0.101,
"rule": "abs(C - C[-1]) > 1.5 * atr(14)",
"basis": "rule"
},
"shock": {
"yes_no": 0.5937,
"rule": "zscore(C / C[-1] - 1, 20) < -2",
"basis": "rule"
},
"vol": {
"yes_no": 0.0832,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"gap": {
"yes_no": 0.153,
"rule": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)",
"basis": "rule"
}
},
"context": {
"symbol": "JPM",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "log",
"fired": false,
"status": "skipped"
}
]
}Compliance officer · example 3
TSLA gap documentation for the surveillance file
Record the size and character of an opening gap so later reviews of trading around it have the facts.
- StateTSLA
- Questions7 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TSLA"} The server fills in the latest completed session.
Questions
gap_up | rule | O > C[-1] * 1.01Opened more than 1% above yesterday's close |
gap_dn | rule | O < C[-1] * 0.99Opened more than 1% below yesterday's close |
gap_atr | rule | abs(O - C[-1]) > 0.5 * ref(atr(14), -1)Gap bigger than half an ATR |
unfilled | English → rule | Did the stock gap up with today's low above yesterday's high? |
faded | rule | O > C[-1] and C < C[-1]Gapped up but closed under yesterday's close |
gap_up_bar | rule | gap_up()gap up candle: Today's whole range is above yesterday's high: an unfilled gap up. |
gap_dn_bar | rule | gap_down()gap down candle: Today's whole range is below yesterday's low. |
Answers
| Question | Answer | Reading |
|---|---|---|
gap_upOpened more than 1% above yesterday's close | 0.0562 | false |
gap_dnOpened more than 1% below yesterday's close | 0.8793 | true |
gap_atrGap bigger than half an ATR | 0.8646 | true |
unfilledDid the stock gap up with today's low above yesterday's high compiled to gap_up() | 0.0577 | false |
fadedGapped up but closed under yesterday's close | 0.0708 | false |
gap_up_bargap up candle: Today's whole range is above yesterday's high: an unfilled gap up. | 0.0577 | false |
gap_dn_bargap down candle: Today's whole range is below yesterday's low. | 0.2768 | false |
What it means
For TSLA on the session of 2026-10-30: True now: Opened more than 1% below yesterday's close; Gap bigger than half an ATR. Not true: Opened more than 1% above yesterday's close; Did the stock gap up with today's low above yesterday's high; Gapped up but closed under yesterday's close; gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.; gap down candle: Today's whole range is below yesterday's low..
Gap facts are written to the file as they are; reviewers use them to judge whether activity before the gap needs attention.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TSLA"
},
"questions": {
"gap_up": {
"type": "yes_no",
"ask": "O > C[-1] * 1.01"
},
"gap_dn": {
"type": "yes_no",
"ask": "O < C[-1] * 0.99"
},
"gap_atr": {
"type": "yes_no",
"ask": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)"
},
"unfilled": {
"type": "yes_no",
"instructions": "Did the stock gap up with today's low above yesterday's high?"
},
"faded": {
"type": "yes_no",
"ask": "O > C[-1] and C < C[-1]"
},
"gap_up_bar": {
"type": "yes_no",
"ask": "gap_up()"
},
"gap_dn_bar": {
"type": "yes_no",
"ask": "gap_down()"
}
}
}Response JSON (TSLA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"gap_up": {
"yes_no": 0.0562,
"rule": "O > C[-1] * 1.01",
"basis": "rule"
},
"gap_dn": {
"yes_no": 0.8793,
"rule": "O < C[-1] * 0.99",
"basis": "rule"
},
"gap_atr": {
"yes_no": 0.8646,
"rule": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)",
"basis": "rule"
},
"unfilled": {
"yes_no": 0.0577,
"rule": "gap_up()",
"basis": "pattern"
},
"faded": {
"yes_no": 0.0708,
"rule": "O > C[-1] and C < C[-1]",
"basis": "rule"
},
"gap_up_bar": {
"yes_no": 0.0577,
"rule": "gap_up()",
"basis": "rule"
},
"gap_dn_bar": {
"yes_no": 0.2768,
"rule": "gap_down()",
"basis": "rule"
}
},
"context": {
"symbol": "TSLA",
"as_of": "2026-10-30"
}
}Compliance officer · example 4
JPM earnings reaction: context for the trade review
After a report, document the surprise, the gap and the reaction size for trades reviewed around the event.
- StateJPM
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"JPM"} The server fills in the latest completed session.
Questions
recent | rule | days_since_earnings <= 5Reported in the last 5 days |
surprise | rule | eps_surprise_pct > 5EPS beat by more than 5% |
beat | English → rule | Did the stock beat on both EPS and revenue last quarter? |
gap | English → rule | Did the stock gap up after its last earnings? |
react | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
Answers
| Question | Answer | Reading |
|---|---|---|
recentReported in the last 5 days | 0.0537 | false |
surpriseEPS beat by more than 5% | 0.0844 | false |
beatDid the stock beat on both EPS and revenue last quarter compiled to beat_eps_last > 0.5 and beat_revenue_last > 0.5 | 0.1409 | false |
gapDid the stock gap up after its last earnings compiled to last_earnings_gap > 0 | 0.9463 | true |
reactLast earnings move bigger than 5% | 0.0664 | false |
What it means
For JPM on the session of 2026-10-30: True now: Did the stock gap up after its last earnings. Not true: Reported in the last 5 days; EPS beat by more than 5%; Did the stock beat on both EPS and revenue last quarter; Last earnings move bigger than 5%.
These are the public facts of the event; reviewers compare them to the timing of trades.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JPM"
},
"questions": {
"recent": {
"type": "yes_no",
"ask": "days_since_earnings <= 5"
},
"surprise": {
"type": "yes_no",
"ask": "eps_surprise_pct > 5"
},
"beat": {
"type": "yes_no",
"instructions": "Did the stock beat on both EPS and revenue last quarter?"
},
"gap": {
"type": "yes_no",
"instructions": "Did the stock gap up after its last earnings?"
},
"react": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
}
}
}Response JSON (JPM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"recent": {
"yes_no": 0.0537,
"rule": "days_since_earnings <= 5",
"basis": "rule"
},
"surprise": {
"yes_no": 0.0844,
"rule": "eps_surprise_pct > 5",
"basis": "rule"
},
"beat": {
"yes_no": 0.1409,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "pattern"
},
"gap": {
"yes_no": 0.9463,
"rule": "last_earnings_gap > 0",
"basis": "pattern"
},
"react": {
"yes_no": 0.0664,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
}
},
"context": {
"symbol": "JPM",
"as_of": "2026-10-30"
}
}abs beat_eps_last beat_revenue_last days_since_earnings eps_surprise_pct last_earnings_gap last_earnings_move
Compliance officer · example 5
Dividend-capture pattern review: KO, PG, T, VZ ex-dates
Flag accounts trading around ex-dates by first knowing which names went ex recently.
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"KO"} then PG, T, VZ, one request each. The server fills in the latest completed session.
Questions
ex_recent | rule | days_since_ex_div <= 5Went ex-dividend in the last five days |
ex_soon | rule | days_to_ex_div <= 30Goes ex-dividend within 30 days |
yield3 | rule | div_yield_ttm > 3Yield above 3% |
pays | rule | pays_dividend > 0.5Pays a dividend |
Answers
| Symbol | ex_recentrule | ex_soonrule | yield3rule | paysrule |
|---|---|---|---|---|
KO | 0.0537 | 0.2049 | 0.0537 | 0.8591 |
PG | 0.2049 | 0.0537 | 0.2091 | 0.8591 |
T | 0.0537 | 0.0537 | 0.9463 | 0.8591 |
VZ | 0.0537 | 0.0537 | 0.9463 | 0.8591 |
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: Went ex-dividend in the last five days: true for none of 4. Goes ex-dividend within 30 days: true for none of 4. Yield above 3%: true for T, VZ of 4. Pays a dividend: true for KO, PG, T, VZ of 4.
Knowing the ex-dates is the first step; the trade review itself happens in the firm's own systems.
Request JSON (KO; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "KO"
},
"questions": {
"ex_recent": {
"type": "yes_no",
"ask": "days_since_ex_div <= 5"
},
"ex_soon": {
"type": "yes_no",
"ask": "days_to_ex_div <= 30"
},
"yield3": {
"type": "yes_no",
"ask": "div_yield_ttm > 3"
},
"pays": {
"type": "yes_no",
"ask": "pays_dividend > 0.5"
}
}
}Response JSON (KO, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"ex_recent": {
"yes_no": 0.0537,
"rule": "days_since_ex_div <= 5",
"basis": "rule"
},
"ex_soon": {
"yes_no": 0.2049,
"rule": "days_to_ex_div <= 30",
"basis": "rule"
},
"yield3": {
"yes_no": 0.0537,
"rule": "div_yield_ttm > 3",
"basis": "rule"
},
"pays": {
"yes_no": 0.8591,
"rule": "pays_dividend > 0.5",
"basis": "rule"
}
},
"context": {
"symbol": "KO",
"as_of": "2026-10-30"
}
}days_since_ex_div days_to_ex_div div_yield_ttm pays_dividend
Compliance officer · example 6
Corporate actions to reconcile: recent and announced splits
Make sure position and limit records are adjusted for splits in names the firm trades.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"NVDA"} then SMCI, AAPL, one request each. The server fills in the latest completed session.
Questions
recent | rule | days_since_split <= 30Split in the last 30 days |
announced | rule | days_to_split <= 365A split is announced |
reverse | English → rule | Has the stock done a reverse split in the past year? |
ratio | English → rule | Was the last split at least 2-for-1? |
Answers
| Symbol | recentrule | announcedrule | reverserule | ratiorule | Fired |
|---|---|---|---|---|---|
NVDA | 0.0537 | 0.0537 | 0.0537 | 0.9463 | none |
SMCI | 0.0537 | 0.0537 | 0.0537 | 0.9463 | none |
AAPL | 0.0537 | 0.0537 | 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.
recent >= 0.6 or announced >= 0.6→Emailcompliance-opsWhat it means
Session of 2026-10-30, 3 symbols: Split in the last 30 days: true for none of 3. A split is announced: true for none of 3. Has the stock done a reverse split in the past year: true for none of 3. Was the last split at least 2-for-1: true for NVDA, SMCI, AAPL of 3. reconcile fired for none.
A split changes share counts in every record; the email is a reconciliation reminder, not an exception.
Request JSON (NVDA; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"recent": {
"type": "yes_no",
"ask": "days_since_split <= 30"
},
"announced": {
"type": "yes_no",
"ask": "days_to_split <= 365"
},
"reverse": {
"type": "yes_no",
"instructions": "Has the stock done a reverse split in the past year?"
},
"ratio": {
"type": "yes_no",
"instructions": "Was the last split at least 2-for-1?"
}
},
"actions": [
{
"id": "reconcile",
"when": "recent >= 0.6 or announced >= 0.6",
"do": "email",
"connection": "compliance-ops",
"subject": "Split reconciliation: {{symbol}}",
"message": "{{symbol}} ({{as_of}}): split in the last 30 days {{recent|pct}} or announced {{announced|pct}}. Confirm positions, limits and restricted-list quantities are adjusted."
}
],
"dry_run": true
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"recent": {
"yes_no": 0.0537,
"rule": "days_since_split <= 30",
"basis": "rule"
},
"announced": {
"yes_no": 0.0537,
"rule": "days_to_split <= 365",
"basis": "rule"
},
"reverse": {
"yes_no": 0.0537,
"rule": "days_since_reverse_split <= 365",
"basis": "pattern"
},
"ratio": {
"yes_no": 0.9463,
"rule": "last_split_ratio >= 2",
"basis": "pattern"
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "reconcile",
"fired": false,
"status": "skipped"
}
]
}days_since_reverse_split days_since_split days_to_split last_split_ratio
Compliance officer · example 7
Close-location context for a marking-the-close review
When reviewing end-of-day activity, record whether the close sat at an extreme of the day's range and on what volume.
- StateSPY
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
top | rule | (C - L) / (H - L) > 0.75Closed in the top quarter of the day's range |
bottom | rule | (C - L) / (H - L) < 0.25Closed in the bottom quarter of the day's range |
vol | rule | V > avg(V, 20)Volume above its 20-day average |
trend_day | rule | (O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))A trend day up: opened near the low, closed near the high |
marubozu | rule | marubozu()marubozu candle: Body at least 90% of the range: almost no wicks. |
Answers
| Question | Answer | Reading |
|---|---|---|
topClosed in the top quarter of the day's range | 0.1294 | false |
bottomClosed in the bottom quarter of the day's range | 0.1492 | false |
volVolume above its 20-day average | 0.9463 | true |
trend_dayA trend day up: opened near the low, closed near the high | 0.0537 | false |
marubozumarubozu candle: Body at least 90% of the range: almost no wicks. | 0.0537 | false |
What it means
For SPY on the session of 2026-10-30: True now: Volume above its 20-day average. Not true: Closed in the top quarter of the day's range; Closed in the bottom quarter of the day's range; A trend day up: opened near the low, closed near the high; marubozu candle: Body at least 90% of the range: almost no wicks..
A close at an extreme on a trend day is normal market behaviour; the context helps reviewers separate that from unusual activity.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"top": {
"type": "yes_no",
"ask": "(C - L) / (H - L) > 0.75"
},
"bottom": {
"type": "yes_no",
"ask": "(C - L) / (H - L) < 0.25"
},
"vol": {
"type": "yes_no",
"ask": "V > avg(V, 20)"
},
"trend_day": {
"type": "yes_no",
"ask": "(O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))"
},
"marubozu": {
"type": "yes_no",
"ask": "marubozu()"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"top": {
"yes_no": 0.1294,
"rule": "(C - L) / (H - L) > 0.75",
"basis": "rule"
},
"bottom": {
"yes_no": 0.1492,
"rule": "(C - L) / (H - L) < 0.25",
"basis": "rule"
},
"vol": {
"yes_no": 0.9463,
"rule": "V > avg(V, 20)",
"basis": "rule"
},
"trend_day": {
"yes_no": 0.0537,
"rule": "(O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))",
"basis": "rule"
},
"marubozu": {
"yes_no": 0.0537,
"rule": "marubozu()",
"basis": "rule"
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}Compliance officer · example 8
Daily shock-day scan across traded large caps
Scan the firm's most-traded names for return shocks and record each hit in the surveillance system.
- ScheduleMon–Fri at 17:30 ET
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then MSFT, AMZN, TSLA, NFLX, one request each. The server fills in the latest completed session.
Questions
shock | rule | zscore(C / C[-1] - 1, 20) < -2A two-sigma down day |
zs | rule | zscore(C / C[-1] - 1, 60) > 2Daily return over two standard deviations above its 60-day norm |
vol | rule | V > 2 * ref(avg(V, 20), -1)Volume more than twice the previous 20-day average |
outside | rule | outside_bar()outside bar candle: Today's high above yesterday's and low below it. |
Answers
| Symbol | shockrule | zsrule | volrule | outsiderule | Fired |
|---|---|---|---|---|---|
AAPL | 0.253 | 0.0537 | 0.2473 | 0.2273 | none |
MSFT | 0.1707 | 0.0537 | 0.262 | 0.0651 | none |
AMZN | 0.089 | 0.0537 | 0.9135 | 0.0661 | none |
TSLA | 0.0945 | 0.0537 | 0.0589 | 0.3172 | none |
NFLX | 0.0639 | 0.0723 | 0.0708 | 0.401 | 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.
shock >= 0.6 or zs >= 0.6→Webhooksurveillance-casesWhat it means
Session of 2026-10-30, 5 symbols: A two-sigma down day: true for none of 5. Daily return over two standard deviations above its 60-day norm: true for none of 5. Volume more than twice the previous 20-day average: true for AMZN of 5. outside bar candle: Today's high above yesterday's and low below it.: true for none of 5. record fired for none.
Shocks in either direction are recorded with their volume context so later reviews start from facts.
As a scheduled workflow (Mon–Fri at 17:30 ET)
Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.
{
"name": "Daily shock-day scan across traded large caps",
"symbols": "AAPL MSFT AMZN TSLA NFLX",
"days": [
1,
2,
3,
4,
5
],
"at_time": "17:30",
"model": "ora-fin-0.1.1",
"questions": {
"shock": {
"type": "yes_no",
"ask": "zscore(C / C[-1] - 1, 20) < -2"
},
"zs": {
"type": "yes_no",
"ask": "zscore(C / C[-1] - 1, 60) > 2"
},
"vol": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"outside": {
"type": "yes_no",
"ask": "outside_bar()"
}
},
"actions": [
{
"id": "record",
"when": "shock >= 0.6 or zs >= 0.6",
"do": "webhook",
"connection": "surveillance-cases",
"body": {
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"type": "price_shock_context",
"down_shock": "{{shock}}",
"up_shock": "{{zs}}",
"volume_spike": "{{vol}}",
"note": "Context only; no finding."
}
}
]
}Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"shock": {
"type": "yes_no",
"ask": "zscore(C / C[-1] - 1, 20) < -2"
},
"zs": {
"type": "yes_no",
"ask": "zscore(C / C[-1] - 1, 60) > 2"
},
"vol": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"outside": {
"type": "yes_no",
"ask": "outside_bar()"
}
},
"actions": [
{
"id": "record",
"when": "shock >= 0.6 or zs >= 0.6",
"do": "webhook",
"connection": "surveillance-cases",
"body": {
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"type": "price_shock_context",
"down_shock": "{{shock}}",
"up_shock": "{{zs}}",
"volume_spike": "{{vol}}",
"note": "Context only; no finding."
}
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"shock": {
"yes_no": 0.253,
"rule": "zscore(C / C[-1] - 1, 20) < -2",
"basis": "rule"
},
"zs": {
"yes_no": 0.0537,
"rule": "zscore(C / C[-1] - 1, 60) > 2",
"basis": "rule"
},
"vol": {
"yes_no": 0.2473,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"outside": {
"yes_no": 0.2273,
"rule": "outside_bar()",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "record",
"fired": false,
"status": "skipped"
}
]
}Compliance officer · example 9
AMD: verify chart claims before a research note publishes
Check the technical statements in a draft note against exact rules before supervisory approval.
- StateAMD
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AMD"} The server fills in the latest completed session.
Questions
above200 | English → rule | Is the stock above its 200-day moving average? |
golden | English → rule | Is the 50-day moving average above the 200-day? |
new_high | English → rule | Did the stock make a new 52-week high today? |
rsi70 | English → rule | Is the stock overbought on RSI, above 70? |
macd | English → rule | Is the MACD line above its signal line? |
Answers
| Question | Answer | Reading |
|---|---|---|
above200Is the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.9284 | true |
goldenIs the 50-day moving average above the 200-day compiled to sma(C, 50) > sma(C, 200) | 0.9463 | true |
new_highDid the stock make a new 52-week high today compiled to H > highest(H, 252) | 0.0537 | false |
rsi70Is the stock overbought on RSI, above 70 compiled to rsi(C, 14) > 70 | 0.055 | false |
macdIs the MACD line above its signal line compiled to macd(C) > macdsignal(C) | 0.2076 | false |
Actions
Rules on the answers decide what to send.
above200 >= 0→Webhookreview-workflow{
"symbol": "AMD",
"as_of": "2026-10-30",
"check": "technical_claims",
"above_200d": 0.9284,
"golden_setup": 0.9463,
"new_52w_high": 0.0537,
"rsi_over_70": 0.055,
"macd_over_signal": 0.2076
}What it means
For AMD on the session of 2026-10-30: True now: Is the stock above its 200-day moving average; Is the 50-day moving average above the 200-day. Not true: Did the stock make a new 52-week high today; Is the stock overbought on RSI, above 70; Is the MACD line above its signal line. Fired: ticket (Webhook → review-workflow).
Each claim in the draft is matched to a yes or no from the data; a claim the data does not support goes back to the author.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AMD"
},
"questions": {
"above200": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"golden": {
"type": "yes_no",
"instructions": "Is the 50-day moving average above the 200-day?"
},
"new_high": {
"type": "yes_no",
"instructions": "Did the stock make a new 52-week high today?"
},
"rsi70": {
"type": "yes_no",
"instructions": "Is the stock overbought on RSI, above 70?"
},
"macd": {
"type": "yes_no",
"instructions": "Is the MACD line above its signal line?"
}
},
"actions": [
{
"id": "ticket",
"when": "above200 >= 0",
"do": "webhook",
"connection": "review-workflow",
"body": {
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"check": "technical_claims",
"above_200d": "{{above200}}",
"golden_setup": "{{golden}}",
"new_52w_high": "{{new_high}}",
"rsi_over_70": "{{rsi70}}",
"macd_over_signal": "{{macd}}"
}
}
],
"dry_run": true
}Response JSON (AMD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"above200": {
"yes_no": 0.9284,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"golden": {
"yes_no": 0.9463,
"rule": "sma(C, 50) > sma(C, 200)",
"basis": "comparison"
},
"new_high": {
"yes_no": 0.0537,
"rule": "H > highest(H, 252)",
"basis": "pattern"
},
"rsi70": {
"yes_no": 0.055,
"rule": "rsi(C, 14) > 70",
"basis": "pattern"
},
"macd": {
"yes_no": 0.2076,
"rule": "macd(C) > macdsignal(C)",
"basis": "comparison"
}
},
"context": {
"symbol": "AMD",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "ticket",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "review-workflow",
"preview": {
"body": {
"symbol": "AMD",
"as_of": "2026-10-30",
"check": "technical_claims",
"above_200d": 0.9284,
"golden_setup": 0.9463,
"new_52w_high": 0.0537,
"rsi_over_70": 0.055,
"macd_over_signal": 0.2076
}
}
}
]
}Compliance officer · example 10
QQQ marketing copy: is 'near all-time highs' accurate today?
Before a client communication goes out, verify market statements in it are true as of the latest session.
- StateQQQ
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"QQQ"} The server fills in the latest completed session.
Questions
near_high | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
new_high | rule | H > highest(H, 252)New 52-week high |
up_month | English → rule | Is the stock up over the last month? |
up_3m | English → rule | Is the stock up more than 10% over the last three months? |
Answers
| Question | Answer | Reading |
|---|---|---|
near_highWithin 2% of the 52-week high | 0.0537 | false |
new_highNew 52-week high | 0.0537 | false |
up_monthIs the stock up over the last month compiled to C > C[-21] | 0.0664 | false |
up_3mIs the stock up more than 10% over the last three months compiled to C / C[-63] - 1 > 0.1 | 0.0537 | false |
What it means
For QQQ on the session of 2026-10-30: Not true: Within 2% of the 52-week high; New 52-week high; Is the stock up over the last month; Is the stock up more than 10% over the last three months.
Marketing statements must be accurate when sent; if a rule is false the copy is changed, not the rule.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "QQQ"
},
"questions": {
"near_high": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
},
"new_high": {
"type": "yes_no",
"ask": "H > highest(H, 252)"
},
"up_month": {
"type": "yes_no",
"instructions": "Is the stock up over the last month?"
},
"up_3m": {
"type": "yes_no",
"instructions": "Is the stock up more than 10% over the last three months?"
}
}
}Response JSON (QQQ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"near_high": {
"yes_no": 0.0537,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"new_high": {
"yes_no": 0.0537,
"rule": "H > highest(H, 252)",
"basis": "rule"
},
"up_month": {
"yes_no": 0.0664,
"rule": "C > C[-21]",
"basis": "pattern"
},
"up_3m": {
"yes_no": 0.0537,
"rule": "C / C[-63] - 1 > 0.1",
"basis": "pattern"
}
},
"context": {
"symbol": "QQQ",
"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 Sell side: Equity research analyst, Sell-side sales trader, Execution trader / desk, Market maker, Prop trading firm.