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 · Institutions

Index provider: 20 ways to use Ora

Rules-based selection screens, rebalance checks and corporate-action flags. Each example is a complete, runnable request with the real answers it returned (35 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 (62)

sma 6max 4offset 3roc 3avg 2cut_last 2pays_dividend 2reverse_split_last 2abs 2atr 2ref 2years_of_growth 1div_ttm 1div_yield_ttm 1days_since_split 1days_to_split 1splits_5y 1days_since_earnings 1days_to_earnings 1last_earnings_move 1next_report_bmo 1log 1sqrt 1std 1crossdown 1crossup 1mean 1rsi 1median 1beats_last4 1eps_growth_yoy 1last_eps 1misses_last4 1revenue_growth_yoy 1days_since_reverse_split 1highest 1inside_bar 1outside_bar 1tr 1lowestbars 1min 1dragonfly_doji 1gravestone_doji 1hammer 1inverted_hammer 1marubozu 1tweezer_top 1days_since_ex_div 1days_to_ex_div 1last_div_amount 1next_div_amount 1adx 1diminus 1diplus 1stochd 1stochk 1hlc3 1ohlc4 1rec 1rma 1swinghigh 1swinglow 1

Examples 1–10 of 20 · page 1 of 2

Index provider · example 1

Momentum index selection screen on AAPL, NVDA, LLY

A rules-based momentum index admits names with positive 3-month momentum near their highs. Run the screen on candidates exactly as the methodology states it.

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

State

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

Questions

leaderruleroc(C, 63) > 10 and C >= 0.95 * max(H, 63)
Up more than 10% in a quarter, near the high
three_monthruleC > C[-63]
Higher than three months ago
near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
liquidruleavg(C * V, 20) > 100000000
Trades more than $100 million a day

Answers

Symbolleaderrulethree_monthrulenear_highruleliquidrule
AAPL0.79960.94420.49620.9463
NVDA0.05370.41380.05370.9463
LLY0.82460.94630.45720.9463

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: Up more than 10% in a quarter, near the high: true for AAPL, LLY of 3. Higher than three months ago: true for AAPL, LLY of 3. Within 2% of the 52-week high: true for none of 3. Trades more than $100 million a day: true for AAPL, NVDA, LLY of 3.

Each rule is the methodology written down: a name qualifies only when the rules are true, and the forecast model is never part of selection.

Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "leader": {
      "type": "yes_no",
      "ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
    },
    "three_month": {
      "type": "yes_no",
      "ask": "C > C[-63]"
    },
    "near_high": {
      "type": "yes_no",
      "ask": "C >= 0.98 * max(H, 252)"
    },
    "liquid": {
      "type": "yes_no",
      "ask": "avg(C * V, 20) > 100000000"
    }
  }
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "leader": {
      "yes_no": 0.7996,
      "rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
      "basis": "rule"
    },
    "three_month": {
      "yes_no": 0.9442,
      "rule": "C > C[-63]",
      "basis": "rule"
    },
    "near_high": {
      "yes_no": 0.4962,
      "rule": "C >= 0.98 * max(H, 252)",
      "basis": "rule"
    },
    "liquid": {
      "yes_no": 0.9463,
      "rule": "avg(C * V, 20) > 100000000",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  }
}

avg max offset roc

Index provider · example 2

Dividend growth index eligibility: KO, PG, JNJ

Check consecutive years of dividend growth and the absence of a cut for each constituent before the annual reconstitution.

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

Questions

grow25English → ruleHas the stock grown its dividend for 25 years in a row?
grow10ruleyears_of_growth >= 10
Ten years of dividend growth
no_cutrulecut_last < 0.5
Did not cut its last dividend
paysrulepays_dividend > 0.5
Pays a dividend

Answers

Symbolgrow25rulegrow10ruleno_cutrulepaysruleFired
KO0.06830.94630.85910.8591review
PG0.94630.94630.85910.8591none
JNJ0.94630.94630.85910.8591none

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.

