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

Wealth manager: 20 ways to use Ora

Model portfolios across many households: drift, concentration, income and risk alerts. Each example is a complete, runnable request with the real answers it returned (46 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 (53)

sma 16offset 9max 5atr 4log 4sqrt 4std 4pays_dividend 3rsi 2ref 2cut_last 2div_count_ttm 2div_yield_ttm 2ema 2roc 2abs 2lowest 2avg 1lowestbars 1sum 1beat_eps_last 1beat_revenue_last 1eps_growth_yoy 1raised_last 1years_of_growth 1cum 1adx 1diminus 1diplus 1beat_streak 1days_to_earnings 1last_earnings_move 1next_report_bmo 1macd 1macdsignal 1dark_cloud 1engulfing_bear 1evening_star 1hanging_man 1tweezer_top 1zscore 1highest 1rma 1bbupper 1dragonfly_doji 1inverted_hammer 1stochd 1stochk 1beats_last4 1revenue_growth_yoy 1willr 1atr_pct 1three_white_soldiers 1

Examples 1–10 of 20 · page 1 of 2

Wealth manager · example 1

Model portfolio drift: is the US equity sleeve (VTI) running hot?

Across hundreds of households on one model, flag when the core equity sleeve has rallied enough that accounts likely drifted above target.

ora-fin-0.1.1VTI4 questions1 action
  1. StateVTI
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

up_10_3mEnglish → ruleIs the stock up more than 10% over the last three months?
ext_200druleC > sma(C, 200) * 1.10
More than 10% above the 200-day
rsi70rulersi(C, 14) > 70
RSI above 70
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
up_10_3m
Is the stock up more than 10% over the last three months
compiled to C / C[-63] - 1 > 0.1
0.0537false
ext_200d
More than 10% above the 200-day
0.0537false
rsi70
RSI above 70
0.0537false
drop5
A 5% drawdown within a month
0.18719% · unlikely

Actions

Rules on the answers decide what to send.

up_10_3m >= 0.6 and ext_200d >= 0.6→Webhookrebalance-engine
What each action would send 0 of 1 fired · dry run, nothing sent
drift_reviewrule false: skipped

What it means

For VTI on the session of 2026-10-30: Not true: Is the stock up more than 10% over the last three months; More than 10% above the 200-day; RSI above 70. Forecasts: A 5% drawdown within a month 19%. No action fired: every rule was false.

The rebalancing engine runs a drift report only when the sleeve is both up strongly and extended; most weeks nothing is queued.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "VTI"
  },
  "questions": {
    "up_10_3m": {
      "type": "yes_no",
      "instructions": "Is the stock up more than 10% over the last three months?"
    },
    "ext_200d": {
      "type": "yes_no",
      "ask": "C > sma(C, 200) * 1.10"
    },
    "rsi70": {
      "type": "yes_no",
      "ask": "rsi(C, 14) > 70"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "drift_review",
      "when": "up_10_3m >= 0.6 and ext_200d >= 0.6",
      "do": "webhook",
      "connection": "rebalance-engine",
      "body": {
        "model": "growth_70_30",
        "sleeve": "us_equity",
        "symbol": "{{symbol}}",
        "action": "run_drift_report",
        "p_up_3m": "{{up_10_3m}}",
        "p_extended": "{{ext_200d}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (VTI, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "up_10_3m": {
      "yes_no": 0.0537,
      "rule": "C / C[-63] - 1 > 0.1",
      "basis": "pattern"
    },
    "ext_200d": {
      "yes_no": 0.0537,
      "rule": "C > sma(C, 200) * 1.10",
      "basis": "rule"
    },
    "rsi70": {
      "yes_no": 0.0537,
      "rule": "rsi(C, 14) > 70",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.187
    }
  },
  "context": {
    "symbol": "VTI",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "drift_review",
      "fired": false,
      "status": "skipped"
    }
  ]
}

offset rsi sma

Wealth manager · example 2

