Ora
All use cases All industries

Individuals

Retail investorActive day traderSwing traderOptions traderDividend investorLong-term passive investorCrypto traderFX traderCommodities traderSocial trading communityStudents and universities

Buy side

Financial advisor / RIAWealth managerFamily officeHedge fund PMQuant researcherPortfolio manager (long-only)Risk managerPrivate equityVC / growth investorFund-of-funds allocator

Sell side

Equity research analystSell-side sales traderExecution trader / deskMarket makerProp trading firmCompliance officer

Corporates

Investor relations teamCorporate treasuryCFO officeBank credit analystFinancial journalist / media

Builders

Quant developerFintech app builderRobo-advisorBroker appAlgo / bot developerData vendor / platformTrading educator / newsletter

Institutions

ETF issuerIndex providerInsurance investment officePension fundEndowmentSovereign wealth fund

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.

Answers were captured on 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.

ora-fin-0.1.1NVDA5 questions2 actions
  1. StateNVDA
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

{"symbol":"NVDA"} The server fills in the latest completed session.

Questions

earnruledays_to_earnings <= 10
Reports earnings within 10 days
spikeruleV > 2 * ref(avg(V, 20), -1)
Volume more than twice the previous 20-day average
rankrulepercentrank(V, 50) > 90
Volume in the top tenth of 50 sessions
bigruleabs(C - C[-1]) > 1.5 * atr(14)
Today's move was bigger than 1.5 ATR
spike_tomforecastWill volume spike tomorrow?
A volume spike tomorrow

Answers

QuestionAnswerReading
earn
Reports earnings within 10 days
0.0563false
spike
Volume more than twice the previous 20-day average
0.1794false
rank
Volume in the top tenth of 50 sessions
0.5398on the line (true)
big
Today's move was bigger than 1.5 ATR
0.4404on the line (false)
spike_tom
A volume spike tomorrow
0.0444% · unlikely

Actions

Rules on the answers decide what to send.

earn >= 0.6 and (spike >= 0.6 or rank >= 0.6)→Webhooksurveillance-cases
else→Slackcompliance-log
What each action would send 1 of 2 fired · dry run, nothing sent
caserule false: skipped
logwould send (dry run)Slack → compliance-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%)."
      }
    }
  ]
}

abs atr avg days_to_earnings offset percentrank ref

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.

ora-fin-0.1.14 symbols, one request each4 questions1 actionworkflow · Mon–Fri at 17:15 ET
  1. ScheduleMon–Fri at 17:15 ET
  2. State4 symbols
  3. Questions4 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

{"symbol":"JPM"} then GS, BAC, C, one request each. The server fills in the latest completed session.

Questions

bigruleabs(C - C[-1]) > 1.5 * atr(14)
Today's move was bigger than 1.5 ATR
shockrulezscore(C / C[-1] - 1, 20) < -2
A two-sigma down day
volruleV > 2 * ref(avg(V, 20), -1)
Volume more than twice the previous 20-day average
gapruleabs(O - C[-1]) > 0.5 * ref(atr(14), -1)
Gap bigger than half an ATR

Answers

SymbolbigruleshockrulevolrulegapruleFired
JPM0.1010.59370.08320.153none
GS0.28240.69640.05370.9104log
BAC0.13090.21920.0610.1685none
C0.10240.18510.12070.6901none

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
JPM 0 of 1 fired · dry run, nothing sent
GS 1 of 1 fired · dry run, nothing sent
logwould send (dry run)Email → compliance-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."
}
BAC 0 of 1 fired · dry run, nothing sent
C 0 of 1 fired · dry run, nothing sent

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"
    }
  ]
}

abs atr avg offset ref zscore

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.

ora-fin-0.1.1TSLA7 questions
  1. StateTSLA
  2. Questions7 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"TSLA"} The server fills in the latest completed session.

Questions

