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 · Buy side

Risk manager: 20 ways to use Ora

Limits, drawdowns, volatility regimes and pre-trade checks, with escalations that write themselves. Each example is a complete, runnable request with the real answers it returned (52 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 (38)

offset 10sma 8atr 8log 5std 5max 5ref 5sqrt 4abs 3atr_pct 2avg 2percentrank 2swinglow 2crossdown 2rsi 2swinghigh 2min 1tr 1zscore 1days_to_earnings 1last_earnings_gap 1last_earnings_move 1highest 1lowest 1adx 1between 1gap_down 1gap_up 1gravestone_doji 1hanging_man 1harami_bear 1shooting_star 1iif 1willr 1marubozu 1outside_bar 1cut_last 1div_yield_ttm 1

Examples 11–20 of 20 · page 2 of 2

Risk manager · example 11

Crowded momentum: are the mega caps extended together?

When the biggest names are all stretched at once, the book's factor risk is concentrated; check each for extension.

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

State

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

Questions

extEnglish → ruleIs price extended more than 2 ATR above its 20-day average?
pct_rankrulepercentrank(C, 252) > 95
Close in the top 5% of its 1-year range of closes
rsirulersi(C, 14) > 70
RSI above 70

Answers

Symbolextrulepct_rankrulersirule
AAPL0.1140.81190.0657
MSFT0.06960.3810.0537
NVDA0.05370.05370.0537
AMZN0.05370.05370.0537

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: Is price extended more than 2 ATR above its 20-day average: true for none of 4. Close in the top 5% of its 1-year range of closes: true for AAPL of 4. RSI above 70: true for none of 4.

Several extended names at once mean a single factor reversal could hit the whole book; the risk team may ask for a hedge.

Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "ext": {
      "type": "yes_no",
      "instructions": "Is price extended more than 2 ATR above its 20-day average?"
    },
    "pct_rank": {
      "type": "yes_no",
      "ask": "percentrank(C, 252) > 95"
    },
    "rsi": {
      "type": "yes_no",
      "ask": "rsi(C, 14) > 70"
    }
  }
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "ext": {
      "yes_no": 0.114,
      "rule": "C - sma(C, 20) > 2 * atr(14)",
      "basis": "pattern"
    },
    "pct_rank": {
      "yes_no": 0.8119,
      "rule": "percentrank(C, 252) > 95",
      "basis": "rule"
    },
    "rsi": {
      "yes_no": 0.0657,
      "rule": "rsi(C, 14) > 70",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  }
}

atr percentrank rsi sma

Risk manager · example 12

Overnight gap risk on NVDA

Before holding size overnight, check recent gap behavior and the odds of a gap tomorrow.

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

State

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

Questions

gap_vs_atrruleabs(O - C[-1]) > 0.5 * ref(atr(14), -1)
Gap bigger than half an ATR
unfilled_dnrulegap_down()
gap down candle: Today's whole range is below yesterday's low.
unfilled_uprulegap_up()
gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.
gap_upforecastWill it gap up tomorrow?
A gap up tomorrow
gap_dnforecastWill it gap down tomorrow?
A gap down tomorrow

Answers

QuestionAnswerReading
gap_vs_atr
Gap bigger than half an ATR
0.8363true
unfilled_dn
gap down candle: Today's whole range is below yesterday's low.
0.8033true
unfilled_up
gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.
0.0537false
gap_up
A gap up tomorrow
0.19119% · unlikely
gap_dn
A gap down tomorrow
0.11612% · unlikely

What it means

For NVDA on the session of 2026-10-30: True now: Gap bigger than half an ATR; gap down candle: Today's whole range is below yesterday's low.. Not true: gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.. Forecasts: A gap up tomorrow 19%; A gap down tomorrow 12%.

Recent large gaps and higher gap odds argue for a smaller overnight position or an options hedge.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "gap_vs_atr": {
      "type": "yes_no",
      "ask": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)"
    },
    "unfilled_dn": {
      "type": "yes_no",
      "ask": "gap_down()"
    },
    "unfilled_up": {
      "type": "yes_no",
      "ask": "gap_up()"
    },
    "gap_up": {
      "type": "yes_no",
      "instructions": "Will it gap up tomorrow?"
    },
    "gap_dn": {
      "type": "yes_no",
      "instructions": "Will it gap down tomorrow?"
    }
  }
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "gap_vs_atr": {
      "yes_no": 0.8363,
      "rule": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)",
      "basis": "rule"
    },
    "unfilled_dn": {
      "yes_no": 0.8033,
      "rule": "gap_down()",
      "basis": "rule"
    },
    "unfilled_up": {
      "yes_no": 0.0537,
      "rule": "gap_up()",
      "basis": "rule"
    },
    "gap_up": {
      "yes_no": 0.191
    },
    "gap_dn": {
      "yes_no": 0.116
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  }
}