Concentration alert for executives holding MSFT

Many client households hold employer stock; warn the relationship team when the name turns volatile or breaks trend.

ora-fin-0.1.1MSFT4 questions2 actions
  1. StateMSFT
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

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

Questions

below_50dEnglish → ruleIs the stock more than 5% below its 50-day moving average?
atr_expruleatr(14) > 1.2 * ref(atr(14), -10)
ATR up 20% in two weeks
down_volruleC < C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Down on heavy volume
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

QuestionAnswerReading
below_50d
Is the stock more than 5% below its 50-day moving average
compiled to C < sma(C, 50) * 0.95
0.084false
atr_exp
ATR up 20% in two weeks
0.1113false
down_vol
Down on heavy volume
0.6662true
drop10
A 10% drawdown within a month
0.42242% · close to even

Actions

Rules on the answers decide what to send.

below_50d >= 0.6 or (atr_exp >= 0.6 and down_vol >= 0.6)→Slackrelationship-managers
else→Slackrelationship-managers
What each action would send 1 of 2 fired · dry run, nothing sent
rm_alertrule false: skipped
calmwould send (dry run)Slack → relationship-managers
{
  "text": "MSFT (2026-10-30): no concentration alert today."
}

What it means

For MSFT on the session of 2026-10-30: True now: Down on heavy volume. Not true: Is the stock more than 5% below its 50-day moving average; ATR up 20% in two weeks. Forecasts: A 10% drawdown within a month 42%. Fired: calm (Slack → relationship-managers).

Relationship managers hear about a breakdown in a concentrated name the same evening; the else branch confirms the check ran.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MSFT"
  },
  "questions": {
    "below_50d": {
      "type": "yes_no",
      "instructions": "Is the stock more than 5% below its 50-day moving average?"
    },
    "atr_exp": {
      "type": "yes_no",
      "ask": "atr(14) > 1.2 * ref(atr(14), -10)"
    },
    "down_vol": {
      "type": "yes_no",
      "ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "rm_alert",
      "when": "below_50d >= 0.6 or (atr_exp >= 0.6 and down_vol >= 0.6)",
      "do": "slack",
      "connection": "relationship-managers",
      "message": "{{symbol}} ({{as_of}}): more than 5% under its 50-day ({{below_50d|pct}}), selling on volume {{down_vol|pct}}. 10% drawdown odds {{drop10|pct}}. Call concentrated households."
    },
    {
      "id": "calm",
      "when": "else",
      "do": "slack",
      "connection": "relationship-managers",
      "message": "{{symbol}} ({{as_of}}): no concentration alert today."
    }
  ],
  "dry_run": true
}
Response JSON (MSFT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "below_50d": {
      "yes_no": 0.084,
      "rule": "C < sma(C, 50) * 0.95",
      "basis": "comparison"
    },
    "atr_exp": {
      "yes_no": 0.1113,
      "rule": "atr(14) > 1.2 * ref(atr(14), -10)",
      "basis": "rule"
    },
    "down_vol": {
      "yes_no": 0.6662,
      "rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "drop10": {
      "yes_no": 0.422
    }
  },
  "context": {
    "symbol": "MSFT",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "rm_alert",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "calm",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "relationship-managers",
      "preview": {
        "text": "MSFT (2026-10-30): no concentration alert today."
      }
    }
  ]
}

atr avg offset ref sma

Wealth manager · example 3

Income sleeve health: SCHD, VYM and JEPI

Check each income fund's payout record and trend before the quarterly income review.

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

State

{"symbol":"SCHD"} then VYM, JEPI, one request each. The server fills in the latest completed session.

Questions

paysrulepays_dividend > 0.5
Pays a dividend
yield3English → ruleIs the dividend yield above 3%?
cutEnglish → ruleDid the stock cut its dividend last time?
trendEnglish → ruleIs the stock above its 200-day moving average?
monthlyEnglish → ruleDoes the stock pay a monthly dividend?

