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

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.

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

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

State

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

Questions

atr_expruleatr(14) > 1.2 * ref(atr(14), -10)
ATR up 20% in two weeks
vol5English → ruleIs 5-day volatility higher than 20-day volatility?
hv40rulestd(log(C / C[-1]), 20) * sqrt(252) > 0.4
Annualized 20-day volatility above 40%
vol_riseforecastWill volatility rise over the next 5 days?
Volatility rising over 5 days
calmforecastWill volatility calm down over the next 5 days?
Volatility calming over 5 days

Answers

QuestionAnswerReading
atr_exp
ATR up 20% in two weeks
0.3085false
vol5
Is 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.7322true
hv40
Annualized 20-day volatility above 40%
0.2867false
vol_rise
Volatility rising over 5 days
0.3838% · unlikely
calm
Volatility calming over 5 days
0.62462% · likely

Actions

Rules on the answers decide what to send.

atr_exp >= 0.6 or (vol5 >= 0.6 and vol_rise >= 0.55)→Webhookquoting-engine
else→Webhookquoting-engine
What each action would send 1 of 2 fired · dry run, nothing sent
widenrule false: skipped
normalwould send (dry run)Webhook → quoting-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"
        }
      }
    }
  ]
}

atr log offset ref sqrt std

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.

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
bigruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%
amcEnglish → ruleDoes the stock report after the close next time?
gap_lastrulelast_earnings_gap > 0
Gapped up after the last report
big5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

QuestionAnswerReading
earn
Reports earnings within 10 days
0.0563false
big
Last earnings move bigger than 5%
0.9463true
amc
Does the stock report after the close next time
compiled to next_report_amc > 0.5
0.8591true
gap_last
Gapped up after the last report
0.9463true
big5
A big move either way in 5 days
0.31832% · unlikely

Actions

Rules on the answers decide what to send.

earn >= 0.6 and big >= 0.6→Webhookquoting-engine
earn >= 0.6→Slackquote-desk
What each action would send 0 of 2 fired · dry run, nothing sent
event_moderule false: skipped
noterule false: skipped

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

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

State

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

Questions

above20ruleC > sma(C, 20)
Close above the 20-day average
macdrulemacd(C) > macdsignal(C)
MACD above its signal line
rsi50rulersi(C, 14) > 50
RSI above 50
down3English → ruleHas the stock closed lower 3 days in a row?
up_tomforecastWill the stock be up tomorrow?
Up tomorrow

Answers

QuestionAnswerReading
above20
Close above the 20-day average
0.0816false
macd
MACD above its signal line
0.1658false
rsi50
RSI above 50
0.0919false
down3
Has 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.2277false
up_tom
Up tomorrow
0.53253% · close to even

Actions

Rules on the answers decide what to send.

above20 < 0.4 and macd < 0.4→Webhookquoting-engine
What each action would send 1 of 1 fired · dry run, nothing sent
skewwould send (dry run)Webhook → quoting-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"
        }
      }
    }
  ]
}

macd macdsignal offset rsi sma

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.

ora-fin-0.1.15 symbols, one request each4 questions1 actionworkflow · Mon–Fri at 15:30 ET
  1. ScheduleMon–Fri at 15:30 ET
  2. State5 symbols
  3. Questions4 asked
  4. Answersreal, captured
  5. 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_upforecastWill it gap up tomorrow?
A gap up tomorrow
gap_dnforecastWill it gap down tomorrow?
A gap down tomorrow
atr3ruleatr_pct(14) > 3
A typical day moves more than 3%
gap_atrruleabs(O - C[-1]) > 0.5 * ref(atr(14), -1)
Gap bigger than half an ATR

Answers

Symbolgap_upforecastgap_dnforecastatr3rulegap_atrruleFired
AMD0.3630.2520.94410.9463flatten
MU0.3720.2460.93030.9214flatten
SMCI0.3220.2370.94630.8465flatten
MSTR0.3520.2490.94630.9349flatten
TQQQ0.3830.2680.94630.9463flatten

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
AMD 1 of 1 fired · dry run, nothing sent
flattenwould send (dry run)Slack → quote-desk
{
  "text": "AMD (2026-10-30): ATR over 3% with gap odds up 36% / down 25%. Flatten inventory into the close."
}
MU 1 of 1 fired · dry run, nothing sent
flattenwould send (dry run)Slack → quote-desk
{
  "text": "MU (2026-10-30): ATR over 3% with gap odds up 37% / down 25%. Flatten inventory into the close."
}
SMCI 1 of 1 fired · dry run, nothing sent
flattenwould send (dry run)Slack → quote-desk
{
  "text": "SMCI (2026-10-30): ATR over 3% with gap odds up 32% / down 24%. Flatten inventory into the close."
}
MSTR 1 of 1 fired · dry run, nothing sent
flattenwould send (dry run)Slack → quote-desk
{
  "text": "MSTR (2026-10-30): ATR over 3% with gap odds up 35% / down 25%. Flatten inventory into the close."
}
TQQQ 1 of 1 fired · dry run, nothing sent
flattenwould send (dry run)Slack → quote-desk
{
  "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."
      }
    }
  ]
}

abs atr atr_pct offset ref

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.

ora-fin-0.1.12 symbols, one request each5 questions
  1. State2 symbols
  2. Questions5 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"QQQ"} then TQQQ, one request each. The server fills in the latest completed session.

Questions

trendEnglish → ruleIs the stock above its 50-day moving average?
hvEnglish → ruleIs 20-day historical volatility above 40%?
bb_dnEnglish → ruleDid the stock close below the lower Bollinger Band?
zsrulezscore(C, 20) < -1
Close more than one standard deviation under its 20-day mean
big5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