abs atr gap_down gap_up offset ref

Risk manager · example 13

Bank book trend break: JPM, BAC, WFC, C

A sector concentration limit applies to banks; flag the sector when most names lose their 50-day together.

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

State

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

Questions

below_50ruleC < sma(C, 50)
Below the 50-day average
lhruleswinghigh(3, 1) < swinghigh(3, 2)
Lower swing high (strength 3)
crossrulecrossdown(C, sma(C, 50))
Lost the 50-day today

Answers

Symbolbelow_50rulelhrulecrossrule
JPM0.69660.13390.95
BAC0.90490.3920.05
WFC0.67040.50230.95
C0.92350.18360.05

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: Below the 50-day average: true for JPM, BAC, WFC, C of 4. Lower swing high (strength 3): true for none of 4. Lost the 50-day today: true for JPM, WFC of 4.

If most of the bank names are below their 50-day, the sector limit is reviewed as a group rather than name by name.

Request JSON (JPM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JPM"
  },
  "questions": {
    "below_50": {
      "type": "yes_no",
      "ask": "C < sma(C, 50)"
    },
    "lh": {
      "type": "yes_no",
      "ask": "swinghigh(3, 1) < swinghigh(3, 2)"
    },
    "cross": {
      "type": "yes_no",
      "ask": "crossdown(C, sma(C, 50))"
    }
  }
}
Response JSON (JPM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "below_50": {
      "yes_no": 0.6966,
      "rule": "C < sma(C, 50)",
      "basis": "rule"
    },
    "lh": {
      "yes_no": 0.1339,
      "rule": "swinghigh(3, 1) < swinghigh(3, 2)",
      "basis": "rule"
    },
    "cross": {
      "yes_no": 0.95,
      "rule": "crossdown(C, sma(C, 50))",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "JPM",
    "as_of": "2026-10-30"
  }
}

crossdown sma swinghigh

Risk manager · example 14

Reversal candles on QQQ after a run

Shooting stars, gravestone dojis and bearish haramis at a high are early warnings for net exposure.

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

State

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

Questions

starruleshooting_star()
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
graverulegravestone_doji()
gravestone doji candle: Doji with a long upper wick and almost no lower wick.
haramiruleharami_bear()
harami bear candle: A small red body inside yesterday's green body.
hangrulehanging_man()
hanging man candle: Hammer shape, closing above the close five bars back.
near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
down_weekforecastWill the stock be lower in a week?
Lower in a week

Answers

QuestionAnswerReading
star
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
0.0537false
grave
gravestone doji candle: Doji with a long upper wick and almost no lower wick.
0.0537false
harami
harami bear candle: A small red body inside yesterday's green body.
0.0543false
hang
hanging man candle: Hammer shape, closing above the close five bars back.
0.1466false
near_high
Within 2% of the 52-week high
0.0537false
down_week
Lower in a week
0.53453% · close to even

What it means

For QQQ on the session of 2026-10-30: Not true: shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.; gravestone doji candle: Doji with a long upper wick and almost no lower wick.; harami bear candle: A small red body inside yesterday's green body.; hanging man candle: Hammer shape, closing above the close five bars back.; Within 2% of the 52-week high. Forecasts: Lower in a week 53%.

A topping candle near the high is a reason to check net exposure, not a short signal.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "QQQ"
  },
  "questions": {
    "star": {
      "type": "yes_no",
      "ask": "shooting_star()"
    },
    "grave": {
      "type": "yes_no",
      "ask": "gravestone_doji()"
    },
    "harami": {
      "type": "yes_no",
      "ask": "harami_bear()"
    },
    "hang": {
      "type": "yes_no",
      "ask": "hanging_man()"
    },
    "near_high": {
      "type": "yes_no",
      "ask": "C >= 0.98 * max(H, 252)"
    },
    "down_week": {
      "type": "yes_no",
      "instructions": "Will the stock be lower in a week?"
    }
  }
}
Response JSON (QQQ, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "star": {
      "yes_no": 0.0537,
      "rule": "shooting_star()",
      "basis": "rule"
    },
    "grave": {
      "yes_no": 0.0537,
      "rule": "gravestone_doji()",
      "basis": "rule"
    },
    "harami": {
      "yes_no": 0.0543,
      "rule": "harami_bear()",
      "basis": "rule"
    },
    "hang": {
      "yes_no": 0.1466,
      "rule": "hanging_man()",
      "basis": "rule"
    },
    "near_high": {
      "yes_no": 0.0537,
      "rule": "C >= 0.98 * max(H, 252)",
      "basis": "rule"
    },
    "down_week": {
      "yes_no": 0.534
    }
  },
  "context": {
    "symbol": "QQQ",
    "as_of": "2026-10-30"
  }
}