Answers

Symbolpaysruleyield3rulecutruletrendrulemonthlyrule
SCHD0.85910.42870.14090.94630.0537
VYM0.85910.09010.85910.92740.0537
JEPI0.85910.94630.85910.94630.8591

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

What it means

Session of 2026-10-30, 3 symbols: Pays a dividend: true for SCHD, VYM, JEPI of 3. Is the dividend yield above 3%: true for JEPI of 3. Did the stock cut its dividend last time: true for VYM, JEPI of 3. Is the stock above its 200-day moving average: true for SCHD, VYM, JEPI of 3.

Payout facts per fund show which sleeve carries the income; a cut or a broken trend is the item to raise in the review.

Request JSON (SCHD; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SCHD"
  },
  "questions": {
    "pays": {
      "type": "yes_no",
      "ask": "pays_dividend > 0.5"
    },
    "yield3": {
      "type": "yes_no",
      "instructions": "Is the dividend yield above 3%?"
    },
    "cut": {
      "type": "yes_no",
      "instructions": "Did the stock cut its dividend last time?"
    },
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "monthly": {
      "type": "yes_no",
      "instructions": "Does the stock pay a monthly dividend?"
    }
  }
}
Response JSON (SCHD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "pays": {
      "yes_no": 0.8591,
      "rule": "pays_dividend > 0.5",
      "basis": "rule"
    },
    "yield3": {
      "yes_no": 0.4287,
      "rule": "div_yield_ttm > 3",
      "basis": "pattern"
    },
    "cut": {
      "yes_no": 0.1409,
      "rule": "cut_last > 0.5",
      "basis": "pattern"
    },
    "trend": {
      "yes_no": 0.9463,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "monthly": {
      "yes_no": 0.0537,
      "rule": "div_count_ttm >= 11",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "SCHD",
    "as_of": "2026-10-30"
  }
}

cut_last div_count_ttm div_yield_ttm pays_dividend sma

Wealth manager · example 4

Developed vs emerging: VEA and VWO trend check

Decide whether to keep the international overweight by comparing trend and momentum in developed and emerging markets.

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

State

{"symbol":"VEA"} then VWO, EFA, EEM, one request each. The server fills in the latest completed session.

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
goldenrulesma(C, 50) > sma(C, 200)
50-day above the 200-day
rocruleroc(C, 20) > 5
Up more than 5% in 20 sessions
emaruleC > ema(C, 50)
Above the 50-day exponential average
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulegoldenrulerocruleemarulebeat_spyforecast
VEA0.58770.94630.06020.16530.472
VWO0.08870.94630.05370.0570.478
EFA0.67090.94630.07170.25460.447
EEM0.14490.94260.05370.06360.501

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 the stock above its 200-day moving average: true for EFA of 4. 50-day above the 200-day: true for VEA, VWO, EFA, EEM of 4. Up more than 5% in 20 sessions: true for none of 4. Above the 50-day exponential average: true for none of 4. Highest odds for “Beating SPY over a month”: EEM at 50%.

Funds with trend, alignment and momentum all true support the overweight; the beat-SPY forecast says how likely each is to lead the US over a month.

Request JSON (VEA; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "VEA"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "golden": {
      "type": "yes_no",
      "ask": "sma(C, 50) > sma(C, 200)"
    },
    "roc": {
      "type": "yes_no",
      "ask": "roc(C, 20) > 5"
    },
    "ema": {
      "type": "yes_no",
      "ask": "C > ema(C, 50)"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  }
}
Response JSON (VEA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.5877,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "golden": {
      "yes_no": 0.9463,
      "rule": "sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "roc": {
      "yes_no": 0.0602,
      "rule": "roc(C, 20) > 5",
      "basis": "rule"
    },
    "ema": {
      "yes_no": 0.1653,
      "rule": "C > ema(C, 50)",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.472
    }
  },
  "context": {
    "symbol": "VEA",
    "as_of": "2026-10-30"
  }
}