gap_upruleO > C[-1] * 1.01
Opened more than 1% above yesterday's close
gap_dnruleO < C[-1] * 0.99
Opened more than 1% below yesterday's close
gap_atrruleabs(O - C[-1]) > 0.5 * ref(atr(14), -1)
Gap bigger than half an ATR
unfilledEnglish → ruleDid the stock gap up with today's low above yesterday's high?
fadedruleO > C[-1] and C < C[-1]
Gapped up but closed under yesterday's close
gap_up_barrulegap_up()
gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.
gap_dn_barrulegap_down()
gap down candle: Today's whole range is below yesterday's low.

Answers

QuestionAnswerReading
gap_up
Opened more than 1% above yesterday's close
0.0562false
gap_dn
Opened more than 1% below yesterday's close
0.8793true
gap_atr
Gap bigger than half an ATR
0.8646true
unfilled
Did the stock gap up with today's low above yesterday's high
compiled to gap_up()
0.0577false
faded
Gapped up but closed under yesterday's close
0.0708false
gap_up_bar
gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.
0.0577false
gap_dn_bar
gap down candle: Today's whole range is below yesterday's low.
0.2768false

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"
  }
}

abs atr gap_down gap_up offset ref

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.

ora-fin-0.1.1JPM5 questions
  1. StateJPM
  2. Questions5 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"JPM"} The server fills in the latest completed session.

Questions

recentruledays_since_earnings <= 5
Reported in the last 5 days
surpriseruleeps_surprise_pct > 5
EPS beat by more than 5%
beatEnglish → ruleDid the stock beat on both EPS and revenue last quarter?
gapEnglish → ruleDid the stock gap up after its last earnings?
reactruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%

Answers

QuestionAnswerReading
recent
Reported in the last 5 days
0.0537false
surprise
EPS beat by more than 5%
0.0844false
beat
Did the stock beat on both EPS and revenue last quarter
compiled to beat_eps_last > 0.5 and beat_revenue_last > 0.5
0.1409false
gap
Did the stock gap up after its last earnings
compiled to last_earnings_gap > 0
0.9463true
react
Last earnings move bigger than 5%
0.0664false

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.

ora-fin-0.1.14 symbols, one request each4 questions
  1. State4 symbols
  2. Questions4 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"KO"} then PG, T, VZ, one request each. The server fills in the latest completed session.

Questions

ex_recentruledays_since_ex_div <= 5
Went ex-dividend in the last five days
ex_soonruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
yield3rulediv_yield_ttm > 3
Yield above 3%
paysrulepays_dividend > 0.5
Pays a dividend

Answers

Symbolex_recentruleex_soonruleyield3rulepaysrule
KO0.05370.20490.05370.8591
PG0.20490.05370.20910.8591
T0.05370.05370.94630.8591
VZ0.05370.05370.94630.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.

ora-fin-0.1.13 symbols, one request each4 questions1 action
  1. State3 symbols
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

{"symbol":"NVDA"} then SMCI, AAPL, one request each. The server fills in the latest completed session.

Questions

recentruledays_since_split <= 30
Split in the last 30 days
announcedruledays_to_split <= 365
A split is announced
reverseEnglish → ruleHas the stock done a reverse split in the past year?
ratioEnglish → ruleWas the last split at least 2-for-1?

Answers

SymbolrecentruleannouncedrulereverseruleratioruleFired
NVDA0.05370.05370.05370.9463none
SMCI0.05370.05370.05370.9463none
AAPL0.05370.05370.05370.9463none

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-ops
NVDA 0 of 1 fired · dry run, nothing sent
SMCI 0 of 1 fired · dry run, nothing sent
AAPL 0 of 1 fired · dry run, nothing sent

What 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.

ora-fin-0.1.1SPY5 questions
  1. StateSPY
  2. Questions5 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"SPY"} The server fills in the latest completed session.

Questions