gravestone_doji hanging_man harami_bear max shooting_star

Risk manager · example 15

Realized volatility inputs for the VaR model

Check whether short-term realized volatility has jumped above long-term, which signals that a VaR model with a long lookback underestimates risk.

ora-fin-0.1.13 symbols, one request each3 questions
  1. State3 symbols
  2. Questions3 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"SPY"} then TLT, GLD, one request each. The server fills in the latest completed session.

Questions

vol_jumprulestd(log(C / C[-1]), 10) > 1.5 * std(log(C / C[-1]), 120)
10-day realized vol over 1.5x the 120-day
atr_expruleatr(14) > 1.2 * ref(atr(14), -10)
ATR up 20% in two weeks
hv30forecastWill annualized volatility over the next 21 sessions exceed 30%?
Next-month volatility above 30%

Answers

Symbolvol_jumpruleatr_exprulehv30forecast
SPY0.06550.21170.564
TLT0.0950.05370.497
GLD0.05370.07330.567

true false not known for rules; forecasts are odds. Hover a column for its question.

What it means

Session of 2026-10-30, 3 symbols: 10-day realized vol over 1.5x the 120-day: true for none of 3. ATR up 20% in two weeks: true for none of 3. Highest odds for “Next-month volatility above 30%”: GLD at 57%.

When short-term volatility runs well above long-term, the risk team adds a stressed-VaR overlay for that asset.

Request JSON (SPY; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "vol_jump": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 10) > 1.5 * std(log(C / C[-1]), 120)"
    },
    "atr_exp": {
      "type": "yes_no",
      "ask": "atr(14) > 1.2 * ref(atr(14), -10)"
    },
    "hv30": {
      "type": "yes_no",
      "instructions": "Will annualized volatility over the next 21 sessions exceed 30%?"
    }
  }
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "vol_jump": {
      "yes_no": 0.0655,
      "rule": "std(log(C / C[-1]), 10) > 1.5 * std(log(C / C[-1]), 120)",
      "basis": "rule"
    },
    "atr_exp": {
      "yes_no": 0.2117,
      "rule": "atr(14) > 1.2 * ref(atr(14), -10)",
      "basis": "rule"
    },
    "hv30": {
      "yes_no": 0.564
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  }
}

atr log offset ref std

Risk manager · example 16

Counterparty watch: broker and bank equities

Equity weakness at a counterparty can lead credit events; monitor drawdowns and down-on-volume days at the firm's brokers.

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":"GS"} then SCHW, C, one request each. The server fills in the latest completed session.

Questions

ddruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
down_volruleC < C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Down on heavy volume
llEnglish → ruleIs the stock making lower swing highs and lower swing lows?
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

Symbolddruledown_volrulellruledrop10forecastFired
GS0.7060.07510.9440.515watch
SCHW0.72310.30050.7930.511watch
C0.15730.50620.86170.461none

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.

dd >= 0.6 or (down_vol >= 0.6 and ll >= 0.6)→Webhookteams-risk
GS 1 of 1 fired · dry run, nothing sent
watchwould send (dry run)Webhook → teams-risk
{
  "text": "Counterparty watch: GS (2026-10-30) drawdown over 20% 71%, heavy-volume selling 8%, 10% drop odds 52%."
}
SCHW 1 of 1 fired · dry run, nothing sent
watchwould send (dry run)Webhook → teams-risk
{
  "text": "Counterparty watch: SCHW (2026-10-30) drawdown over 20% 72%, heavy-volume selling 30%, 10% drop odds 51%."
}
C 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 3 symbols: More than 20% off the 52-week high: true for GS, SCHW of 3. Down on heavy volume: true for none of 3. Is the stock making lower swing highs and lower swing lows: true for GS, SCHW, C of 3. Highest odds for “A 10% drawdown within a month”: GS at 52%. watch fired for GS, SCHW.