grow25 < 0.4→Webhookmethodology-queue
KO 1 of 1 fired · dry run, nothing sent
reviewwould send (dry run)Webhook → methodology-queue
{
  "constituent": "KO",
  "as_of": "2026-10-30",
  "check": "dividend_growth_25y",
  "p_pass": 0.0683,
  "p_no_cut": 0.8591,
  "action": "committee_review"
}
PG 0 of 1 fired · dry run, nothing sent
JNJ 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 3 symbols: Has the stock grown its dividend for 25 years in a row: true for PG, JNJ of 3. Ten years of dividend growth: true for KO, PG, JNJ of 3. Did not cut its last dividend: true for KO, PG, JNJ of 3. Pays a dividend: true for KO, PG, JNJ of 3. review fired for KO.

years_of_growth counts calendar-year totals, so an extra or missing payment can break a run; a failing name goes to the committee queue for a human decision, not straight out of the index.

Request JSON (KO; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "KO"
  },
  "questions": {
    "grow25": {
      "type": "yes_no",
      "instructions": "Has the stock grown its dividend for 25 years in a row?"
    },
    "grow10": {
      "type": "yes_no",
      "ask": "years_of_growth >= 10"
    },
    "no_cut": {
      "type": "yes_no",
      "ask": "cut_last < 0.5"
    },
    "pays": {
      "type": "yes_no",
      "ask": "pays_dividend > 0.5"
    }
  },
  "actions": [
    {
      "id": "review",
      "when": "grow25 < 0.4",
      "do": "webhook",
      "connection": "methodology-queue",
      "body": {
        "constituent": "{{symbol}}",
        "as_of": "{{as_of}}",
        "check": "dividend_growth_25y",
        "p_pass": "{{grow25}}",
        "p_no_cut": "{{no_cut}}",
        "action": "committee_review"
      }
    }
  ],
  "dry_run": true
}
Response JSON (KO, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "grow25": {
      "yes_no": 0.0683,
      "rule": "years_of_growth >= 25",
      "basis": "pattern"
    },
    "grow10": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 10",
      "basis": "rule"
    },
    "no_cut": {
      "yes_no": 0.8591,
      "rule": "cut_last < 0.5",
      "basis": "rule"
    },
    "pays": {
      "yes_no": 0.8591,
      "rule": "pays_dividend > 0.5",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "KO",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "review",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "methodology-queue",
      "preview": {
        "body": {
          "constituent": "KO",
          "as_of": "2026-10-30",
          "check": "dividend_growth_25y",
          "p_pass": 0.0683,
          "p_no_cut": 0.8591,
          "action": "committee_review"
        }
      }
    }
  ]
}

cut_last pays_dividend years_of_growth

Index provider · example 3

High-dividend index screen: XOM, VZ, MO, PM

Admit the highest trailing yields, but screen out names that just cut. Run the yield and cut rules on candidates.

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

State

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

Questions

yield3rulediv_yield_ttm > 3
Yield above 3%
cutEnglish → ruleDid the stock cut its dividend last time?
div2English → ruleHas the stock paid more than $2 per share in dividends over the past year?
trendEnglish → ruleIs the stock above its 200-day moving average?

Answers

Symbolyield3rulecutrulediv2ruletrendrule
XOM0.05370.14090.94630.9463
VZ0.94630.14090.94560.3448
MO0.94630.14090.94630.9463
PM0.3550.14090.94630.9463

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: Yield above 3%: true for VZ, MO of 4. Did the stock cut its dividend last time: true for none of 4. Has the stock paid more than $2 per share in dividends over the past year: true for XOM, VZ, MO, PM of 4. Is the stock above its 200-day moving average: true for XOM, MO, PM of 4.

Yield above the threshold with no recent cut is eligible; a cut is the standard exclusion trigger in high-yield methodologies.

