Use cases · Sell side
Market maker: 20 ways to use Ora
Quotes two-sided markets: volatility regime, event risk, gaps and inventory warnings. Each example is a complete, runnable request with the real answers it returned (36 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 (56)
offset 10ref 6atr 5abs 5log 4sqrt 4std 4sma 4atr_pct 3zscore 3avg 3lowest 3rsi 2bblower 2percentrank 2highest 2days_to_earnings 1last_earnings_gap 1last_earnings_move 1next_report_amc 1macd 1macdsignal 1bbmid 1bbupper 1max 1min 1spinning_top 1outside_bar 1evening_star 1harami_bear 1shooting_star 1tweezer_top 1days_since_ex_div 1days_to_ex_div 1div_count_ttm 1last_div_amount 1next_div_amount 1pays_dividend 1days_since_split 1days_to_split 1reverse_split_last 1splits_5y 1adx 1diminus 1diplus 1swinghigh 1swinglow 1median 1inside_bar 1marubozu 1greatest 1least 1barssince 1lowestbars 1crossdown 1crossup 1
Examples 1–10 of 20 · page 1 of 2
Market maker · example 1
TSLA quoting: widen spreads when volatility expands
Tell the quoting engine to widen TSLA spreads when ATR and short-term volatility expand, and to normalise when they calm.
- StateTSLA
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"TSLA"} The server fills in the latest completed session.
Questions
atr_exp | rule | atr(14) > 1.2 * ref(atr(14), -10)ATR up 20% in two weeks |
vol5 | English → rule | Is 5-day volatility higher than 20-day volatility? |
hv40 | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
vol_rise | forecast | Will volatility rise over the next 5 days? Volatility rising over 5 days |
calm | forecast | Will volatility calm down over the next 5 days? Volatility calming over 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
atr_expATR up 20% in two weeks | 0.3085 | false |
vol5Is 5-day volatility higher than 20-day volatility compiled to std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19) | 0.7322 | true |
hv40Annualized 20-day volatility above 40% | 0.2867 | false |
vol_riseVolatility rising over 5 days | 0.38 | 38% · unlikely |
calmVolatility calming over 5 days | 0.624 | 62% · likely |
Actions
Rules on the answers decide what to send.
atr_exp >= 0.6 or (vol5 >= 0.6 and vol_rise >= 0.55)→Webhookquoting-engineelse→Webhookquoting-engine{
"symbol": "TSLA",
"action": "default_spread",
"p_calm": 0.624,
"as_of": "2026-10-30"
}What it means
For TSLA on the session of 2026-10-30: True now: Is 5-day volatility higher than 20-day volatility. Not true: ATR up 20% in two weeks; Annualized 20-day volatility above 40%. Forecasts: Volatility rising over 5 days 38%; Volatility calming over 5 days 62%. Fired: normal (Webhook → quoting-engine).
Exact volatility rules drive the change; the forecasts tip the decision when the short-term reading is borderline.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TSLA"
},
"questions": {
"atr_exp": {
"type": "yes_no",
"ask": "atr(14) > 1.2 * ref(atr(14), -10)"
},
"vol5": {
"type": "yes_no",
"instructions": "Is 5-day volatility higher than 20-day volatility?"
},
"hv40": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"vol_rise": {
"type": "yes_no",
"instructions": "Will volatility rise over the next 5 days?"
},
"calm": {
"type": "yes_no",
"instructions": "Will volatility calm down over the next 5 days?"
}
},
"actions": [
{
"id": "widen",
"when": "atr_exp >= 0.6 or (vol5 >= 0.6 and vol_rise >= 0.55)",
"do": "webhook",
"connection": "quoting-engine",
"body": {
"symbol": "{{symbol}}",
"action": "widen_spread",
"spread_multiplier": 1.5,
"p_atr_expanding": "{{atr_exp}}",
"p_vol_rise": "{{vol_rise}}",
"as_of": "{{as_of}}"
}
},
{
"id": "normal",
"when": "else",
"do": "webhook",
"connection": "quoting-engine",
"body": {
"symbol": "{{symbol}}",
"action": "default_spread",
"p_calm": "{{calm}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (TSLA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"atr_exp": {
"yes_no": 0.3085,
"rule": "atr(14) > 1.2 * ref(atr(14), -10)",
"basis": "rule"
},
"vol5": {
"yes_no": 0.7322,
"rule": "std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19)",
"basis": "pattern"
},
"hv40": {
"yes_no": 0.2867,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
"basis": "rule"
},
"vol_rise": {
"yes_no": 0.38
},
"calm": {
"yes_no": 0.624
}
},
"context": {
"symbol": "TSLA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "widen",
"fired": false,
"status": "skipped"
},
{
"id": "normal",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "quoting-engine",
"preview": {
"body": {
"symbol": "TSLA",
"action": "default_spread",
"p_calm": 0.624,
"as_of": "2026-10-30"
}
}
}
]
}Market maker · example 2
NVDA into earnings: pull size before the print
Cut displayed size and widen ahead of a report when the last reaction was large.
- 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 |
big | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
amc | English → rule | Does the stock report after the close next time? |
gap_last | rule | last_earnings_gap > 0Gapped up after the last report |
big5 | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
earnReports earnings within 10 days | 0.0563 | false |
bigLast earnings move bigger than 5% | 0.9463 | true |
amcDoes the stock report after the close next time compiled to next_report_amc > 0.5 | 0.8591 | true |
gap_lastGapped up after the last report | 0.9463 | true |
big5A big move either way in 5 days | 0.318 | 32% · unlikely |
Actions
Rules on the answers decide what to send.
earn >= 0.6 and big >= 0.6→Webhookquoting-engineearn >= 0.6→Slackquote-deskWhat it means
For NVDA on the session of 2026-10-30: True now: Last earnings move bigger than 5%; Does the stock report after the close next time; Gapped up after the last report. Not true: Reports earnings within 10 days. Forecasts: A big move either way in 5 days 32%. No action fired: every rule was false.
Event mode switches on only with both a near report and a history of big reactions.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"earn": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"big": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
},
"amc": {
"type": "yes_no",
"instructions": "Does the stock report after the close next time?"
},
"gap_last": {
"type": "yes_no",
"ask": "last_earnings_gap > 0"
},
"big5": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
},
"actions": [
{
"id": "event_mode",
"when": "earn >= 0.6 and big >= 0.6",
"do": "webhook",
"connection": "quoting-engine",
"body": {
"symbol": "{{symbol}}",
"action": "event_mode",
"max_display": 200,
"spread_multiplier": 2,
"reason": "earnings_within_10d_big_last_reaction",
"as_of": "{{as_of}}"
}
},
{
"id": "note",
"when": "earn >= 0.6",
"do": "slack",
"connection": "quote-desk",
"message": "{{symbol}} reports within 10 days (after the close {{amc|pct}}); last reaction was modest. Watch the event, no automatic change."
}
],
"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"
},
"big": {
"yes_no": 0.9463,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
},
"amc": {
"yes_no": 0.8591,
"rule": "next_report_amc > 0.5",
"basis": "pattern"
},
"gap_last": {
"yes_no": 0.9463,
"rule": "last_earnings_gap > 0",
"basis": "rule"
},
"big5": {
"yes_no": 0.318
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "event_mode",
"fired": false,
"status": "skipped"
},
{
"id": "note",
"fired": false,
"status": "skipped"
}
]
}abs days_to_earnings last_earnings_gap last_earnings_move next_report_amc
Market maker · example 3
SPY inventory: skew quotes against the trend
When carrying inventory, skew bids and offers by the prevailing short-term trend and momentum.
- StateSPY
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
above20 | rule | C > sma(C, 20)Close above the 20-day average |
macd | rule | macd(C) > macdsignal(C)MACD above its signal line |
rsi50 | rule | rsi(C, 14) > 50RSI above 50 |
down3 | English → rule | Has the stock closed lower 3 days in a row? |
up_tom | forecast | Will the stock be up tomorrow? Up tomorrow |
Answers
| Question | Answer | Reading |
|---|---|---|
above20Close above the 20-day average | 0.0816 | false |
macdMACD above its signal line | 0.1658 | false |
rsi50RSI above 50 | 0.0919 | false |
down3Has the stock closed lower 3 days in a row compiled to (C < C[-1]) and (C[-1] < C[-2]) and (C[-2] < C[-3]) | 0.2277 | false |
up_tomUp tomorrow | 0.532 | 53% · close to even |
Actions
Rules on the answers decide what to send.
above20 < 0.4 and macd < 0.4→Webhookquoting-engine{
"symbol": "SPY",
"action": "skew",
"direction": "lower",
"bps": 2,
"p_up_tomorrow": 0.532,
"as_of": "2026-10-30"
}What it means
For SPY on the session of 2026-10-30: Not true: Close above the 20-day average; MACD above its signal line; RSI above 50; Has the stock closed lower 3 days in a row. Forecasts: Up tomorrow 53%. Fired: skew (Webhook → quoting-engine).
A falling short-term tape means long inventory should be offered more keenly; the skew is small and rule-driven.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"above20": {
"type": "yes_no",
"ask": "C > sma(C, 20)"
},
"macd": {
"type": "yes_no",
"ask": "macd(C) > macdsignal(C)"
},
"rsi50": {
"type": "yes_no",
"ask": "rsi(C, 14) > 50"
},
"down3": {
"type": "yes_no",
"instructions": "Has the stock closed lower 3 days in a row?"
},
"up_tom": {
"type": "yes_no",
"instructions": "Will the stock be up tomorrow?"
}
},
"actions": [
{
"id": "skew",
"when": "above20 < 0.4 and macd < 0.4",
"do": "webhook",
"connection": "quoting-engine",
"body": {
"symbol": "{{symbol}}",
"action": "skew",
"direction": "lower",
"bps": 2,
"p_up_tomorrow": "{{up_tom}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"above20": {
"yes_no": 0.0816,
"rule": "C > sma(C, 20)",
"basis": "rule"
},
"macd": {
"yes_no": 0.1658,
"rule": "macd(C) > macdsignal(C)",
"basis": "rule"
},
"rsi50": {
"yes_no": 0.0919,
"rule": "rsi(C, 14) > 50",
"basis": "rule"
},
"down3": {
"yes_no": 0.2277,
"rule": "(C < C[-1]) and (C[-1] < C[-2]) and (C[-2] < C[-3])",
"basis": "pattern"
},
"up_tom": {
"yes_no": 0.532
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "skew",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "quoting-engine",
"preview": {
"body": {
"symbol": "SPY",
"action": "skew",
"direction": "lower",
"bps": 2,
"p_up_tomorrow": 0.532,
"as_of": "2026-10-30"
}
}
}
]
}Market maker · example 4
Overnight gap risk: AMD, MU, SMCI, MSTR, TQQQ
Before the close, flag names where overnight gap odds and ATR say to flatten inventory.
- ScheduleMon–Fri at 15:30 ET
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AMD"} then MU, SMCI, MSTR, TQQQ, one request each. The server fills in the latest completed session.
Questions
gap_up | forecast | Will it gap up tomorrow? A gap up tomorrow |
gap_dn | forecast | Will it gap down tomorrow? A gap down tomorrow |
atr3 | rule | atr_pct(14) > 3A typical day moves more than 3% |
gap_atr | rule | abs(O - C[-1]) > 0.5 * ref(atr(14), -1)Gap bigger than half an ATR |
Answers
| Symbol | gap_upforecast | gap_dnforecast | atr3rule | gap_atrrule | Fired |
|---|---|---|---|---|---|
AMD | 0.363 | 0.252 | 0.9441 | 0.9463 | flatten |
MU | 0.372 | 0.246 | 0.9303 | 0.9214 | flatten |
SMCI | 0.322 | 0.237 | 0.9463 | 0.8465 | flatten |
MSTR | 0.352 | 0.249 | 0.9463 | 0.9349 | flatten |
TQQQ | 0.383 | 0.268 | 0.9463 | 0.9463 | flatten |
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.
atr3 >= 0.6 and (gap_up >= 0.1 or gap_dn >= 0.1)→Slackquote-desk{
"text": "AMD (2026-10-30): ATR over 3% with gap odds up 36% / down 25%. Flatten inventory into the close."
}{
"text": "MU (2026-10-30): ATR over 3% with gap odds up 37% / down 25%. Flatten inventory into the close."
}{
"text": "SMCI (2026-10-30): ATR over 3% with gap odds up 32% / down 24%. Flatten inventory into the close."
}{
"text": "MSTR (2026-10-30): ATR over 3% with gap odds up 35% / down 25%. Flatten inventory into the close."
}{
"text": "TQQQ (2026-10-30): ATR over 3% with gap odds up 38% / down 27%. Flatten inventory into the close."
}What it means
Session of 2026-10-30, 5 symbols: A typical day moves more than 3%: true for AMD, MU, SMCI, MSTR, TQQQ of 5. Gap bigger than half an ATR: true for AMD, MU, SMCI, MSTR, TQQQ of 5. Highest odds for “A gap up tomorrow”: TQQQ at 38%. flatten fired for AMD, MU, SMCI, MSTR, TQQQ.
A scheduled check before the close; only high-ATR names with meaningful gap odds post.
As a scheduled workflow (Mon–Fri at 15: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": "Overnight gap risk: AMD, MU, SMCI, MSTR, TQQQ",
"symbols": "AMD MU SMCI MSTR TQQQ",
"days": [
1,
2,
3,
4,
5
],
"at_time": "15:30",
"model": "ora-fin-0.1.1",
"questions": {
"gap_up": {
"type": "yes_no",
"instructions": "Will it gap up tomorrow?"
},
"gap_dn": {
"type": "yes_no",
"instructions": "Will it gap down tomorrow?"
},
"atr3": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"gap_atr": {
"type": "yes_no",
"ask": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)"
}
},
"actions": [
{
"id": "flatten",
"when": "atr3 >= 0.6 and (gap_up >= 0.1 or gap_dn >= 0.1)",
"do": "slack",
"connection": "quote-desk",
"message": "{{symbol}} ({{as_of}}): ATR over 3% with gap odds up {{gap_up|pct}} / down {{gap_dn|pct}}. Flatten inventory into the close."
}
]
}Request JSON (AMD; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AMD"
},
"questions": {
"gap_up": {
"type": "yes_no",
"instructions": "Will it gap up tomorrow?"
},
"gap_dn": {
"type": "yes_no",
"instructions": "Will it gap down tomorrow?"
},
"atr3": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"gap_atr": {
"type": "yes_no",
"ask": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)"
}
},
"actions": [
{
"id": "flatten",
"when": "atr3 >= 0.6 and (gap_up >= 0.1 or gap_dn >= 0.1)",
"do": "slack",
"connection": "quote-desk",
"message": "{{symbol}} ({{as_of}}): ATR over 3% with gap odds up {{gap_up|pct}} / down {{gap_dn|pct}}. Flatten inventory into the close."
}
],
"dry_run": true
}Response JSON (AMD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"gap_up": {
"yes_no": 0.363
},
"gap_dn": {
"yes_no": 0.252
},
"atr3": {
"yes_no": 0.9441,
"rule": "atr_pct(14) > 3",
"basis": "rule"
},
"gap_atr": {
"yes_no": 0.9463,
"rule": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)",
"basis": "rule"
}
},
"context": {
"symbol": "AMD",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "flatten",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "quote-desk",
"preview": {
"text": "AMD (2026-10-30): ATR over 3% with gap odds up 36% / down 25%. Flatten inventory into the close."
}
}
]
}Market maker · example 5
QQQ and TQQQ: are both legs in the same regime?
Before quoting the leveraged ETF against its underlying index fund, check that trend and volatility agree.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"QQQ"} then TQQQ, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 50-day moving average? |
hv | English → rule | Is 20-day historical volatility above 40%? |
bb_dn | English → rule | Did the stock close below the lower Bollinger Band? |
zs | rule | zscore(C, 20) < -1Close more than one standard deviation under its 20-day mean |
big5 | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
Answers
| Symbol | trendrule | hvrule | bb_dnrule | zsrule | big5forecast |
|---|---|---|---|---|---|
QQQ | 0.0653 | 0.0537 | 0.4523 | 0.8008 | 0.355 |
TQQQ | 0.0621 | 0.9424 | 0.4043 | 0.7866 | 0.32 |
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 50-day moving average: true for none of 2. Is 20-day historical volatility above 40%: true for TQQQ of 2. Did the stock close below the lower Bollinger Band: true for none of 2. Close more than one standard deviation under its 20-day mean: true for QQQ, TQQQ of 2. Highest odds for “A big move either way in 5 days”: QQQ at 36%.
Diverging answers between the pair point to a stretched leveraged leg and wider hedge ratios.
Request JSON (QQQ; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "QQQ"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 50-day moving average?"
},
"hv": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility above 40%?"
},
"bb_dn": {
"type": "yes_no",
"instructions": "Did the stock close below the lower Bollinger Band?"
},
"zs": {
"type": "yes_no",
"ask": "zscore(C, 20) < -1"
},
"big5": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
}
}Response JSON (QQQ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.0653,
"rule": "C > sma(C, 50)",
"basis": "comparison"
},
"hv": {
"yes_no": 0.0537,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4",
"basis": "pattern"
},
"bb_dn": {
"yes_no": 0.4523,
"rule": "C < bblower(C, 20)",
"basis": "comparison"
},
"zs": {
"yes_no": 0.8008,
"rule": "zscore(C, 20) < -1",
"basis": "rule"
},
"big5": {
"yes_no": 0.355
}
},
"context": {
"symbol": "QQQ",
"as_of": "2026-10-30"
}
}Market maker · example 6
AAPL volume surge: raise quote size?
When volume ranks high and the day is directional, increase displayed size to capture flow.
- StateAAPL
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} The server fills in the latest completed session.
Questions
rank | rule | percentrank(V, 50) > 90Volume in the top tenth of 50 sessions |
spike | rule | V > 2 * ref(avg(V, 20), -1)Volume more than twice the previous 20-day average |
up_vol | rule | C > C[-1] and V > 1.5 * ref(avg(V, 20), -1)Up on heavy volume |
down_vol | rule | C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)Down on heavy volume |
spike_tom | forecast | Will volume spike tomorrow? A volume spike tomorrow |
Answers
| Question | Answer | Reading |
|---|---|---|
rankVolume in the top tenth of 50 sessions | 0.6232 | true |
spikeVolume more than twice the previous 20-day average | 0.2473 | false |
up_volUp on heavy volume | 0.127 | false |
down_volDown on heavy volume | 0.7841 | true |
spike_tomA volume spike tomorrow | 0.044 | 4% · unlikely |
Actions
Rules on the answers decide what to send.
rank >= 0.6 or spike >= 0.6→Webhookquoting-engine{
"symbol": "AAPL",
"action": "display_size",
"multiplier": 1.5,
"p_volume_rank_90": 0.6232,
"p_volume_spike": 0.2473,
"as_of": "2026-10-30"
}What it means
For AAPL on the session of 2026-10-30: True now: Volume in the top tenth of 50 sessions; Down on heavy volume. Not true: Volume more than twice the previous 20-day average; Up on heavy volume. Forecasts: A volume spike tomorrow 4%. Fired: size_up (Webhook → quoting-engine).
High participation supports larger quotes; the direction rules say which side flow is likely on.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"rank": {
"type": "yes_no",
"ask": "percentrank(V, 50) > 90"
},
"spike": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"up_vol": {
"type": "yes_no",
"ask": "C > C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
},
"down_vol": {
"type": "yes_no",
"ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
},
"spike_tom": {
"type": "yes_no",
"instructions": "Will volume spike tomorrow?"
}
},
"actions": [
{
"id": "size_up",
"when": "rank >= 0.6 or spike >= 0.6",
"do": "webhook",
"connection": "quoting-engine",
"body": {
"symbol": "{{symbol}}",
"action": "display_size",
"multiplier": 1.5,
"p_volume_rank_90": "{{rank}}",
"p_volume_spike": "{{spike}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"rank": {
"yes_no": 0.6232,
"rule": "percentrank(V, 50) > 90",
"basis": "rule"
},
"spike": {
"yes_no": 0.2473,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"up_vol": {
"yes_no": 0.127,
"rule": "C > C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"down_vol": {
"yes_no": 0.7841,
"rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"spike_tom": {
"yes_no": 0.044
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "size_up",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "quoting-engine",
"preview": {
"body": {
"symbol": "AAPL",
"action": "display_size",
"multiplier": 1.5,
"p_volume_rank_90": 0.6232,
"p_volume_spike": 0.2473,
"as_of": "2026-10-30"
}
}
}
]
}Market maker · example 7
KO: tight range, tighter quotes
In a compressed, low-volatility tape, tighten spreads to win more flow.
- StateKO
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"KO"} The server fills in the latest completed session.
Questions
tight | rule | (max(H, 10) - min(L, 10)) / C < 0.05A tight 10-day base (under 5% of price) |
squeeze | rule | (bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06Bollinger bands narrower than 6% of price |
atr_lo | English → rule | Is the 14-day ATR less than 2% of the price? |
spin | rule | spinning_top()spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides. |
big5 | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
tightA tight 10-day base (under 5% of price) | 0.4656 | on the line (false) |
squeezeBollinger bands narrower than 6% of price | 0.0762 | false |
atr_loIs the 14-day ATR less than 2% of the price compiled to atr(14) / C < 0.02 | 0.9202 | true |
spinspinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides. | 0.2308 | false |
big5A big move either way in 5 days | 0.311 | 31% · unlikely |
Actions
Rules on the answers decide what to send.
tight >= 0.6 and atr_lo >= 0.6 and big5 < 0.45→Webhookquoting-engineWhat it means
For KO on the session of 2026-10-30: True now: Is the 14-day ATR less than 2% of the price. Not true: Bollinger bands narrower than 6% of price; spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides.. On the line: A tight 10-day base (under 5% of price). Forecasts: A big move either way in 5 days 31%. No action fired: every rule was false.
Tightening needs both a calm tape and modest big-move odds; compression alone can precede a breakout.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "KO"
},
"questions": {
"tight": {
"type": "yes_no",
"ask": "(max(H, 10) - min(L, 10)) / C < 0.05"
},
"squeeze": {
"type": "yes_no",
"ask": "(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06"
},
"atr_lo": {
"type": "yes_no",
"instructions": "Is the 14-day ATR less than 2% of the price?"
},
"spin": {
"type": "yes_no",
"ask": "spinning_top()"
},
"big5": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
},
"actions": [
{
"id": "tighten",
"when": "tight >= 0.6 and atr_lo >= 0.6 and big5 < 0.45",
"do": "webhook",
"connection": "quoting-engine",
"body": {
"symbol": "{{symbol}}",
"action": "tighten_spread",
"spread_multiplier": 0.8,
"p_big_move5": "{{big5}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (KO, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"tight": {
"yes_no": 0.4656,
"rule": "(max(H, 10) - min(L, 10)) / C < 0.05",
"basis": "rule"
},
"squeeze": {
"yes_no": 0.0762,
"rule": "(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06",
"basis": "rule"
},
"atr_lo": {
"yes_no": 0.9202,
"rule": "atr(14) / C < 0.02",
"basis": "pattern"
},
"spin": {
"yes_no": 0.2308,
"rule": "spinning_top()",
"basis": "rule"
},
"big5": {
"yes_no": 0.311
}
},
"context": {
"symbol": "KO",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "tighten",
"fired": false,
"status": "skipped"
}
]
}Market maker · example 8
XOM: return shock check after a commodity move
Detect a return shock in a single name so quotes pull back until the tape settles.
- StateXOM
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"XOM"} The server fills in the latest completed session.
Questions
shock | rule | zscore(C / C[-1] - 1, 20) < -2A two-sigma down day |
big_atr | rule | abs(C - C[-1]) > 1.5 * atr(14)Today's move was bigger than 1.5 ATR |
down3 | English → rule | Did the stock fall more than 3% today? |
outside | English → rule | Is today an outside day? |
vol_up | forecast | Will volatility rise over the next 5 days? Volatility rising over 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
shockA two-sigma down day | 0.0537 | false |
big_atrToday's move was bigger than 1.5 ATR | 0.1131 | false |
down3Did the stock fall more than 3% today compiled to C / C[-1] - 1 < -0.03 | 0.0537 | false |
outsideIs today an outside day compiled to outside_bar() | 0.0756 | false |
vol_upVolatility rising over 5 days | 0.482 | 48% · close to even |
Actions
Rules on the answers decide what to send.
shock >= 0.6 or big_atr >= 0.6→Slackquote-deskWhat it means
For XOM on the session of 2026-10-30: Not true: A two-sigma down day; Today's move was bigger than 1.5 ATR; Did the stock fall more than 3% today; Is today an outside day. Forecasts: Volatility rising over 5 days 48%. No action fired: every rule was false.
A shock day changes the next open; the desk reduces exposure until the market finds its level.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XOM"
},
"questions": {
"shock": {
"type": "yes_no",
"ask": "zscore(C / C[-1] - 1, 20) < -2"
},
"big_atr": {
"type": "yes_no",
"ask": "abs(C - C[-1]) > 1.5 * atr(14)"
},
"down3": {
"type": "yes_no",
"instructions": "Did the stock fall more than 3% today?"
},
"outside": {
"type": "yes_no",
"instructions": "Is today an outside day?"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility rise over the next 5 days?"
}
},
"actions": [
{
"id": "pull",
"when": "shock >= 0.6 or big_atr >= 0.6",
"do": "slack",
"connection": "quote-desk",
"message": "{{symbol}} ({{as_of}}): shock day (z-score {{shock|pct}}, 1.5 ATR move {{big_atr|pct}}). Pull quotes for the first 15 minutes tomorrow."
}
],
"dry_run": true
}Response JSON (XOM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"shock": {
"yes_no": 0.0537,
"rule": "zscore(C / C[-1] - 1, 20) < -2",
"basis": "rule"
},
"big_atr": {
"yes_no": 0.1131,
"rule": "abs(C - C[-1]) > 1.5 * atr(14)",
"basis": "rule"
},
"down3": {
"yes_no": 0.0537,
"rule": "C / C[-1] - 1 < -0.03",
"basis": "pattern"
},
"outside": {
"yes_no": 0.0756,
"rule": "outside_bar()",
"basis": "pattern"
},
"vol_up": {
"yes_no": 0.482
}
},
"context": {
"symbol": "XOM",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "pull",
"fired": false,
"status": "skipped"
}
]
}Market maker · example 9
Sector ETF spreads by volatility tier: XLK, XLE, XLF, XLU
A daily workflow assigning each sector ETF a spread tier from ATR and historical volatility.
- ScheduleMon–Fri at 09:00 ET
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"XLK"} then XLE, XLF, XLU, 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_lo | English → rule | Is 20-day historical volatility below 20%? |
hv40 | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
vol_up | forecast | Will volatility be higher over the next month? Higher volatility next month |
Answers
| Symbol | atr3rule | hv_lorule | hv40rule | vol_upforecast | Fired |
|---|---|---|---|---|---|
XLK | 0.0784 | 0.078 | 0.071 | 0.407 | tier |
XLE | 0.0537 | 0.2403 | 0.0537 | 0.617 | tier |
XLF | 0.0537 | 0.9463 | 0.0537 | 0.577 | tier |
XLU | 0.0537 | 0.9117 | 0.0537 | 0.456 | tier |
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.
atr3 >= 0→Webhookquoting-engine{
"symbol": "XLK",
"action": "set_tier",
"p_atr_over_3pct": 0.0784,
"p_hv_below_20": 0.078,
"p_hv_above_40": 0.071,
"p_vol_higher_month": 0.407,
"as_of": "2026-10-30"
}{
"symbol": "XLE",
"action": "set_tier",
"p_atr_over_3pct": 0.0537,
"p_hv_below_20": 0.2403,
"p_hv_above_40": 0.0537,
"p_vol_higher_month": 0.617,
"as_of": "2026-10-30"
}{
"symbol": "XLF",
"action": "set_tier",
"p_atr_over_3pct": 0.0537,
"p_hv_below_20": 0.9463,
"p_hv_above_40": 0.0537,
"p_vol_higher_month": 0.577,
"as_of": "2026-10-30"
}{
"symbol": "XLU",
"action": "set_tier",
"p_atr_over_3pct": 0.0537,
"p_hv_below_20": 0.9117,
"p_hv_above_40": 0.0537,
"p_vol_higher_month": 0.456,
"as_of": "2026-10-30"
}What it means
Session of 2026-10-30, 4 symbols: A typical day moves more than 3%: true for none of 4. Is 20-day historical volatility below 20%: true for XLF, XLU of 4. Annualized 20-day volatility above 40%: true for none of 4. Highest odds for “Higher volatility next month”: XLE at 62%. tier fired for XLK, XLE, XLF, XLU.
The engine maps the probabilities to tiers; the workflow keeps the tiers current every morning.
As a scheduled workflow (Mon–Fri at 09:00 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": "Sector ETF spreads by volatility tier: XLK, XLE, XLF, XLU",
"symbols": "XLK XLE XLF XLU",
"days": [
1,
2,
3,
4,
5
],
"at_time": "09:00",
"model": "ora-fin-0.1.1",
"questions": {
"atr3": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"hv_lo": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility below 20%?"
},
"hv40": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
}
},
"actions": [
{
"id": "tier",
"when": "atr3 >= 0",
"do": "webhook",
"connection": "quoting-engine",
"body": {
"symbol": "{{symbol}}",
"action": "set_tier",
"p_atr_over_3pct": "{{atr3}}",
"p_hv_below_20": "{{hv_lo}}",
"p_hv_above_40": "{{hv40}}",
"p_vol_higher_month": "{{vol_up}}",
"as_of": "{{as_of}}"
}
}
]
}Request JSON (XLK; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLK"
},
"questions": {
"atr3": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"hv_lo": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility below 20%?"
},
"hv40": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
}
},
"actions": [
{
"id": "tier",
"when": "atr3 >= 0",
"do": "webhook",
"connection": "quoting-engine",
"body": {
"symbol": "{{symbol}}",
"action": "set_tier",
"p_atr_over_3pct": "{{atr3}}",
"p_hv_below_20": "{{hv_lo}}",
"p_hv_above_40": "{{hv40}}",
"p_vol_higher_month": "{{vol_up}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (XLK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"atr3": {
"yes_no": 0.0784,
"rule": "atr_pct(14) > 3",
"basis": "rule"
},
"hv_lo": {
"yes_no": 0.078,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2",
"basis": "pattern"
},
"hv40": {
"yes_no": 0.071,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
"basis": "rule"
},
"vol_up": {
"yes_no": 0.407
}
},
"context": {
"symbol": "XLK",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "tier",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "quoting-engine",
"preview": {
"body": {
"symbol": "XLK",
"action": "set_tier",
"p_atr_over_3pct": 0.0784,
"p_hv_below_20": 0.078,
"p_hv_above_40": 0.071,
"p_vol_higher_month": 0.407,
"as_of": "2026-10-30"
}
}
}
]
}Market maker · example 10
NFLX: bearish reversal at highs, lean offers
When a bearish pattern prints at a new high, lean quotes to the offer side.
- StateNFLX
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NFLX"} The server fills in the latest completed session.
Questions
star | rule | shooting_star() and H > highest(H, 20)Shooting star at a 20-day high |
evening | rule | evening_star()evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first. |
tweezer | rule | tweezer_top()tweezer top candle: Green then red, with highs within 0.1%. |
harami_bear | rule | harami_bear()harami bear candle: A small red body inside yesterday's green body. |
down_tom | forecast | Will the stock be lower in a week? Lower in a week |
star_bar | rule | shooting_star()shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise. |
Answers
| Question | Answer | Reading |
|---|---|---|
starShooting star at a 20-day high | 0.0689 | false |
eveningevening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first. | 0.2749 | false |
tweezertweezer top candle: Green then red, with highs within 0.1%. | 0.3007 | false |
harami_bearharami bear candle: A small red body inside yesterday's green body. | 0.2285 | false |
down_tomLower in a week | 0.492 | 49% · close to even |
star_barshooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise. | 0.1284 | false |
What it means
For NFLX on the session of 2026-10-30: Not true: Shooting star at a 20-day high; evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.; tweezer top candle: Green then red, with highs within 0.1%.; harami bear candle: A small red body inside yesterday's green body.; shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.. Forecasts: Lower in a week 49%.
A pattern at the highs is a mild signal; the skew stays small and is lifted the next day.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NFLX"
},
"questions": {
"star": {
"type": "yes_no",
"ask": "shooting_star() and H > highest(H, 20)"
},
"evening": {
"type": "yes_no",
"ask": "evening_star()"
},
"tweezer": {
"type": "yes_no",
"ask": "tweezer_top()"
},
"harami_bear": {
"type": "yes_no",
"ask": "harami_bear()"
},
"down_tom": {
"type": "yes_no",
"instructions": "Will the stock be lower in a week?"
},
"star_bar": {
"type": "yes_no",
"ask": "shooting_star()"
}
}
}Response JSON (NFLX, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"star": {
"yes_no": 0.0689,
"rule": "shooting_star() and H > highest(H, 20)",
"basis": "rule"
},
"evening": {
"yes_no": 0.2749,
"rule": "evening_star()",
"basis": "rule"
},
"tweezer": {
"yes_no": 0.3007,
"rule": "tweezer_top()",
"basis": "rule"
},
"harami_bear": {
"yes_no": 0.2285,
"rule": "harami_bear()",
"basis": "rule"
},
"down_tom": {
"yes_no": 0.492
},
"star_bar": {
"yes_no": 0.1284,
"rule": "shooting_star()",
"basis": "rule"
}
},
"context": {
"symbol": "NFLX",
"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, Prop trading firm, Compliance officer.