ema roc sma

Wealth manager · example 5

Year-end tax-loss sweep across model holdings

Find the model holdings in a meaningful drawdown so the tax team can harvest losses and swap into a similar fund.

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

State

{"symbol":"ARKK"} then XBI, KWEB, ICLN, TAN, one request each. The server fills in the latest completed session.

Questions

drawdownruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
below_200dEnglish → ruleIs the stock below its 200-day moving average?
lowestbarsrulelowestbars(L, 20) <= 3
The 20-day low was set in the last 3 sessions
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

Symboldrawdownrulebelow_200drulelowestbarsrulerally5forecastFired
ARKK0.09880.18680.73120.681none
XBI0.05370.07960.12570.579none
KWEB0.94630.94630.6850.518harvest
ICLN0.94630.94630.7570.622harvest
TAN0.94630.94630.76530.704harvest

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.

drawdown >= 0.6→Webhooktax-desk
ARKK 0 of 1 fired · dry run, nothing sent
XBI 0 of 1 fired · dry run, nothing sent
KWEB 1 of 1 fired · dry run, nothing sent
harvestwould send (dry run)Webhook → tax-desk
{
  "task": "harvest_candidate",
  "symbol": "KWEB",
  "p_drawdown20": 0.9463,
  "p_downtrend": 0.9463,
  "p_fresh_low": 0.685,
  "as_of": "2026-10-30"
}
ICLN 1 of 1 fired · dry run, nothing sent
harvestwould send (dry run)Webhook → tax-desk
{
  "task": "harvest_candidate",
  "symbol": "ICLN",
  "p_drawdown20": 0.9463,
  "p_downtrend": 0.9463,
  "p_fresh_low": 0.757,
  "as_of": "2026-10-30"
}
TAN 1 of 1 fired · dry run, nothing sent
harvestwould send (dry run)Webhook → tax-desk
{
  "task": "harvest_candidate",
  "symbol": "TAN",
  "p_drawdown20": 0.9463,
  "p_downtrend": 0.9463,
  "p_fresh_low": 0.7653,
  "as_of": "2026-10-30"
}

What it means

Session of 2026-10-30, 5 symbols: More than 20% off the 52-week high: true for KWEB, ICLN, TAN of 5. Is the stock below its 200-day moving average: true for KWEB, ICLN, TAN of 5. The 20-day low was set in the last 3 sessions: true for ARKK, KWEB, ICLN, TAN of 5. Highest odds for “A 5% rally within a month”: TAN at 70%. harvest fired for KWEB, ICLN, TAN.

Funds 20% off their high go to the tax desk as candidates; a fresh low suggests the loss is still deepening, which matters for timing the swap.

Request JSON (ARKK; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "ARKK"
  },
  "questions": {
    "drawdown": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "below_200d": {
      "type": "yes_no",
      "instructions": "Is the stock below its 200-day moving average?"
    },
    "lowestbars": {
      "type": "yes_no",
      "ask": "lowestbars(L, 20) <= 3"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "harvest",
      "when": "drawdown >= 0.6",
      "do": "webhook",
      "connection": "tax-desk",
      "body": {
        "task": "harvest_candidate",
        "symbol": "{{symbol}}",
        "p_drawdown20": "{{drawdown}}",
        "p_downtrend": "{{below_200d}}",
        "p_fresh_low": "{{lowestbars}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (ARKK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "drawdown": {
      "yes_no": 0.0988,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "below_200d": {
      "yes_no": 0.1868,
      "rule": "C < sma(C, 200)",
      "basis": "comparison"
    },
    "lowestbars": {
      "yes_no": 0.7312,
      "rule": "lowestbars(L, 20) <= 3",
      "basis": "rule"
    },
    "rally5": {
      "yes_no": 0.681
    }
  },
  "context": {
    "symbol": "ARKK",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "harvest",
      "fired": false,
      "status": "skipped"
    }
  ]
}