toprule(C - L) / (H - L) > 0.75
Closed in the top quarter of the day's range
bottomrule(C - L) / (H - L) < 0.25
Closed in the bottom quarter of the day's range
volruleV > avg(V, 20)
Volume above its 20-day average
trend_dayrule(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
marubozurulemarubozu()
marubozu candle: Body at least 90% of the range: almost no wicks.

Answers

QuestionAnswerReading
top
Closed in the top quarter of the day's range
0.1294false
bottom
Closed in the bottom quarter of the day's range
0.1492false
vol
Volume above its 20-day average
0.9463true
trend_day
A trend day up: opened near the low, closed near the high
0.0537false
marubozu
marubozu candle: Body at least 90% of the range: almost no wicks.
0.0537false

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"
  }
}

avg marubozu

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.

ora-fin-0.1.15 symbols, one request each4 questions1 actionworkflow · Mon–Fri at 17:30 ET
  1. ScheduleMon–Fri at 17:30 ET
  2. State5 symbols
  3. Questions4 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

{"symbol":"AAPL"} then MSFT, AMZN, TSLA, NFLX, one request each. The server fills in the latest completed session.

Questions

shockrulezscore(C / C[-1] - 1, 20) < -2
A two-sigma down day
zsrulezscore(C / C[-1] - 1, 60) > 2
Daily return over two standard deviations above its 60-day norm
volruleV > 2 * ref(avg(V, 20), -1)
Volume more than twice the previous 20-day average
outsideruleoutside_bar()
outside bar candle: Today's high above yesterday's and low below it.

Answers

SymbolshockrulezsrulevolruleoutsideruleFired
AAPL0.2530.05370.24730.2273none
MSFT0.17070.05370.2620.0651none
AMZN0.0890.05370.91350.0661none
TSLA0.09450.05370.05890.3172none
NFLX0.06390.07230.07080.401none

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-cases
AAPL 0 of 1 fired · dry run, nothing sent
MSFT 0 of 1 fired · dry run, nothing sent
AMZN 0 of 1 fired · dry run, nothing sent
TSLA 0 of 1 fired · dry run, nothing sent
NFLX 0 of 1 fired · dry run, nothing sent

What 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"
    }
  ]
}

avg offset outside_bar ref zscore

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.

ora-fin-0.1.1AMD5 questions1 action
  1. StateAMD
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

{"symbol":"AMD"} The server fills in the latest completed session.

Questions

above200English → ruleIs the stock above its 200-day moving average?
goldenEnglish → ruleIs the 50-day moving average above the 200-day?
new_highEnglish → ruleDid the stock make a new 52-week high today?
rsi70English → ruleIs the stock overbought on RSI, above 70?
macdEnglish → ruleIs the MACD line above its signal line?

Answers

QuestionAnswerReading
above200
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.9284true
golden
Is the 50-day moving average above the 200-day
compiled to sma(C, 50) > sma(C, 200)
0.9463true
new_high
Did the stock make a new 52-week high today
compiled to H > highest(H, 252)
0.0537false
rsi70
Is the stock overbought on RSI, above 70
compiled to rsi(C, 14) > 70
0.055false
macd
Is the MACD line above its signal line
compiled to macd(C) > macdsignal(C)
0.2076false

Actions

Rules on the answers decide what to send.

above200 >= 0→Webhookreview-workflow
What each action would send 1 of 1 fired · dry run, nothing sent
ticketwould send (dry run)Webhook → review-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
        }
      }
    }
  ]
}

highest macd macdsignal rsi sma

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.

ora-fin-0.1.1QQQ4 questions
  1. StateQQQ
  2. Questions4 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"QQQ"} The server fills in the latest completed session.

Questions

near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
new_highruleH > highest(H, 252)
New 52-week high
up_monthEnglish → ruleIs the stock up over the last month?
up_3mEnglish → ruleIs the stock up more than 10% over the last three months?

Answers

QuestionAnswerReading
near_high
Within 2% of the 52-week high
0.0537false
new_high
New 52-week high
0.0537false
up_month
Is the stock up over the last month
compiled to C > C[-21]
0.0664false
up_3m
Is the stock up more than 10% over the last three months
compiled to C / C[-63] - 1 > 0.1
0.0537false

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"
  }
}

highest max offset

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.

Create an account Open the Playground Everything here also lives in the console, next to your keys and usage.