Request JSON (XOM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XOM"
  },
  "questions": {
    "yield3": {
      "type": "yes_no",
      "ask": "div_yield_ttm > 3"
    },
    "cut": {
      "type": "yes_no",
      "instructions": "Did the stock cut its dividend last time?"
    },
    "div2": {
      "type": "yes_no",
      "instructions": "Has the stock paid more than $2 per share in dividends over the past year?"
    },
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    }
  }
}
Response JSON (XOM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "yield3": {
      "yes_no": 0.0537,
      "rule": "div_yield_ttm > 3",
      "basis": "rule"
    },
    "cut": {
      "yes_no": 0.1409,
      "rule": "cut_last > 0.5",
      "basis": "pattern"
    },
    "div2": {
      "yes_no": 0.9463,
      "rule": "div_ttm > 2",
      "basis": "pattern"
    },
    "trend": {
      "yes_no": 0.9463,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    }
  },
  "context": {
    "symbol": "XOM",
    "as_of": "2026-10-30"
  }
}

cut_last div_ttm div_yield_ttm sma

Index provider · example 4

Corporate-action flag: is an NVDA split recent or announced?

Splits change divisors and share counts. Flag any announced or recent split for the corporate-actions team.

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

State

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

Questions

announcedruledays_to_split <= 365
A split is announced
recentEnglish → ruleHas the stock split in the past three months?
reverserulereverse_split_last > 0.5
Last split was a reverse split
multirulesplits_5y >= 2
Two or more splits in five years

Answers

QuestionAnswerReading
announced
A split is announced
0.0537false
recent
Has the stock split in the past three months
compiled to days_since_split <= 91
0.0537false
reverse
Last split was a reverse split
0.1409false
multi
Two or more splits in five years
0.1409false

Actions

Rules on the answers decide what to send.

announced >= 0.6 or recent >= 0.6→Webhookcorporate-actions
else→Slackindex-ops
What each action would send 1 of 2 fired · dry run, nothing sent
ca_ticketrule false: skipped
clearwould send (dry run)Slack → index-ops
{
  "text": "NVDA (2026-10-30): no split recent or announced."
}

What it means

For NVDA on the session of 2026-10-30: Not true: A split is announced; Has the stock split in the past three months; Last split was a reverse split; Two or more splits in five years. Fired: clear (Slack → index-ops).

A split recent or announced opens a ticket so the divisor adjustment is never missed; otherwise the ops channel logs a clear.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "announced": {
      "type": "yes_no",
      "ask": "days_to_split <= 365"
    },
    "recent": {
      "type": "yes_no",
      "instructions": "Has the stock split in the past three months?"
    },
    "reverse": {
      "type": "yes_no",
      "ask": "reverse_split_last > 0.5"
    },
    "multi": {
      "type": "yes_no",
      "ask": "splits_5y >= 2"
    }
  },
  "actions": [
    {
      "id": "ca_ticket",
      "when": "announced >= 0.6 or recent >= 0.6",
      "do": "webhook",
      "connection": "corporate-actions",
      "body": {
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "event": "split",
        "p_announced": "{{announced}}",
        "p_recent": "{{recent}}",
        "task": "adjust_divisor_and_shares"
      }
    },
    {
      "id": "clear",
      "when": "else",
      "do": "slack",
      "connection": "index-ops",
      "message": "{{symbol}} ({{as_of}}): no split recent or announced."
    }
  ],
  "dry_run": true
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "announced": {
      "yes_no": 0.0537,
      "rule": "days_to_split <= 365",
      "basis": "rule"
    },
    "recent": {
      "yes_no": 0.0537,
      "rule": "days_since_split <= 91",
      "basis": "pattern"
    },
    "reverse": {
      "yes_no": 0.1409,
      "rule": "reverse_split_last > 0.5",
      "basis": "rule"
    },
    "multi": {
      "yes_no": 0.1409,
      "rule": "splits_5y >= 2",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "ca_ticket",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "clear",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "index-ops",
      "preview": {
        "text": "NVDA (2026-10-30): no split recent or announced."
      }
    }
  ]
}

days_since_split days_to_split reverse_split_last splits_5y

Index provider · example 5

Rebalance week: does JPM report in the next 10 days?

A rebalance trade into a name that reports days later adds event risk for trackers. Check a large constituent's earnings timing against the rebalance date.

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

State

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

Questions