Symboltrendrulehvrulebb_dnrulezsrulebig5forecast
QQQ0.06530.05370.45230.80080.355
TQQQ0.06210.94240.40430.78660.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"
  }
}

bblower log offset sma sqrt std zscore

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.

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

State

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

Questions

rankrulepercentrank(V, 50) > 90
Volume in the top tenth of 50 sessions
spikeruleV > 2 * ref(avg(V, 20), -1)
Volume more than twice the previous 20-day average
up_volruleC > C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Up on heavy volume
down_volruleC < C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Down on heavy volume
spike_tomforecastWill volume spike tomorrow?
A volume spike tomorrow

Answers

QuestionAnswerReading
rank
Volume in the top tenth of 50 sessions
0.6232true
spike
Volume more than twice the previous 20-day average
0.2473false
up_vol
Up on heavy volume
0.127false
down_vol
Down on heavy volume
0.7841true
spike_tom
A volume spike tomorrow
0.0444% · unlikely

Actions

Rules on the answers decide what to send.

rank >= 0.6 or spike >= 0.6→Webhookquoting-engine
What each action would send 1 of 1 fired · dry run, nothing sent
size_upwould send (dry run)Webhook → quoting-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"
        }
      }
    }
  ]
}

avg offset percentrank ref

Market maker · example 7

KO: tight range, tighter quotes

In a compressed, low-volatility tape, tighten spreads to win more flow.

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

State

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

Questions

tightrule(max(H, 10) - min(L, 10)) / C < 0.05
A tight 10-day base (under 5% of price)
squeezerule(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06
Bollinger bands narrower than 6% of price
atr_loEnglish → ruleIs the 14-day ATR less than 2% of the price?
spinrulespinning_top()
spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides.
big5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

QuestionAnswerReading
tight
A tight 10-day base (under 5% of price)
0.4656on the line (false)
squeeze
Bollinger bands narrower than 6% of price
0.0762false
atr_lo
Is the 14-day ATR less than 2% of the price
compiled to atr(14) / C < 0.02
0.9202true
spin
spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides.
0.2308false
big5
A big move either way in 5 days
0.31131% · unlikely

Actions

Rules on the answers decide what to send.

tight >= 0.6 and atr_lo >= 0.6 and big5 < 0.45→Webhookquoting-engine
What each action would send 0 of 1 fired · dry run, nothing sent
tightenrule false: skipped

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

atr bblower bbmid bbupper max min spinning_top

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.

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

State

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

Questions

shockrulezscore(C / C[-1] - 1, 20) < -2
A two-sigma down day
big_atrruleabs(C - C[-1]) > 1.5 * atr(14)
Today's move was bigger than 1.5 ATR
down3English → ruleDid the stock fall more than 3% today?
outsideEnglish → ruleIs today an outside day?
vol_upforecastWill volatility rise over the next 5 days?
Volatility rising over 5 days

Answers

QuestionAnswerReading
shock
A two-sigma down day
0.0537false
big_atr
Today's move was bigger than 1.5 ATR
0.1131false
down3
Did the stock fall more than 3% today
compiled to C / C[-1] - 1 < -0.03
0.0537false
outside
Is today an outside day
compiled to outside_bar()
0.0756false
vol_up
Volatility rising over 5 days
0.48248% · close to even

Actions

Rules on the answers decide what to send.

shock >= 0.6 or big_atr >= 0.6→Slackquote-desk
What each action would send 0 of 1 fired · dry run, nothing sent
pullrule false: skipped

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

abs atr offset outside_bar zscore

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.

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

State

{"symbol":"XLK"} then XLE, XLF, XLU, one request each. The server fills in the latest completed session.

Questions

atr3ruleatr_pct(14) > 3
A typical day moves more than 3%
hv_loEnglish → ruleIs 20-day historical volatility below 20%?
hv40rulestd(log(C / C[-1]), 20) * sqrt(252) > 0.4
Annualized 20-day volatility above 40%
vol_upforecastWill volatility be higher over the next month?
Higher volatility next month

Answers

Symbolatr3rulehv_lorulehv40rulevol_upforecastFired
XLK0.07840.0780.0710.407tier
XLE0.05370.24030.05370.617tier
XLF0.05370.94630.05370.577tier
XLU0.05370.91170.05370.456tier

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
XLK 1 of 1 fired · dry run, nothing sent
tierwould send (dry run)Webhook → quoting-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"
}
XLE 1 of 1 fired · dry run, nothing sent
tierwould send (dry run)Webhook → quoting-engine
{
  "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"
}
XLF 1 of 1 fired · dry run, nothing sent
tierwould send (dry run)Webhook → quoting-engine
{
  "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"
}
XLU 1 of 1 fired · dry run, nothing sent
tierwould send (dry run)Webhook → quoting-engine
{
  "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"
        }
      }
    }
  ]
}

atr_pct log offset sqrt std

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.

ora-fin-0.1.1NFLX6 questions
  1. StateNFLX
  2. Questions6 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

starruleshooting_star() and H > highest(H, 20)
Shooting star at a 20-day high
eveningruleevening_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.
tweezerruletweezer_top()
tweezer top candle: Green then red, with highs within 0.1%.
harami_bearruleharami_bear()
harami bear candle: A small red body inside yesterday's green body.
down_tomforecastWill the stock be lower in a week?
Lower in a week
star_barruleshooting_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

QuestionAnswerReading
star
Shooting star at a 20-day high
0.0689false
evening
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.
0.2749false
tweezer
tweezer top candle: Green then red, with highs within 0.1%.
0.3007false
harami_bear
harami bear candle: A small red body inside yesterday's green body.
0.2285false
down_tom
Lower in a week
0.49249% · close to even
star_bar
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
0.1284false

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

evening_star harami_bear highest shooting_star tweezer_top

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.

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