A Teams post goes to the counterparty group only on a real drawdown or heavy-volume selling into lower lows.

Request JSON (GS; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "GS"
  },
  "questions": {
    "dd": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "down_vol": {
      "type": "yes_no",
      "ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "ll": {
      "type": "yes_no",
      "instructions": "Is the stock making lower swing highs and lower swing lows?"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "watch",
      "when": "dd >= 0.6 or (down_vol >= 0.6 and ll >= 0.6)",
      "do": "webhook",
      "connection": "teams-risk",
      "body": {
        "text": "Counterparty watch: {{symbol}} ({{as_of}}) drawdown over 20% {{dd|pct}}, heavy-volume selling {{down_vol|pct}}, 10% drop odds {{drop10|pct}}."
      }
    }
  ],
  "dry_run": true
}
Response JSON (GS, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "dd": {
      "yes_no": 0.706,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "down_vol": {
      "yes_no": 0.0751,
      "rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "ll": {
      "yes_no": 0.944,
      "rule": "(swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))",
      "basis": "pattern"
    },
    "drop10": {
      "yes_no": 0.515
    }
  },
  "context": {
    "symbol": "GS",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "watch",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "teams-risk",
      "preview": {
        "body": {
          "text": "Counterparty watch: GS (2026-10-30) drawdown over 20% 71%, heavy-volume selling 8%, 10% drop odds 52%."
        }
      }
    }
  ]
}

avg max offset ref swinghigh swinglow

Risk manager · example 17

Regime-aware oversold threshold for risk add-backs

Allow re-risking on oversold names only with a threshold that tightens in a downtrend.

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

State

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

Questions

oversoldrulersi(C, 14) < iif(C > sma(C, 200), 40, 25)
RSI under 40 in an uptrend, under 25 in a downtrend
regimerule(C > sma(C, 200) and rsi(C, 14) < 40) or (C < sma(C, 200) and rsi(C, 14) < 25)
Oversold, with the line set by the trend
willrrulewillr(14) < -80
Williams %R below -80
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
oversold
RSI under 40 in an uptrend, under 25 in a downtrend
0.0626false
regime
Oversold, with the line set by the trend
0.0679false
willr
Williams %R below -80
0.0769false
rally5
A 5% rally within a month
0.25225% · unlikely

What it means

For XLY on the session of 2026-10-30: Not true: RSI under 40 in an uptrend, under 25 in a downtrend; Oversold, with the line set by the trend; Williams %R below -80. Forecasts: A 5% rally within a month 25%.

The threshold changes with the regime, so the add-back rule asks for more pain before re-risking in a downtrend.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLY"
  },
  "questions": {
    "oversold": {
      "type": "yes_no",
      "ask": "rsi(C, 14) < iif(C > sma(C, 200), 40, 25)"
    },
    "regime": {
      "type": "yes_no",
      "ask": "(C > sma(C, 200) and rsi(C, 14) < 40) or (C < sma(C, 200) and rsi(C, 14) < 25)"
    },
    "willr": {
      "type": "yes_no",
      "ask": "willr(14) < -80"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  }
}
Response JSON (XLY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "oversold": {
      "yes_no": 0.0626,
      "rule": "rsi(C, 14) < iif(C > sma(C, 200), 40, 25)",
      "basis": "rule"
    },
    "regime": {
      "yes_no": 0.0679,
      "rule": "(C > sma(C, 200) and rsi(C, 14) < 40) or (C < sma(C, 200) and rsi(C, 14) < 25)",
      "basis": "rule"
    },
    "willr": {
      "yes_no": 0.0769,
      "rule": "willr(14) < -80",
      "basis": "rule"
    },
    "rally5": {
      "yes_no": 0.252
    }
  },
  "context": {
    "symbol": "XLY",
    "as_of": "2026-10-30"
  }
}

iif rsi sma willr

Risk manager · example 18

Energy shock monitor: USO and XLE

Oil shocks spill into inflation-sensitive books; flag large moves and wide ranges in crude and energy equities.

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

State

{"symbol":"USO"} then XLE, 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
wideEnglish → ruleWas today's range more than 1.5 ATR?
outsideruleoutside_bar()
outside bar candle: Today's high above yesterday's and low below it.
marubozurulemarubozu()
marubozu candle: Body at least 90% of the range: almost no wicks.
big5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