earn10ruledays_to_earnings <= 10
Reports earnings within 10 days
bmoEnglish → ruleDoes the stock report before the market opens next time?
recentruledays_since_earnings <= 5
Reported in the last 5 days
big_reactruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%

Answers

QuestionAnswerReading
earn10
Reports earnings within 10 days
0.0537false
bmo
Does the stock report before the market opens next time
compiled to next_report_bmo > 0.5
0.8591true
recent
Reported in the last 5 days
0.0537false
big_react
Last earnings move bigger than 5%
0.0664false

What it means

For JPM on the session of 2026-10-30: True now: Does the stock report before the market opens next time. Not true: Reports earnings within 10 days; Reported in the last 5 days; Last earnings move bigger than 5%.

This informs the rebalance notice to licensees; the index rules do not change, the communication does.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JPM"
  },
  "questions": {
    "earn10": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10"
    },
    "bmo": {
      "type": "yes_no",
      "instructions": "Does the stock report before the market opens next time?"
    },
    "recent": {
      "type": "yes_no",
      "ask": "days_since_earnings <= 5"
    },
    "big_react": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    }
  }
}
Response JSON (JPM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "earn10": {
      "yes_no": 0.0537,
      "rule": "days_to_earnings <= 10",
      "basis": "rule"
    },
    "bmo": {
      "yes_no": 0.8591,
      "rule": "next_report_bmo > 0.5",
      "basis": "pattern"
    },
    "recent": {
      "yes_no": 0.0537,
      "rule": "days_since_earnings <= 5",
      "basis": "rule"
    },
    "big_react": {
      "yes_no": 0.0664,
      "rule": "abs(last_earnings_move) > 5",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "JPM",
    "as_of": "2026-10-30"
  }
}

abs days_since_earnings days_to_earnings last_earnings_move next_report_bmo

Index provider · example 6

Low-volatility index screen: does PG qualify?

Select the calmest names by realized volatility and ATR, written as exact rules, and test one candidate.

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

State

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

Questions

hv_lowEnglish → ruleIs 20-day historical volatility below 20%?
atr_lowEnglish → ruleIs the 14-day ATR less than 2% of the price?
stdrulestd(log(C / C[-1]), 60) * sqrt(252) < 0.2
60-day realized volatility under 20%, annualized
vol_riseforecastWill volatility rise over the next 5 days?
Volatility rising over 5 days

Answers

QuestionAnswerReading
hv_low
Is 20-day historical volatility below 20%
compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2
0.0873false
atr_low
Is the 14-day ATR less than 2% of the price
compiled to atr(14) / C < 0.02
0.7818true
std
60-day realized volatility under 20%, annualized
0.6133true
vol_rise
Volatility rising over 5 days
0.20821% · unlikely

What it means

For PG on the session of 2026-10-30: True now: Is the 14-day ATR less than 2% of the price; 60-day realized volatility under 20%, annualized. Not true: Is 20-day historical volatility below 20%. Forecasts: Volatility rising over 5 days 21%.

Selection uses the three exact volatility rules; the forecast is shown to licensees as context only.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "PG"
  },
  "questions": {
    "hv_low": {
      "type": "yes_no",
      "instructions": "Is 20-day historical volatility below 20%?"
    },
    "atr_low": {
      "type": "yes_no",
      "instructions": "Is the 14-day ATR less than 2% of the price?"
    },
    "std": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 60) * sqrt(252) < 0.2"
    },
    "vol_rise": {
      "type": "yes_no",
      "instructions": "Will volatility rise over the next 5 days?"
    }
  }
}
Response JSON (PG, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "hv_low": {
      "yes_no": 0.0873,
      "rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2",
      "basis": "pattern"
    },
    "atr_low": {
      "yes_no": 0.7818,
      "rule": "atr(14) / C < 0.02",
      "basis": "pattern"
    },
    "std": {
      "yes_no": 0.6133,
      "rule": "std(log(C / C[-1]), 60) * sqrt(252) < 0.2",
      "basis": "rule"
    },
    "vol_rise": {
      "yes_no": 0.208
    }
  },
  "context": {
    "symbol": "PG",
    "as_of": "2026-10-30"
  }
}