lowestbars max sma

Wealth manager · example 6

Weekly risk dial: should models lean defensive?

Every Monday before the open, read the market regime from SPY and QQQ and post the result to the investment committee channel.

ora-fin-0.1.12 symbols, one request each6 questions2 actionsworkflow · Mon at 08:30 ET
  1. ScheduleMon at 08:30 ET
  2. State2 symbols
  3. Questions6 asked
  4. Answersreal, captured
  5. Actions2 rules · dry run

State

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

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
goldenEnglish → ruleIs the 50-day moving average above the 200-day?
hvrulestd(log(C / C[-1]), 20) * sqrt(252) > 0.4
Annualized 20-day volatility above 40%
breadth_proxyrulesum(C > C[-1], 20) >= 11
Up on at least 11 of the last 20 sessions
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month
vol_upforecastWill volatility be higher over the next month?
Higher volatility next month

Answers

Symboltrendrulegoldenrulehvrulebreadth_proxyruledrop5forecastvol_upforecastFired
SPY0.94510.94630.05370.21540.2030.69neutral
QQQ0.79870.94630.05370.07920.4430.523neutral

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.

trend < 0.4 or drop5 >= 0.5→Slackinvestment-committee
else→Slackinvestment-committee
SPY 1 of 2 fired · dry run, nothing sent
defensiverule false: skipped
neutralwould send (dry run)Slack → investment-committee
{
  "text": "SPY (2026-10-30): regime normal. Above the 200-day 95%; higher volatility next month 69%."
}
QQQ 1 of 2 fired · dry run, nothing sent
defensiverule false: skipped
neutralwould send (dry run)Slack → investment-committee
{
  "text": "QQQ (2026-10-30): regime normal. Above the 200-day 80%; higher volatility next month 52%."
}

What it means

Session of 2026-10-30, 2 symbols: Is the stock above its 200-day moving average: true for SPY, QQQ of 2. Is the 50-day moving average above the 200-day: true for SPY, QQQ of 2. Annualized 20-day volatility above 40%: true for none of 2. Up on at least 11 of the last 20 sessions: true for none of 2. Highest odds for “A 5% drawdown within a month”: QQQ at 44%. defensive fired for none. neutral fired for SPY, QQQ.

The committee gets the same two-line read every Monday; the dial moves only when the trend breaks or drawdown odds climb.

As a scheduled workflow (Mon at 08: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": "Weekly risk dial: should models lean defensive?",
  "symbols": "SPY QQQ",
  "days": [
    1
  ],
  "at_time": "08:30",
  "model": "ora-fin-0.1.1",
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "golden": {
      "type": "yes_no",
      "instructions": "Is the 50-day moving average above the 200-day?"
    },
    "hv": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
    },
    "breadth_proxy": {
      "type": "yes_no",
      "ask": "sum(C > C[-1], 20) >= 11"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    },
    "vol_up": {
      "type": "yes_no",
      "instructions": "Will volatility be higher over the next month?"
    }
  },
  "actions": [
    {
      "id": "defensive",
      "when": "trend < 0.4 or drop5 >= 0.5",
      "do": "slack",
      "connection": "investment-committee",
      "message": "{{symbol}} ({{as_of}}): regime is risk-off (above 200-day {{trend|pct}}, 5% drawdown odds {{drop5|pct}}). Consider the defensive dial."
    },
    {
      "id": "neutral",
      "when": "else",
      "do": "slack",
      "connection": "investment-committee",
      "message": "{{symbol}} ({{as_of}}): regime normal. Above the 200-day {{trend|pct}}; higher volatility next month {{vol_up|pct}}."
    }
  ]
}
Request JSON (SPY; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "golden": {
      "type": "yes_no",
      "instructions": "Is the 50-day moving average above the 200-day?"
    },
    "hv": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
    },
    "breadth_proxy": {
      "type": "yes_no",
      "ask": "sum(C > C[-1], 20) >= 11"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    },
    "vol_up": {
      "type": "yes_no",
      "instructions": "Will volatility be higher over the next month?"
    }
  },
  "actions": [
    {
      "id": "defensive",
      "when": "trend < 0.4 or drop5 >= 0.5",
      "do": "slack",
      "connection": "investment-committee",
      "message": "{{symbol}} ({{as_of}}): regime is risk-off (above 200-day {{trend|pct}}, 5% drawdown odds {{drop5|pct}}). Consider the defensive dial."
    },
    {
      "id": "neutral",
      "when": "else",
      "do": "slack",
      "connection": "investment-committee",
      "message": "{{symbol}} ({{as_of}}): regime normal. Above the 200-day {{trend|pct}}; higher volatility next month {{vol_up|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.9451,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "golden": {
      "yes_no": 0.9463,
      "rule": "sma(C, 50) > sma(C, 200)",
      "basis": "comparison"
    },
    "hv": {
      "yes_no": 0.0537,
      "rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
      "basis": "rule"
    },
    "breadth_proxy": {
      "yes_no": 0.2154,
      "rule": "sum(C > C[-1], 20) >= 11",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.203
    },
    "vol_up": {
      "yes_no": 0.69
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "defensive",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "neutral",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "investment-committee",
      "preview": {
        "text": "SPY (2026-10-30): regime normal. Above the 200-day 95%; higher volatility next month 69%."
      }
    }
  ]
}

