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 11–20 of 20 · page 2 of 2
Compliance officer · example 11
Trading-window calendar: which covered names report soon
Remind employees in a blackout policy which names report within two weeks.
- ScheduleMon at 07:30 ET
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"MSFT"} then ORCL, CRM, ADBE, CSCO, one request each. The server fills in the latest completed session.
Questions
soon | English → rule | Is earnings in the next 14 days? |
recent | English → rule | Did the stock report earnings in the last 7 days? |
bmo | English → rule | Does the stock report before the market opens next time? |
amc | English → rule | Does the stock report after the close next time? |
Answers
| Symbol | soonrule | recentrule | bmorule | amcrule | Fired |
|---|---|---|---|---|---|
MSFT | 0.0537 | 0.9187 | 0.1409 | 0.8591 | none |
ORCL | 0.0537 | 0.0537 | 0.1409 | 0.8591 | none |
CRM | 0.0537 | 0.0537 | 0.1409 | 0.8591 | none |
ADBE | 0.0537 | 0.0537 | 0.1409 | 0.8591 | none |
CSCO | 0.7951 | 0.0537 | 0.1409 | 0.8591 | window |
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.
soon >= 0.6→Emailemployees-covered{
"subject": "Blackout reminder: CSCO reports within 14 days",
"text": "CSCO reports within 14 days (before the open 14%, after the close 86%). Personal trading in CSCO is restricted under the policy until two days after the report."
}What it means
Session of 2026-10-30, 5 symbols: Is earnings in the next 14 days: true for CSCO of 5. Did the stock report earnings in the last 7 days: true for MSFT of 5. Does the stock report before the market opens next time: true for none of 5. Does the stock report after the close next time: true for MSFT, ORCL, CRM, ADBE, CSCO of 5. window fired for CSCO.
The reminder is driven by the earnings calendar facts; it applies the policy, it does not judge anyone.
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": "Trading-window calendar: which covered names report soon",
"symbols": "MSFT ORCL CRM ADBE CSCO",
"days": [
1
],
"at_time": "07:30",
"model": "ora-fin-0.1.1",
"questions": {
"soon": {
"type": "yes_no",
"instructions": "Is earnings in the next 14 days?"
},
"recent": {
"type": "yes_no",
"instructions": "Did the stock report earnings in the last 7 days?"
},
"bmo": {
"type": "yes_no",
"instructions": "Does the stock report before the market opens next time?"
},
"amc": {
"type": "yes_no",
"instructions": "Does the stock report after the close next time?"
}
},
"actions": [
{
"id": "window",
"when": "soon >= 0.6",
"do": "email",
"connection": "employees-covered",
"subject": "Blackout reminder: {{symbol}} reports within 14 days",
"message": "{{symbol}} reports within 14 days (before the open {{bmo|pct}}, after the close {{amc|pct}}). Personal trading in {{symbol}} is restricted under the policy until two days after the report."
}
]
}Request JSON (MSFT; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"soon": {
"type": "yes_no",
"instructions": "Is earnings in the next 14 days?"
},
"recent": {
"type": "yes_no",
"instructions": "Did the stock report earnings in the last 7 days?"
},
"bmo": {
"type": "yes_no",
"instructions": "Does the stock report before the market opens next time?"
},
"amc": {
"type": "yes_no",
"instructions": "Does the stock report after the close next time?"
}
},
"actions": [
{
"id": "window",
"when": "soon >= 0.6",
"do": "email",
"connection": "employees-covered",
"subject": "Blackout reminder: {{symbol}} reports within 14 days",
"message": "{{symbol}} reports within 14 days (before the open {{bmo|pct}}, after the close {{amc|pct}}). Personal trading in {{symbol}} is restricted under the policy until two days after the report."
}
],
"dry_run": true
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"soon": {
"yes_no": 0.0537,
"rule": "days_to_earnings <= 14",
"basis": "pattern"
},
"recent": {
"yes_no": 0.9187,
"rule": "days_since_earnings <= 7",
"basis": "pattern"
},
"bmo": {
"yes_no": 0.1409,
"rule": "next_report_bmo > 0.5",
"basis": "pattern"
},
"amc": {
"yes_no": 0.8591,
"rule": "next_report_amc > 0.5",
"basis": "pattern"
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "window",
"fired": false,
"status": "skipped"
}
]
}days_since_earnings days_to_earnings next_report_amc next_report_bmo
Compliance officer · example 12
Leveraged ETF suitability context: TQQQ and SQQQ volatility
Document the volatility of leveraged products when reviewing whether they suit retail accounts.
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TQQQ"} then SQQQ, one request each. The server fills in the latest completed session.
Questions
atr3 | rule | atr_pct(14) > 3A typical day moves more than 3% |
hv | English → rule | Is 20-day historical volatility above 40%? |
dd | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Symbol | atr3rule | hvrule | ddrule | drop10forecast |
|---|---|---|---|---|
TQQQ | 0.9463 | 0.9424 | 0.9198 | 0.766 |
SQQQ | 0.934 | 0.9339 | 0.9463 | 0.699 |
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: A typical day moves more than 3%: true for TQQQ, SQQQ of 2. Is 20-day historical volatility above 40%: true for TQQQ, SQQQ of 2. More than 20% off the 52-week high: true for TQQQ, SQQQ of 2. Highest odds for “A 10% drawdown within a month”: TQQQ at 77%.
High volatility and drawdowns are part of the suitability file; the forecast is shown as model odds.
Request JSON (TQQQ; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TQQQ"
},
"questions": {
"atr3": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"hv": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility above 40%?"
},
"dd": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
}
}Response JSON (TQQQ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"atr3": {
"yes_no": 0.9463,
"rule": "atr_pct(14) > 3",
"basis": "rule"
},
"hv": {
"yes_no": 0.9424,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4",
"basis": "pattern"
},
"dd": {
"yes_no": 0.9198,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"drop10": {
"yes_no": 0.766
}
},
"context": {
"symbol": "TQQQ",
"as_of": "2026-10-30"
}
}Compliance officer · example 13
MSTR: context for a momentum-ignition alert
When a surveillance alert fires, record whether the day was already volatile, gapping and on heavy volume.
- StateMSTR
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MSTR"} The server fills in the latest completed session.
Questions
atr3 | rule | atr_pct(14) > 3A typical day moves more than 3% |
wide | rule | (H - L) > 2 * avg(H - L, 20)Range more than twice the 20-day average range |
vol | English → rule | Was today's volume twice its 20-day average? |
up2 | English → rule | Did the stock rise more than 2% today? |
down3 | English → rule | Did the stock fall more than 3% today? |
Answers
| Question | Answer | Reading |
|---|---|---|
atr3A typical day moves more than 3% | 0.9463 | true |
wideRange more than twice the 20-day average range | 0.0943 | false |
volWas today's volume twice its 20-day average compiled to V > 2 * ref(avg(V, 20), -1) | 0.3327 | false |
up2Did the stock rise more than 2% today compiled to C / C[-1] - 1 > 0.02 | 0.077 | false |
down3Did the stock fall more than 3% today compiled to C / C[-1] - 1 < -0.03 | 0.8372 | true |
What it means
For MSTR on the session of 2026-10-30: True now: A typical day moves more than 3%; Did the stock fall more than 3% today. Not true: Range more than twice the 20-day average range; Was today's volume twice its 20-day average; Did the stock rise more than 2% today.
A volatile name on a volatile day is ordinary; the context lets the reviewer close alerts that are just the market.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSTR"
},
"questions": {
"atr3": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"wide": {
"type": "yes_no",
"ask": "(H - L) > 2 * avg(H - L, 20)"
},
"vol": {
"type": "yes_no",
"instructions": "Was today's volume twice its 20-day average?"
},
"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?"
}
}
}Response JSON (MSTR, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"atr3": {
"yes_no": 0.9463,
"rule": "atr_pct(14) > 3",
"basis": "rule"
},
"wide": {
"yes_no": 0.0943,
"rule": "(H - L) > 2 * avg(H - L, 20)",
"basis": "rule"
},
"vol": {
"yes_no": 0.3327,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "pattern"
},
"up2": {
"yes_no": 0.077,
"rule": "C / C[-1] - 1 > 0.02",
"basis": "pattern"
},
"down3": {
"yes_no": 0.8372,
"rule": "C / C[-1] - 1 < -0.03",
"basis": "pattern"
}
},
"context": {
"symbol": "MSTR",
"as_of": "2026-10-30"
}
}Compliance officer · example 14
Best-execution review context: liquidity of traded names
For the quarterly best-execution review, record liquidity and volatility of the names traded.
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"IWM"} then XLU, TLT, HYG, one request each. The server fills in the latest completed session.
Questions
liquid | rule | avg(C * V, 20) > 100000000Trades more than $100 million a day |
dry | rule | V < 0.6 * avg(V, 20)Volume under 60% of normal |
atr_lo | English → rule | Is the 14-day ATR less than 2% of the price? |
median | rule | V > median(V, 20)Volume above its 20-day median |
Answers
| Symbol | liquidrule | dryrule | atr_lorule | medianrule |
|---|---|---|---|---|
IWM | 0.9463 | 0.0836 | 0.9463 | 0.6338 |
XLU | 0.9463 | 0.1146 | 0.9463 | 0.6199 |
TLT | 0.9463 | 0.1452 | 0.9463 | 0.6681 |
HYG | 0.9463 | 0.104 | 0.9463 | 0.7335 |
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: Trades more than $100 million a day: true for IWM, XLU, TLT, HYG of 4. Volume under 60% of normal: true for none of 4. Is the 14-day ATR less than 2% of the price: true for IWM, XLU, TLT, HYG of 4. Volume above its 20-day median: true for IWM, XLU, TLT, HYG of 4.
Execution quality is judged against how liquid and calm the market was; these facts set that baseline.
Request JSON (IWM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "IWM"
},
"questions": {
"liquid": {
"type": "yes_no",
"ask": "avg(C * V, 20) > 100000000"
},
"dry": {
"type": "yes_no",
"ask": "V < 0.6 * avg(V, 20)"
},
"atr_lo": {
"type": "yes_no",
"instructions": "Is the 14-day ATR less than 2% of the price?"
},
"median": {
"type": "yes_no",
"ask": "V > median(V, 20)"
}
}
}Response JSON (IWM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"liquid": {
"yes_no": 0.9463,
"rule": "avg(C * V, 20) > 100000000",
"basis": "rule"
},
"dry": {
"yes_no": 0.0836,
"rule": "V < 0.6 * avg(V, 20)",
"basis": "rule"
},
"atr_lo": {
"yes_no": 0.9463,
"rule": "atr(14) / C < 0.02",
"basis": "pattern"
},
"median": {
"yes_no": 0.6338,
"rule": "V > median(V, 20)",
"basis": "rule"
}
},
"context": {
"symbol": "IWM",
"as_of": "2026-10-30"
}
}Compliance officer · example 15
SMCI: rapid run-up context for a review
Document a rapid rise (extension, consecutive up days, volume) when reviewing promotional activity in a name.
- StateSMCI
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SMCI"} The server fills in the latest completed session.
Questions
ext | English → rule | Is the stock more than 10% above its 200-day moving average? |
up3 | English → rule | Has the stock closed higher 3 days in a row? |
soldiers | rule | three_white_soldiers()three white soldiers candle: Three green bars, each closing higher and opening inside the previous body. |
vol | rule | V > 2 * ref(avg(V, 20), -1)Volume more than twice the previous 20-day average |
roc | rule | roc(C, 5) > 15Up more than 15% over five sessions |
Answers
| Question | Answer | Reading |
|---|---|---|
extIs the stock more than 10% above its 200-day moving average compiled to C > sma(C, 200) * 1.1 | 0.1742 | false |
up3Has the stock closed higher 3 days in a row compiled to (C > C[-1]) and (C[-1] > C[-2]) and (C[-2] > C[-3]) | 0.1678 | false |
soldiersthree white soldiers candle: Three green bars, each closing higher and opening inside the previous body. | 0.0834 | false |
volVolume more than twice the previous 20-day average | 0.1119 | false |
rocUp more than 15% over five sessions | 0.101 | false |
What it means
For SMCI on the session of 2026-10-30: Not true: Is the stock more than 10% above its 200-day moving average; Has the stock closed higher 3 days in a row; three white soldiers candle: Three green bars, each closing higher and opening inside the previous body.; Volume more than twice the previous 20-day average; Up more than 15% over five sessions.
A rapid run-up is described in neutral terms; the reviewer decides whether any communication needs follow-up.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SMCI"
},
"questions": {
"ext": {
"type": "yes_no",
"instructions": "Is the stock more than 10% above its 200-day moving average?"
},
"up3": {
"type": "yes_no",
"instructions": "Has the stock closed higher 3 days in a row?"
},
"soldiers": {
"type": "yes_no",
"ask": "three_white_soldiers()"
},
"vol": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"roc": {
"type": "yes_no",
"ask": "roc(C, 5) > 15"
}
}
}Response JSON (SMCI, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"ext": {
"yes_no": 0.1742,
"rule": "C > sma(C, 200) * 1.1",
"basis": "comparison"
},
"up3": {
"yes_no": 0.1678,
"rule": "(C > C[-1]) and (C[-1] > C[-2]) and (C[-2] > C[-3])",
"basis": "pattern"
},
"soldiers": {
"yes_no": 0.0834,
"rule": "three_white_soldiers()",
"basis": "rule"
},
"vol": {
"yes_no": 0.1119,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"roc": {
"yes_no": 0.101,
"rule": "roc(C, 5) > 15",
"basis": "rule"
}
},
"context": {
"symbol": "SMCI",
"as_of": "2026-10-30"
}
}Compliance officer · example 16
XOM: was volume unusually high on a flat price day?
Volume far above normal with little price change can merit a look; record both facts for the reviewer.
- StateXOM
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"XOM"} The server fills in the latest completed session.
Questions
vol | rule | V > 2 * ref(avg(V, 20), -1)Volume more than twice the previous 20-day average |
flat | rule | abs(C / C[-1] - 1) < 0.003Close within 0.3% of the previous close |
doji | rule | doji()doji candle: Body at most 10% of the day's range. |
inside | rule | H < H[-1] and L > L[-1]An inside day |
Answers
| Question | Answer | Reading |
|---|---|---|
volVolume more than twice the previous 20-day average | 0.2958 | false |
flatClose within 0.3% of the previous close | 0.0741 | false |
dojidoji candle: Body at most 10% of the day's range. | 0.1743 | false |
insideAn inside day | 0.0704 | false |
Actions
Rules on the answers decide what to send.
vol >= 0.6 and flat >= 0.6→Webhooksurveillance-casesWhat it means
For XOM on the session of 2026-10-30: Not true: Volume more than twice the previous 20-day average; Close within 0.3% of the previous close; doji candle: Body at most 10% of the day's range.; An inside day. No action fired: every rule was false.
High volume with a flat close is common around index events too; the record gives the reviewer the starting facts.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XOM"
},
"questions": {
"vol": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"flat": {
"type": "yes_no",
"ask": "abs(C / C[-1] - 1) < 0.003"
},
"doji": {
"type": "yes_no",
"ask": "doji()"
},
"inside": {
"type": "yes_no",
"ask": "H < H[-1] and L > L[-1]"
}
},
"actions": [
{
"id": "context",
"when": "vol >= 0.6 and flat >= 0.6",
"do": "webhook",
"connection": "surveillance-cases",
"body": {
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"type": "volume_without_price_change",
"volume_spike": "{{vol}}",
"flat_close": "{{flat}}",
"note": "Context only; no finding."
}
}
],
"dry_run": true
}Response JSON (XOM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"vol": {
"yes_no": 0.2958,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"flat": {
"yes_no": 0.0741,
"rule": "abs(C / C[-1] - 1) < 0.003",
"basis": "rule"
},
"doji": {
"yes_no": 0.1743,
"rule": "doji()",
"basis": "rule"
},
"inside": {
"yes_no": 0.0704,
"rule": "H < H[-1] and L > L[-1]",
"basis": "rule"
}
},
"context": {
"symbol": "XOM",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "context",
"fired": false,
"status": "skipped"
}
]
}Compliance officer · example 17
Short positions over the ex-date: which names owe a dividend
Make sure short positions crossing an ex-date are charged the dividend by listing names going ex within days.
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"JNJ"} then PEP, ABBV, MO, one request each. The server fills in the latest completed session.
Questions
ex7 | rule | days_to_ex_div <= 7Ex-dividend date within seven days |
pays | rule | pays_dividend > 0.5Pays a dividend |
next_up | English → rule | Is the next declared dividend larger than the last one? |
div2 | English → rule | Has the stock paid more than $2 per share in dividends over the past year? |
Answers
| Symbol | ex7rule | paysrule | next_uprule | div2rule | Fired |
|---|---|---|---|---|---|
JNJ | 0.0537 | 0.8591 | 0.45 | 0.9463 | none |
PEP | 0.0537 | 0.8591 | 0.50 | 0.9463 | none |
ABBV | 0.0537 | 0.8591 | 0.50 | 0.9463 | none |
MO | 0.0537 | 0.8591 | 0.50 | 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.
ex7 >= 0.6→Emailcompliance-opsWhat it means
Session of 2026-10-30, 4 symbols: Ex-dividend date within seven days: true for none of 4. Pays a dividend: true for JNJ, PEP, ABBV, MO of 4. Is the next declared dividend larger than the last one: true for none of 4. Has the stock paid more than $2 per share in dividends over the past year: true for JNJ, PEP, ABBV, MO of 4. ops fired for none.
Declared ex-dates drive an operations reminder; undeclared ones answer no and send nothing.
Request JSON (JNJ; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JNJ"
},
"questions": {
"ex7": {
"type": "yes_no",
"ask": "days_to_ex_div <= 7"
},
"pays": {
"type": "yes_no",
"ask": "pays_dividend > 0.5"
},
"next_up": {
"type": "yes_no",
"instructions": "Is the next declared dividend larger than the last one?"
},
"div2": {
"type": "yes_no",
"instructions": "Has the stock paid more than $2 per share in dividends over the past year?"
}
},
"actions": [
{
"id": "ops",
"when": "ex7 >= 0.6",
"do": "email",
"connection": "compliance-ops",
"subject": "{{symbol}} goes ex within 7 days",
"message": "{{symbol}}: ex-dividend within 7 days. Confirm short positions are charged the dividend and stock loan records are current."
}
],
"dry_run": true
}Response JSON (JNJ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"ex7": {
"yes_no": 0.0537,
"rule": "days_to_ex_div <= 7",
"basis": "rule"
},
"pays": {
"yes_no": 0.8591,
"rule": "pays_dividend > 0.5",
"basis": "rule"
},
"next_up": {
"yes_no": 0.45,
"rule": "next_div_amount > last_div_amount",
"basis": "pattern"
},
"div2": {
"yes_no": 0.9463,
"rule": "div_ttm > 2",
"basis": "pattern"
}
},
"context": {
"symbol": "JNJ",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "ops",
"fired": false,
"status": "skipped"
}
]
}days_to_ex_div div_ttm last_div_amount next_div_amount pays_dividend
Compliance officer · example 18
Supervision check: did a trader's name break key levels?
Daily supervisory record of whether watched names crossed their 50-day or 20-day extremes, for the supervision log.
- StateAAPL
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} The server fills in the latest completed session.
Questions
x_up | rule | crossup(C, sma(C, 50))Crossed above the 50-day today |
x_dn | rule | crossdown(C, sma(C, 50))Crossed below the 50-day today |
high20 | rule | C > highest(C, 20)20-day closing breakout |
low20 | rule | C < lowest(L, 20)Closed under the 20-day low |
since | rule | barssince(C > highest(C, 20)) > 30More than 30 sessions since the last 20-day closing high |
Answers
| Question | Answer | Reading |
|---|---|---|
x_upCrossed above the 50-day today | 0.05 | false |
x_dnCrossed below the 50-day today | 0.05 | false |
high2020-day closing breakout | 0.3146 | false |
low20Closed under the 20-day low | 0.0744 | false |
sinceMore than 30 sessions since the last 20-day closing high | 0.0537 | false |
What it means
For AAPL on the session of 2026-10-30: Not true: Crossed above the 50-day today; Crossed below the 50-day today; 20-day closing breakout; Closed under the 20-day low; More than 30 sessions since the last 20-day closing high.
The log records level events with the rule behind each, so a supervisor can see exactly what was checked.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"x_up": {
"type": "yes_no",
"ask": "crossup(C, sma(C, 50))"
},
"x_dn": {
"type": "yes_no",
"ask": "crossdown(C, sma(C, 50))"
},
"high20": {
"type": "yes_no",
"ask": "C > highest(C, 20)"
},
"low20": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"since": {
"type": "yes_no",
"ask": "barssince(C > highest(C, 20)) > 30"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"x_up": {
"yes_no": 0.05,
"rule": "crossup(C, sma(C, 50))",
"basis": "rule"
},
"x_dn": {
"yes_no": 0.05,
"rule": "crossdown(C, sma(C, 50))",
"basis": "rule"
},
"high20": {
"yes_no": 0.3146,
"rule": "C > highest(C, 20)",
"basis": "rule"
},
"low20": {
"yes_no": 0.0744,
"rule": "C < lowest(L, 20)",
"basis": "rule"
},
"since": {
"yes_no": 0.0537,
"rule": "barssince(C > highest(C, 20)) > 30",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}Compliance officer · example 19
Audit trail: store every answer with its rule
Send the full answer set for a decision to the archive, so any later review sees what the model said and why.
- StateMSFT
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"MSFT"} The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 50-day moving average? |
hammer | rule | hammer()hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back. |
engulf | rule | engulfing_bull()engulfing bull candle: A green body that engulfs yesterday's red body. |
earn | rule | days_to_earnings <= 10Reports earnings within 10 days |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
trendIs the stock above its 50-day moving average compiled to C > sma(C, 50) | 0.7088 | true |
hammerhammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back. | 0.5701 | on the line (true) |
engulfengulfing bull candle: A green body that engulfs yesterday's red body. | 0.0643 | false |
earnReports earnings within 10 days | 0.0537 | false |
up_weekHigher in a week | 0.574 | 57% · close to even |
Actions
Rules on the answers decide what to send.
trend >= 0→Webhookrecords-archive{
"symbol": "MSFT",
"as_of": "2026-10-30",
"answers": {
"trend": {
"type": "yes_no",
"yes_no": 0.7088,
"rule": "C > sma(C, 50)",
"basis": "comparison",
"explain": "today's close > sma50"
},
"hammer": {
"type": "yes_no",
"yes_no": 0.5701,
"rule": "hammer()",
"basis": "rule"
},
"engulf": {
"type": "yes_no",
"yes_no": 0.0643,
"rule": "engulfing_bull()",
"basis": "rule"
},
"earn": {
"type": "yes_no",
"yes_no": 0.0537,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"up_week": {
"type": "yes_no",
"yes_no": 0.574
}
},
"retention": "7y"
}What it means
For MSFT on the session of 2026-10-30: True now: Is the stock above its 50-day moving average. Not true: engulfing bull candle: A green body that engulfs yesterday's red body.; Reports earnings within 10 days. On the line: hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back.. Forecasts: Higher in a week 57%. Fired: archive (Webhook → records-archive).
Rule answers carry their rule and forecasts carry none; archiving both lets reviewers tell facts from predictions.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 50-day moving average?"
},
"hammer": {
"type": "yes_no",
"ask": "hammer()"
},
"engulf": {
"type": "yes_no",
"ask": "engulfing_bull()"
},
"earn": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "archive",
"when": "trend >= 0",
"do": "webhook",
"connection": "records-archive",
"body": {
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"answers": "{{answers}}",
"retention": "7y"
}
}
],
"dry_run": true
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.7088,
"rule": "C > sma(C, 50)",
"basis": "comparison"
},
"hammer": {
"yes_no": 0.5701,
"rule": "hammer()",
"basis": "rule"
},
"engulf": {
"yes_no": 0.0643,
"rule": "engulfing_bull()",
"basis": "rule"
},
"earn": {
"yes_no": 0.0537,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"up_week": {
"yes_no": 0.574
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "archive",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "records-archive",
"preview": {
"body": {
"symbol": "MSFT",
"as_of": "2026-10-30",
"answers": {
"trend": {
"type": "yes_no",
"yes_no": 0.7088,
"rule": "C > sma(C, 50)",
"basis": "comparison",
"explain": "today's close > sma50"
},
"hammer": {
"type": "yes_no",
"yes_no": 0.5701,
"rule": "hammer()",
"basis": "rule"
},
"engulf": {
"type": "yes_no",
"yes_no": 0.0643,
"rule": "engulfing_bull()",
"basis": "rule"
},
"earn": {
"type": "yes_no",
"yes_no": 0.0537,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"up_week": {
"type": "yes_no",
"yes_no": 0.574
}
},
"retention": "7y"
}
}
}
]
}Compliance officer · example 20
Crypto ETF statements in client emails: verify before sending
Check statements like 'bitcoin ETFs are in an uptrend' against the data for IBIT and ETHA before approval.
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"IBIT"} then ETHA, one request each. The server fills in the latest completed session.
Questions
above200 | English → rule | Is the stock above its 200-day moving average? |
above50 | English → rule | Is the stock above its 50-day moving average? |
dd | English → rule | Is the stock more than 20% below its 52-week high? |
hv | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
Answers
| Symbol | above200rule | above50rule | ddrule | hvrule |
|---|---|---|---|---|
IBIT | 0.7234 | 0.1649 | 0.9082 | 0.1239 |
ETHA | 0.585 | 0.1263 | 0.9441 | 0.3361 |
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 IBIT of 2. Is the stock above its 50-day moving average: true for none of 2. Is the stock more than 20% below its 52-week high: true for IBIT, ETHA of 2. Annualized 20-day volatility above 40%: true for none of 2.
If the data does not support the statement, the email is revised before it reaches clients.
Request JSON (IBIT; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "IBIT"
},
"questions": {
"above200": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"above50": {
"type": "yes_no",
"instructions": "Is the stock above its 50-day moving average?"
},
"dd": {
"type": "yes_no",
"instructions": "Is the stock more than 20% below its 52-week high?"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
}
}
}Response JSON (IBIT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"above200": {
"yes_no": 0.7234,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"above50": {
"yes_no": 0.1649,
"rule": "C > sma(C, 50)",
"basis": "comparison"
},
"dd": {
"yes_no": 0.9082,
"rule": "C < max(H, 252) * 0.8",
"basis": "comparison"
},
"hv": {
"yes_no": 0.1239,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
"basis": "rule"
}
},
"context": {
"symbol": "IBIT",
"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.