atr log offset sqrt std

Index provider · example 7

Trend-following index: SPY risk-on or risk-off this month?

A trend index holds equities above the 200-day and moves to bills below it. Compute the switch exactly, and log it.

ora-fin-0.1.1SPY5 questions3 actions
  1. StateSPY
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions3 rules · dry run

State

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

Questions

risk_onEnglish → ruleIs the stock above its 200-day moving average?
cross_dnrulecrossdown(C, sma(C, 200))
Crossed below the 200-day today
cross_uprulecrossup(C, sma(C, 200))
Crossed above the 200-day today
drawdownruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
risk_on
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.9451true
cross_dn
Crossed below the 200-day today
0.05false
cross_up
Crossed above the 200-day today
0.05false
drawdown
More than 20% off the 52-week high
0.0537false
drop5
A 5% drawdown within a month
0.20320% · unlikely

Actions

Rules on the answers decide what to send.

cross_dn >= 0.6→Webhookindex-calc
cross_up >= 0.6→Webhookindex-calc
else→Slackindex-ops
What each action would send 1 of 3 fired · dry run, nothing sent
switch_offrule false: skipped
switch_onrule false: skipped
holdwould send (dry run)Slack → index-ops
{
  "text": "SPY (2026-10-30): no 200-day cross; trend index holds (above the 200-day 95%)."
}

What it means

For SPY on the session of 2026-10-30: True now: Is the stock above its 200-day moving average. Not true: Crossed below the 200-day today; Crossed above the 200-day today; More than 20% off the 52-week high. Forecasts: A 5% drawdown within a month 20%. Fired: hold (Slack → index-ops).

Only a cross changes the index state; every other day the calculation agent gets a hold message for the audit trail.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "risk_on": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "cross_dn": {
      "type": "yes_no",
      "ask": "crossdown(C, sma(C, 200))"
    },
    "cross_up": {
      "type": "yes_no",
      "ask": "crossup(C, sma(C, 200))"
    },
    "drawdown": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "switch_off",
      "when": "cross_dn >= 0.6",
      "do": "webhook",
      "connection": "index-calc",
      "body": {
        "index": "trend-us-large",
        "signal": "risk_off",
        "underlying": "{{symbol}}",
        "as_of": "{{as_of}}",
        "p_cross": "{{cross_dn}}"
      }
    },
    {
      "id": "switch_on",
      "when": "cross_up >= 0.6",
      "do": "webhook",
      "connection": "index-calc",
      "body": {
        "index": "trend-us-large",
        "signal": "risk_on",
        "underlying": "{{symbol}}",
        "as_of": "{{as_of}}",
        "p_cross": "{{cross_up}}"
      }
    },
    {
      "id": "hold",
      "when": "else",
      "do": "slack",
      "connection": "index-ops",
      "message": "{{symbol}} ({{as_of}}): no 200-day cross; trend index holds (above the 200-day {{risk_on|pct}})."
    }
  ],
  "dry_run": true
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "risk_on": {
      "yes_no": 0.9451,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "cross_dn": {
      "yes_no": 0.05,
      "rule": "crossdown(C, sma(C, 200))",
      "basis": "rule"
    },
    "cross_up": {
      "yes_no": 0.05,
      "rule": "crossup(C, sma(C, 200))",
      "basis": "rule"
    },
    "drawdown": {
      "yes_no": 0.0537,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.203
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "switch_off",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "switch_on",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "hold",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "index-ops",
      "preview": {
        "text": "SPY (2026-10-30): no 200-day cross; trend index holds (above the 200-day 95%)."
      }
    }
  ]
}

crossdown crossup max sma

Index provider · example 8

RSP vs SPY: is the equal-weight index keeping up?