log offset sma sqrt std sum

Wealth manager · example 7

Single-stock review for clients holding JPM

A bank stock widely held across households: check earnings quality, dividend growth and trend for the annual review.

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

State

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

Questions

beatrulebeat_eps_last > 0.5 and beat_revenue_last > 0.5
Beat on EPS and revenue last quarter
eps_gruleeps_growth_yoy > 10
EPS up more than 10% on the year
raisedruleraised_last > 0.5
Raised its last dividend
growerruleyears_of_growth >= 10
Ten years of dividend growth
trendEnglish → ruleIs the stock above its 200-day moving average?
beat_nextforecastWill the stock beat earnings next quarter?
Beating earnings next quarter

Answers

QuestionAnswerReading
beat
Beat on EPS and revenue last quarter
0.1409false
eps_g
EPS up more than 10% on the year
0.6893true
raised
Raised its last dividend
0.8591true
grower
Ten years of dividend growth
0.9463true
trend
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.8854true
beat_next
Beating earnings next quarter
0.50651% · close to even

What it means

For JPM on the session of 2026-10-30: True now: EPS up more than 10% on the year; Raised its last dividend; Ten years of dividend growth; Is the stock above its 200-day moving average. Not true: Beat on EPS and revenue last quarter. Forecasts: Beating earnings next quarter 51%.

Earnings and dividend facts make the annual review concrete; the beat-next-quarter forecast is shown as odds, not a recommendation.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JPM"
  },
  "questions": {
    "beat": {
      "type": "yes_no",
      "ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
    },
    "eps_g": {
      "type": "yes_no",
      "ask": "eps_growth_yoy > 10"
    },
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "grower": {
      "type": "yes_no",
      "ask": "years_of_growth >= 10"
    },
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "beat_next": {
      "type": "yes_no",
      "instructions": "Will the stock beat earnings next quarter?"
    }
  }
}
Response JSON (JPM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "beat": {
      "yes_no": 0.1409,
      "rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
      "basis": "rule"
    },
    "eps_g": {
      "yes_no": 0.6893,
      "rule": "eps_growth_yoy > 10",
      "basis": "rule"
    },
    "raised": {
      "yes_no": 0.8591,
      "rule": "raised_last > 0.5",
      "basis": "rule"
    },
    "grower": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 10",
      "basis": "rule"
    },
    "trend": {
      "yes_no": 0.8854,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "beat_next": {
      "yes_no": 0.506
    }
  },
  "context": {
    "symbol": "JPM",
    "as_of": "2026-10-30"
  }
}