Symbolbigrulewideruleoutsiderulemarubozurulebig5forecast
USO0.05370.05370.07720.07170.403
XLE0.09750.05370.08140.14490.398

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: Today's move was bigger than 1.5 ATR: true for none of 2. Was today's range more than 1.5 ATR: true for none of 2. outside bar candle: Today's high above yesterday's and low below it.: true for none of 2. marubozu candle: Body at least 90% of the range: almost no wicks.: true for none of 2. Highest odds for “A big move either way in 5 days”: USO at 40%.

A full-bodied outside bar on an ATR-sized move is a shock day; the risk team checks inflation-sensitive positions next.

Request JSON (USO; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "USO"
  },
  "questions": {
    "big": {
      "type": "yes_no",
      "ask": "abs(C - C[-1]) > 1.5 * atr(14)"
    },
    "wide": {
      "type": "yes_no",
      "instructions": "Was today's range more than 1.5 ATR?"
    },
    "outside": {
      "type": "yes_no",
      "ask": "outside_bar()"
    },
    "marubozu": {
      "type": "yes_no",
      "ask": "marubozu()"
    },
    "big5": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  }
}
Response JSON (USO, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "big": {
      "yes_no": 0.0537,
      "rule": "abs(C - C[-1]) > 1.5 * atr(14)",
      "basis": "rule"
    },
    "wide": {
      "yes_no": 0.0537,
      "rule": "(H - L) > 1.5 * atr(14)",
      "basis": "pattern"
    },
    "outside": {
      "yes_no": 0.0772,
      "rule": "outside_bar()",
      "basis": "rule"
    },
    "marubozu": {
      "yes_no": 0.0717,
      "rule": "marubozu()",
      "basis": "rule"
    },
    "big5": {
      "yes_no": 0.403
    }
  },
  "context": {
    "symbol": "USO",
    "as_of": "2026-10-30"
  }
}

abs atr marubozu offset outside_bar

Risk manager · example 19

Friday limit review: sector ETF stretch

Each Friday, check which sector exposures are stretched beyond two ATR from their 20-day, for next week's limit review.

ora-fin-0.1.14 symbols, one request each3 questions1 actionworkflow · Fri at 16:45 ET
  1. ScheduleFri at 16:45 ET
  2. State4 symbols
  3. Questions3 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

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

Questions

up_stretchEnglish → ruleIs price extended more than 2 ATR above its 20-day average?
down_stretchrulesma(C, 20) - C > 2 * atr(14)
More than 2 ATR below the 20-day
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symbolup_stretchruledown_stretchruledrop5forecastFired
XLK0.05370.72710.474review
XLF0.37480.06410.199none
XLE0.54640.05370.491none
XLV0.82570.05370.371review

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.

up_stretch >= 0.6 or down_stretch >= 0.6→Emailrisk-committee
XLK 1 of 1 fired · dry run, nothing sent
reviewwould send (dry run)Email → risk-committee
{
  "subject": "Limit review: XLK stretched (2026-10-30)",
  "text": "XLK: up-stretch 5%, down-stretch 73%, 5% drawdown odds 47%."
}
XLF 0 of 1 fired · dry run, nothing sent
XLE 0 of 1 fired · dry run, nothing sent
XLV 1 of 1 fired · dry run, nothing sent
reviewwould send (dry run)Email → risk-committee
{
  "subject": "Limit review: XLV stretched (2026-10-30)",
  "text": "XLV: up-stretch 83%, down-stretch 5%, 5% drawdown odds 37%."
}

What it means

Session of 2026-10-30, 4 symbols: Is price extended more than 2 ATR above its 20-day average: true for XLV of 4. More than 2 ATR below the 20-day: true for XLK of 4. Highest odds for “A 5% drawdown within a month”: XLE at 49%. review fired for XLK, XLV.

Stretched sleeves are put on the Monday committee agenda; others carry their limits forward.