Monitor breadth by comparing the equal-weight and cap-weight S&P funds on the same rules for the monthly index commentary.

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

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
rocruleroc(C, 20) > 5
Up more than 5% in 20 sessions
meanruleC > mean(C, 100)
Above its 100-day mean
rsi50rulersi(C, 14) > 50
RSI above 50
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulerocrulemeanrulersi50rulebeat_spyforecast
RSP0.78580.33980.76060.82880.446
SPY0.11280.05370.35750.09190.514

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: Above the 50-day average: true for RSP of 2. Up more than 5% in 20 sessions: true for none of 2. Above its 100-day mean: true for RSP of 2. RSI above 50: true for RSP of 2. Highest odds for “Beating SPY over a month”: SPY at 51%.

When equal weight fails the trend rules while cap weight passes, the commentary describes a narrow market.

Request JSON (RSP; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "RSP"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "roc": {
      "type": "yes_no",
      "ask": "roc(C, 20) > 5"
    },
    "mean": {
      "type": "yes_no",
      "ask": "C > mean(C, 100)"
    },
    "rsi50": {
      "type": "yes_no",
      "ask": "rsi(C, 14) > 50"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  }
}
Response JSON (RSP, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.7858,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "roc": {
      "yes_no": 0.3398,
      "rule": "roc(C, 20) > 5",
      "basis": "rule"
    },
    "mean": {
      "yes_no": 0.7606,
      "rule": "C > mean(C, 100)",
      "basis": "rule"
    },
    "rsi50": {
      "yes_no": 0.8288,
      "rule": "rsi(C, 14) > 50",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.446
    }
  },
  "context": {
    "symbol": "RSP",
    "as_of": "2026-10-30"
  }
}

mean roc rsi sma

Index provider · example 9

Liquidity eligibility: does SMCI trade enough for the index?

Index rules require minimum traded value. Check average and median dollar volume for a small-cap candidate.

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

State

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

Questions

liquid50English → ruleDoes the stock trade more than $50 million a day on average?
liquid100ruleavg(C * V, 20) > 100000000
Trades more than $100 million a day
medianrulemedian(C * V, 20) > 50000000
Median daily traded value over 20 days above $50 million
vol_dryruleV < 0.6 * avg(V, 20)
Volume under 60% of normal

Answers

QuestionAnswerReading
liquid50
Does the stock trade more than $50 million a day on average
compiled to avg(C * V, 20) > 50000000
0.9463true
liquid100
Trades more than $100 million a day
0.9463true
median
Median daily traded value over 20 days above $50 million
0.9463true
vol_dry
Volume under 60% of normal
0.1739false

Actions

Rules on the answers decide what to send.

liquid50 < 0.4 or median < 0.4→Webhookmethodology-queue
else→Slackindex-ops
What each action would send 1 of 2 fired · dry run, nothing sent
fail_liquidityrule false: skipped
passwould send (dry run)Slack → index-ops
{
  "text": "SMCI (2026-10-30) passes liquidity (average 95%, median 95%)."
}

What it means

For SMCI on the session of 2026-10-30: True now: Does the stock trade more than $50 million a day on average; Trades more than $100 million a day; Median daily traded value over 20 days above $50 million. Not true: Volume under 60% of normal. Fired: pass (Slack → index-ops).