beat_eps_last beat_revenue_last eps_growth_yoy raised_last sma years_of_growth

Wealth manager · example 8

Cash sleeve: are T-bill ETFs SGOV and BIL behaving like cash?

Confirm that the cash-equivalent funds used for client sweeps are calm, with tiny ranges and no drawdown.

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

State

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

Questions

atr_lowEnglish → ruleIs the 14-day ATR less than 2% of the price?
hv_lowEnglish → ruleIs 20-day historical volatility below 20%?
trendruleC > sma(C, 50)
Above the 50-day average
cum_uprulecum(C > C[-1]) > cum(C < C[-1])
More up days than down days over the full history

Answers

Symbolatr_lowrulehv_lowruletrendrulecum_uprule
SGOV0.94630.94630.94510.9463
BIL0.94630.94630.93070.9463

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 14-day ATR less than 2% of the price: true for SGOV, BIL of 2. Is 20-day historical volatility below 20%: true for SGOV, BIL of 2. Above the 50-day average: true for SGOV, BIL of 2. More up days than down days over the full history: true for SGOV, BIL of 2.

Cash-like funds should answer yes to the calm checks; a no would be worth a look before sweeping more client cash into them.

Request JSON (SGOV; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SGOV"
  },
  "questions": {
    "atr_low": {
      "type": "yes_no",
      "instructions": "Is the 14-day ATR less than 2% of the price?"
    },
    "hv_low": {
      "type": "yes_no",
      "instructions": "Is 20-day historical volatility below 20%?"
    },
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "cum_up": {
      "type": "yes_no",
      "ask": "cum(C > C[-1]) > cum(C < C[-1])"
    }
  }
}
Response JSON (SGOV, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "atr_low": {
      "yes_no": 0.9463,
      "rule": "atr(14) / C < 0.02",
      "basis": "pattern"
    },
    "hv_low": {
      "yes_no": 0.9463,
      "rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2",
      "basis": "pattern"
    },
    "trend": {
      "yes_no": 0.9451,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "cum_up": {
      "yes_no": 0.9463,
      "rule": "cum(C > C[-1]) > cum(C < C[-1])",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "SGOV",
    "as_of": "2026-10-30"
  }
}

atr cum log offset sma sqrt std

Wealth manager · example 9

Is the technology overweight (XLK) still earning its place?

Check trend strength and leadership for the tech sector ETF the models overweight.

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

State

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

Questions

adxruleadx(14) > 25
Trending (ADX above 25)
diplusrulediplus(14) > diminus(14)
+DI above -DI (buyers in control)
stackedruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
leaderruleroc(C, 63) > 10 and C >= 0.95 * max(H, 63)
Up more than 10% in a quarter, near the high
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

QuestionAnswerReading
adx
Trending (ADX above 25)
0.6205true
diplus
+DI above -DI (buyers in control)
0.0637false
stacked
Stacked averages: close > 20 EMA > 50 > 200
0.0701false
leader
Up more than 10% in a quarter, near the high
0.0624false
beat_spy
Beating SPY over a month
0.49850% · close to even

What it means

For XLK on the session of 2026-10-30: True now: Trending (ADX above 25). Not true: +DI above -DI (buyers in control); Stacked averages: close > 20 EMA > 50 > 200; Up more than 10% in a quarter, near the high. Forecasts: Beating SPY over a month 50%.

A strong, directional trend with leadership supports keeping the overweight; if the trend weakens the committee revisits it.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLK"
  },
  "questions": {
    "adx": {
      "type": "yes_no",
      "ask": "adx(14) > 25"
    },
    "diplus": {
      "type": "yes_no",
      "ask": "diplus(14) > diminus(14)"
    },
    "stacked": {
      "type": "yes_no",
      "ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
    },
    "leader": {
      "type": "yes_no",
      "ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  }
}
Response JSON (XLK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "adx": {
      "yes_no": 0.6205,
      "rule": "adx(14) > 25",
      "basis": "rule"
    },
    "diplus": {
      "yes_no": 0.0637,
      "rule": "diplus(14) > diminus(14)",
      "basis": "rule"
    },
    "stacked": {
      "yes_no": 0.0701,
      "rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "leader": {
      "yes_no": 0.0624,
      "rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.498
    }
  },
  "context": {
    "symbol": "XLK",
    "as_of": "2026-10-30"
  }
}