As a scheduled workflow (Fri at 16:45 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": "Friday limit review: sector ETF stretch",
  "symbols": "XLK XLF XLE XLV",
  "days": [
    5
  ],
  "at_time": "16:45",
  "model": "ora-fin-0.1.1",
  "questions": {
    "up_stretch": {
      "type": "yes_no",
      "instructions": "Is price extended more than 2 ATR above its 20-day average?"
    },
    "down_stretch": {
      "type": "yes_no",
      "ask": "sma(C, 20) - C > 2 * atr(14)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "review",
      "when": "up_stretch >= 0.6 or down_stretch >= 0.6",
      "do": "email",
      "connection": "risk-committee",
      "subject": "Limit review: {{symbol}} stretched ({{as_of}})",
      "message": "{{symbol}}: up-stretch {{up_stretch|pct}}, down-stretch {{down_stretch|pct}}, 5% drawdown odds {{drop5|pct}}."
    }
  ]
}
Request JSON (XLK; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLK"
  },
  "questions": {
    "up_stretch": {
      "type": "yes_no",
      "instructions": "Is price extended more than 2 ATR above its 20-day average?"
    },
    "down_stretch": {
      "type": "yes_no",
      "ask": "sma(C, 20) - C > 2 * atr(14)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "review",
      "when": "up_stretch >= 0.6 or down_stretch >= 0.6",
      "do": "email",
      "connection": "risk-committee",
      "subject": "Limit review: {{symbol}} stretched ({{as_of}})",
      "message": "{{symbol}}: up-stretch {{up_stretch|pct}}, down-stretch {{down_stretch|pct}}, 5% drawdown odds {{drop5|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (XLK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "up_stretch": {
      "yes_no": 0.0537,
      "rule": "C - sma(C, 20) > 2 * atr(14)",
      "basis": "pattern"
    },
    "down_stretch": {
      "yes_no": 0.7271,
      "rule": "sma(C, 20) - C > 2 * atr(14)",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.474
    }
  },
  "context": {
    "symbol": "XLK",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "review",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "risk-committee",
      "preview": {
        "subject": "Limit review: XLK stretched (2026-10-30)",
        "text": "XLK: up-stretch 5%, down-stretch 73%, 5% drawdown odds 47%."
      }
    }
  ]
}

atr sma

Risk manager · example 20

Dividend cut early warning in the income book

A dividend cut often follows a deep drawdown; check payers for cuts, drawdowns and broken trends.

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

State

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

Questions

cutEnglish → ruleDid the stock cut its dividend last time?
ddruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
belowEnglish → ruleIs the stock below its 200-day moving average?
yield_highEnglish → ruleIs the dividend yield above 6%?
raiseforecastWill the company raise its dividend next year?
Raising the dividend next year

Answers

Symbolcutruleddrulebelowruleyield_highruleraiseforecast
T0.14090.8450.93260.05370.423
VZ0.14090.08790.65520.77080.442
MO0.14090.05370.05370.05370.551

true false not known for rules; forecasts are odds. Hover a column for its question.

What it means

Session of 2026-10-30, 3 symbols: Did the stock cut its dividend last time: true for none of 3. More than 20% off the 52-week high: true for T of 3. Is the stock below its 200-day moving average: true for T, VZ of 3. Is the dividend yield above 6%: true for VZ of 3. Highest odds for “Raising the dividend next year”: MO at 55%.

A high yield on a stock in a deep drawdown is a risk flag; the cut fact says whether the payout already broke.

Request JSON (T; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "T"
  },
  "questions": {
    "cut": {
      "type": "yes_no",
      "instructions": "Did the stock cut its dividend last time?"
    },
    "dd": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "below": {
      "type": "yes_no",
      "instructions": "Is the stock below its 200-day moving average?"
    },
    "yield_high": {
      "type": "yes_no",
      "instructions": "Is the dividend yield above 6%?"
    },
    "raise": {
      "type": "yes_no",
      "instructions": "Will the company raise its dividend next year?"
    }
  }
}
Response JSON (T, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "cut": {
      "yes_no": 0.1409,
      "rule": "cut_last > 0.5",
      "basis": "pattern"
    },
    "dd": {
      "yes_no": 0.845,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "below": {
      "yes_no": 0.9326,
      "rule": "C < sma(C, 200)",
      "basis": "comparison"
    },
    "yield_high": {
      "yes_no": 0.0537,
      "rule": "div_yield_ttm > 6",
      "basis": "pattern"
    },
    "raise": {
      "yes_no": 0.423
    }
  },
  "context": {
    "symbol": "T",
    "as_of": "2026-10-30"
  }
}

cut_last div_yield_ttm max sma

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 Buy side: Financial advisor / RIA, Wealth manager, Family office, Hedge fund PM, Quant researcher, Portfolio manager (long-only), Private equity, VC / growth investor, Fund-of-funds allocator.

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