Average and median traded value together guard against one heavy day making a thin name look liquid.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SMCI"
  },
  "questions": {
    "liquid50": {
      "type": "yes_no",
      "instructions": "Does the stock trade more than $50 million a day on average?"
    },
    "liquid100": {
      "type": "yes_no",
      "ask": "avg(C * V, 20) > 100000000"
    },
    "median": {
      "type": "yes_no",
      "ask": "median(C * V, 20) > 50000000"
    },
    "vol_dry": {
      "type": "yes_no",
      "ask": "V < 0.6 * avg(V, 20)"
    }
  },
  "actions": [
    {
      "id": "fail_liquidity",
      "when": "liquid50 < 0.4 or median < 0.4",
      "do": "webhook",
      "connection": "methodology-queue",
      "body": {
        "candidate": "{{symbol}}",
        "as_of": "{{as_of}}",
        "rule": "min_traded_value_50m",
        "p_avg": "{{liquid50}}",
        "p_median": "{{median}}",
        "proposed": "ineligible"
      }
    },
    {
      "id": "pass",
      "when": "else",
      "do": "slack",
      "connection": "index-ops",
      "message": "{{symbol}} ({{as_of}}) passes liquidity (average {{liquid50|pct}}, median {{median|pct}})."
    }
  ],
  "dry_run": true
}
Response JSON (SMCI, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "liquid50": {
      "yes_no": 0.9463,
      "rule": "avg(C * V, 20) > 50000000",
      "basis": "pattern"
    },
    "liquid100": {
      "yes_no": 0.9463,
      "rule": "avg(C * V, 20) > 100000000",
      "basis": "rule"
    },
    "median": {
      "yes_no": 0.9463,
      "rule": "median(C * V, 20) > 50000000",
      "basis": "rule"
    },
    "vol_dry": {
      "yes_no": 0.1739,
      "rule": "V < 0.6 * avg(V, 20)",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "SMCI",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "fail_liquidity",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "pass",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "index-ops",
      "preview": {
        "text": "SMCI (2026-10-30) passes liquidity (average 95%, median 95%)."
      }
    }
  ]
}

avg median

Index provider · example 10

Earnings-quality index screen on MSFT, COST, LLY

A quality index admits names with a record of beating estimates and growing EPS. Run the fact rules on candidates.

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

State

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

Questions

beatsEnglish → ruleHas the stock beaten EPS estimates in at least 3 of the last 4 quarters?
eps_gruleeps_growth_yoy > 10
EPS up more than 10% on the year
rev_gEnglish → ruleDid revenue grow more than 5% year over year?
posEnglish → ruleWas EPS positive last quarter?
missEnglish → ruleHas the stock missed EPS estimates in any of the last 4 quarters?

Answers

Symbolbeatsruleeps_grulerev_gruleposrulemissrule
MSFT0.85910.83270.94630.94630.1409
COST0.550.94630.94630.94630.55
LLY0.85910.05370.94630.94630.1409

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: Has the stock beaten EPS estimates in at least 3 of the last 4 quarters: true for MSFT, LLY of 3. EPS up more than 10% on the year: true for MSFT, COST of 3. Did revenue grow more than 5% year over year: true for MSFT, COST, LLY of 3. Was EPS positive last quarter: true for MSFT, COST, LLY of 3.

All facts come from the earnings record as known on each report's reaction session, so the screen has no look-ahead.

Request JSON (MSFT; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MSFT"
  },
  "questions": {
    "beats": {
      "type": "yes_no",
      "instructions": "Has the stock beaten EPS estimates in at least 3 of the last 4 quarters?"
    },
    "eps_g": {
      "type": "yes_no",
      "ask": "eps_growth_yoy > 10"
    },
    "rev_g": {
      "type": "yes_no",
      "instructions": "Did revenue grow more than 5% year over year?"
    },
    "pos": {
      "type": "yes_no",
      "instructions": "Was EPS positive last quarter?"
    },
    "miss": {
      "type": "yes_no",
      "instructions": "Has the stock missed EPS estimates in any of the last 4 quarters?"
    }
  }
}
Response JSON (MSFT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "beats": {
      "yes_no": 0.8591,
      "rule": "beats_last4 >= 3",
      "basis": "pattern"
    },
    "eps_g": {
      "yes_no": 0.8327,
      "rule": "eps_growth_yoy > 10",
      "basis": "rule"
    },
    "rev_g": {
      "yes_no": 0.9463,
      "rule": "revenue_growth_yoy > 5",
      "basis": "pattern"
    },
    "pos": {
      "yes_no": 0.9463,
      "rule": "last_eps > 0",
      "basis": "pattern"
    },
    "miss": {
      "yes_no": 0.1409,
      "rule": "misses_last4 >= 1",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "MSFT",
    "as_of": "2026-10-30"
  }
}

beats_last4 eps_growth_yoy last_eps misses_last4 revenue_growth_yoy

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 Institutions: ETF issuer, Insurance investment office, Pension fund, Endowment, Sovereign wealth fund.

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