adx diminus diplus ema max roc sma

Wealth manager · example 10

Earnings week across top client holdings

Tell advisors which of the most widely held stocks report soon so they can prepare for client questions.

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

State

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

Questions

soonruledays_to_earnings <= 10
Reports earnings within 10 days
bmoEnglish → ruleDoes the stock report before the market opens next time?
big_moveruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%
streakrulebeat_streak >= 4
Beat four quarters in a row

Answers

Symbolsoonrulebmorulebig_moverulestreakruleFired
AAPL0.93920.14090.94630.9463prep
AMZN0.05370.14090.05370.0537none
NVDA0.05630.14090.94630.9463none
JNJ0.05370.85910.94630.1409none
PG0.05370.85910.94630.9463none

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

Actions

Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.

soon >= 0.6→Emailadvisor-desk
AAPL 1 of 1 fired · dry run, nothing sent
prepwould send (dry run)Email → advisor-desk
{
  "subject": "AAPL reports within 10 days",
  "text": "AAPL (2026-10-30): earnings within 10 days. Before the open: 14%. Last reaction over 5%: 95%. Beat streak of 4: 95%."
}
AMZN 0 of 1 fired · dry run, nothing sent
NVDA 0 of 1 fired · dry run, nothing sent
JNJ 0 of 1 fired · dry run, nothing sent
PG 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 5 symbols: Reports earnings within 10 days: true for AAPL of 5. Does the stock report before the market opens next time: true for JNJ, PG of 5. Last earnings move bigger than 5%: true for AAPL, NVDA, JNJ, PG of 5. Beat four quarters in a row: true for AAPL, NVDA, PG of 5. prep fired for AAPL.

Only names reporting soon produce an email; the reaction and streak facts help advisors set expectations with clients.

Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "soon": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10"
    },
    "bmo": {
      "type": "yes_no",
      "instructions": "Does the stock report before the market opens next time?"
    },
    "big_move": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    },
    "streak": {
      "type": "yes_no",
      "ask": "beat_streak >= 4"
    }
  },
  "actions": [
    {
      "id": "prep",
      "when": "soon >= 0.6",
      "do": "email",
      "connection": "advisor-desk",
      "subject": "{{symbol}} reports within 10 days",
      "message": "{{symbol}} ({{as_of}}): earnings within 10 days. Before the open: {{bmo|pct}}. Last reaction over 5%: {{big_move|pct}}. Beat streak of 4: {{streak|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "soon": {
      "yes_no": 0.9392,
      "rule": "days_to_earnings <= 10",
      "basis": "rule"
    },
    "bmo": {
      "yes_no": 0.1409,
      "rule": "next_report_bmo > 0.5",
      "basis": "pattern"
    },
    "big_move": {
      "yes_no": 0.9463,
      "rule": "abs(last_earnings_move) > 5",
      "basis": "rule"
    },
    "streak": {
      "yes_no": 0.9463,
      "rule": "beat_streak >= 4",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "prep",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "advisor-desk",
      "preview": {
        "subject": "AAPL reports within 10 days",
        "text": "AAPL (2026-10-30): earnings within 10 days. Before the open: 14%. Last reaction over 5%: 95%. Beat streak of 4: 95%."
      }
    }
  ]
}

abs beat_streak days_to_earnings last_earnings_move next_report_bmo

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, Family office, Hedge fund PM, Quant researcher, Portfolio manager (long-only), Risk manager, 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.