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.
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 11–20 of 20 · page 2 of 2
Index provider · example 11
Reverse-split screen: should AAL be excluded?
Some methodologies exclude names after a reverse split. Check a candidate for one in the past year.
- StateAAL
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAL"} The server fills in the latest completed session.
Questions
rev1y | English → rule | Has the stock done a reverse split in the past year? |
rev_last | English → rule | Was the last split a reverse split? |
bear | English → rule | Is the stock in bear-market territory, more than 20% below its 52-week high? |
drawdown | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
Answers
| Question | Answer | Reading |
|---|---|---|
rev1yHas the stock done a reverse split in the past year compiled to days_since_reverse_split <= 365 | 0.0537 | false |
rev_lastWas the last split a reverse split compiled to reverse_split_last > 0.5 | 0.50 | not known |
bearIs the stock in bear-market territory, more than 20% below its 52-week high compiled to C < 0.8 * max(H, 252) | 0.9447 | true |
drawdownMore than 20% off the 52-week high | 0.9447 | true |
Actions
Rules on the answers decide what to send.
rev1y >= 0.6→Webhookmethodology-queueWhat it means
For AAL on the session of 2026-10-30: True now: Is the stock in bear-market territory, more than 20% below its 52-week high; More than 20% off the 52-week high. Not true: Has the stock done a reverse split in the past year. Not known (no data on record): Was the last split a reverse split. No action fired: every rule was false.
A reverse split in the past year is proposed for exclusion at the next review; the committee confirms.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAL"
},
"questions": {
"rev1y": {
"type": "yes_no",
"instructions": "Has the stock done a reverse split in the past year?"
},
"rev_last": {
"type": "yes_no",
"instructions": "Was the last split a reverse split?"
},
"bear": {
"type": "yes_no",
"instructions": "Is the stock in bear-market territory, more than 20% below its 52-week high?"
},
"drawdown": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
}
},
"actions": [
{
"id": "exclude",
"when": "rev1y >= 0.6",
"do": "webhook",
"connection": "methodology-queue",
"body": {
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"rule": "reverse_split_12m",
"p": "{{rev1y}}",
"proposed": "exclude_at_next_review"
}
}
],
"dry_run": true
}Response JSON (AAL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"rev1y": {
"yes_no": 0.0537,
"rule": "days_since_reverse_split <= 365",
"basis": "pattern"
},
"rev_last": {
"yes_no": 0.5,
"rule": "reverse_split_last > 0.5",
"basis": "pattern"
},
"bear": {
"yes_no": 0.9447,
"rule": "C < 0.8 * max(H, 252)",
"basis": "pattern"
},
"drawdown": {
"yes_no": 0.9447,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
}
},
"context": {
"symbol": "AAL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "exclude",
"fired": false,
"status": "skipped"
}
]
}Index provider · example 12
Daily sector breadth for the index newsletter
After every close, check each sector fund against its 50-day and post the count to the newsletter tool.
- ScheduleMon–Fri at 17:00 ET
- State3 symbols
- Questions3 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"XLK"} then XLF, XLE, one request each. The server fills in the latest completed session.
Questions
above_50d | rule | C > sma(C, 50)Above the 50-day average |
above_200d | English → rule | Is the stock above its 200-day moving average? |
new_high | English → rule | Did the stock make a new 20-day high today? |
Answers
| Symbol | above_50drule | above_200drule | new_highrule | Fired |
|---|---|---|---|---|
XLK | 0.0776 | 0.92 | 0.0537 | row |
XLF | 0.6692 | 0.919 | 0.4864 | row |
XLE | 0.9432 | 0.9463 | 0.6226 | row |
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.
above_50d >= 0→Webhooknewsletter-zapier{
"sector": "XLK",
"as_of": "2026-10-30",
"above_50d": 0.0776,
"above_200d": 0.92,
"new_20d_high": 0.0537
}{
"sector": "XLF",
"as_of": "2026-10-30",
"above_50d": 0.6692,
"above_200d": 0.919,
"new_20d_high": 0.4864
}{
"sector": "XLE",
"as_of": "2026-10-30",
"above_50d": 0.9432,
"above_200d": 0.9463,
"new_20d_high": 0.6226
}What it means
Session of 2026-10-30, 3 symbols: Above the 50-day average: true for XLF, XLE of 3. Is the stock above its 200-day moving average: true for XLK, XLF, XLE of 3. Did the stock make a new 20-day high today: true for XLE of 3. row fired for XLK, XLF, XLE.
Each sector posts a row, and the newsletter counts how many are above their averages; the rows are facts only.
As a scheduled workflow (Mon–Fri at 17:00 ET)
Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.
{
"name": "Daily sector breadth for the index newsletter",
"symbols": "XLK XLF XLE",
"days": [
1,
2,
3,
4,
5
],
"at_time": "17:00",
"model": "ora-fin-0.1.1",
"questions": {
"above_50d": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"above_200d": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"new_high": {
"type": "yes_no",
"instructions": "Did the stock make a new 20-day high today?"
}
},
"actions": [
{
"id": "row",
"when": "above_50d >= 0",
"do": "webhook",
"connection": "newsletter-zapier",
"body": {
"sector": "{{symbol}}",
"as_of": "{{as_of}}",
"above_50d": "{{above_50d}}",
"above_200d": "{{above_200d}}",
"new_20d_high": "{{new_high}}"
}
}
]
}Request JSON (XLK; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLK"
},
"questions": {
"above_50d": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"above_200d": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"new_high": {
"type": "yes_no",
"instructions": "Did the stock make a new 20-day high today?"
}
},
"actions": [
{
"id": "row",
"when": "above_50d >= 0",
"do": "webhook",
"connection": "newsletter-zapier",
"body": {
"sector": "{{symbol}}",
"as_of": "{{as_of}}",
"above_50d": "{{above_50d}}",
"above_200d": "{{above_200d}}",
"new_20d_high": "{{new_high}}"
}
}
],
"dry_run": true
}Response JSON (XLK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"above_50d": {
"yes_no": 0.0776,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"above_200d": {
"yes_no": 0.92,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"new_high": {
"yes_no": 0.0537,
"rule": "H > highest(H, 20)",
"basis": "pattern"
}
},
"context": {
"symbol": "XLK",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "row",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "newsletter-zapier",
"preview": {
"body": {
"sector": "XLK",
"as_of": "2026-10-30",
"above_50d": 0.0776,
"above_200d": 0.92,
"new_20d_high": 0.0537
}
}
}
]
}Index provider · example 13
QQQ: gap and outside-day review for index calculators
Big gap or outside days stress index-tracking products. Flag them for the calculation team's daily review.
- StateQQQ
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"QQQ"} The server fills in the latest completed session.
Questions
outside | rule | outside_bar()outside bar candle: Today's high above yesterday's and low below it. |
inside | rule | inside_bar()inside bar candle: Today's high and low are inside yesterday's (equal counts). |
gap | rule | abs(O - C[-1]) > 0.5 * ref(atr(14), -1)Gap bigger than half an ATR |
tr | rule | tr() > 1.5 * ref(atr(14), -1)True range 1.5× yesterday's ATR |
big_move | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
outsideoutside bar candle: Today's high above yesterday's and low below it. | 0.0537 | false |
insideinside bar candle: Today's high and low are inside yesterday's (equal counts). | 0.0537 | false |
gapGap bigger than half an ATR | 0.9463 | true |
trTrue range 1.5× yesterday's ATR | 0.9434 | true |
big_moveA big move either way in 5 days | 0.355 | 36% · unlikely |
What it means
For QQQ on the session of 2026-10-30: True now: Gap bigger than half an ATR; True range 1.5× yesterday's ATR. Not true: outside bar candle: Today's high above yesterday's and low below it.; inside bar candle: Today's high and low are inside yesterday's (equal counts).. Forecasts: A big move either way in 5 days 36%.
An outside day with a wide true range is the day tracking differences tend to appear; the review checks those first.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "QQQ"
},
"questions": {
"outside": {
"type": "yes_no",
"ask": "outside_bar()"
},
"inside": {
"type": "yes_no",
"ask": "inside_bar()"
},
"gap": {
"type": "yes_no",
"ask": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)"
},
"tr": {
"type": "yes_no",
"ask": "tr() > 1.5 * ref(atr(14), -1)"
},
"big_move": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
}
}Response JSON (QQQ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"outside": {
"yes_no": 0.0537,
"rule": "outside_bar()",
"basis": "rule"
},
"inside": {
"yes_no": 0.0537,
"rule": "inside_bar()",
"basis": "rule"
},
"gap": {
"yes_no": 0.9463,
"rule": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)",
"basis": "rule"
},
"tr": {
"yes_no": 0.9434,
"rule": "tr() > 1.5 * ref(atr(14), -1)",
"basis": "rule"
},
"big_move": {
"yes_no": 0.355
}
},
"context": {
"symbol": "QQQ",
"as_of": "2026-10-30"
}
}Index provider · example 14
Value factor index: is INTC basing after its drawdown?
A value-tilt index wants beaten-down names that have stopped falling. Check whether a name off its highs is forming a base.
- StateINTC
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"INTC"} The server fills in the latest completed session.
Questions
off_high | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
base | rule | (max(H, 10) - min(L, 10)) / C < 0.05A tight 10-day base (under 5% of price) |
low_bars | rule | lowestbars(L, 20) >= 10The 20-day low is at least ten sessions old |
higher_low | rule | min(L, 5) > ref(min(L, 5), -5)This week's low is above last week's |
rally5 | forecast | Will it rally at least 5% at some point in the next month? A 5% rally within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
off_highMore than 20% off the 52-week high | 0.9463 | true |
baseA tight 10-day base (under 5% of price) | 0.0537 | false |
low_barsThe 20-day low is at least ten sessions old | 0.0946 | false |
higher_lowThis week's low is above last week's | 0.0598 | false |
rally5A 5% rally within a month | 0.871 | 87% · likely |
What it means
For INTC on the session of 2026-10-30: True now: More than 20% off the 52-week high. Not true: A tight 10-day base (under 5% of price); The 20-day low is at least ten sessions old; This week's low is above last week's. Forecasts: A 5% rally within a month 87%.
A deep drawdown plus an old low and a higher weekly low describes a base; that makes it a candidate for the research sleeve, not an index rule change.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "INTC"
},
"questions": {
"off_high": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"base": {
"type": "yes_no",
"ask": "(max(H, 10) - min(L, 10)) / C < 0.05"
},
"low_bars": {
"type": "yes_no",
"ask": "lowestbars(L, 20) >= 10"
},
"higher_low": {
"type": "yes_no",
"ask": "min(L, 5) > ref(min(L, 5), -5)"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
}
}Response JSON (INTC, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"off_high": {
"yes_no": 0.9463,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"base": {
"yes_no": 0.0537,
"rule": "(max(H, 10) - min(L, 10)) / C < 0.05",
"basis": "rule"
},
"low_bars": {
"yes_no": 0.0946,
"rule": "lowestbars(L, 20) >= 10",
"basis": "rule"
},
"higher_low": {
"yes_no": 0.0598,
"rule": "min(L, 5) > ref(min(L, 5), -5)",
"basis": "rule"
},
"rally5": {
"yes_no": 0.871
}
},
"context": {
"symbol": "INTC",
"as_of": "2026-10-30"
}
}Index provider · example 15
Rebalance bands: has IWM drifted far from SPY?
A blended index rebalances when small caps drift from large caps. Check the relative move between rebalances.
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"IWM"} then SPY, one request each. The server fills in the latest completed session.
Questions
roc63 | rule | roc(C, 63) > 5Up more than 5% over three months |
roc63_dn | rule | roc(C, 63) < -5Down more than 5% over three months |
trend | rule | C > sma(C, 50)Above the 50-day average |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | roc63rule | roc63_dnrule | trendrule | beat_spyforecast |
|---|---|---|---|---|
IWM | 0.0688 | 0.5846 | 0.2176 | 0.459 |
SPY | 0.0537 | 0.0537 | 0.1128 | 0.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: Up more than 5% over three months: true for none of 2. Down more than 5% over three months: true for none of 2. Above the 50-day average: true for none of 2. Highest odds for “Beating SPY over a month”: SPY at 51%.
If one leg rose more than the band and the other did not, the quarterly rebalance will be larger; the team pre-announces it.
Request JSON (IWM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "IWM"
},
"questions": {
"roc63": {
"type": "yes_no",
"ask": "roc(C, 63) > 5"
},
"roc63_dn": {
"type": "yes_no",
"ask": "roc(C, 63) < -5"
},
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (IWM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"roc63": {
"yes_no": 0.0688,
"rule": "roc(C, 63) > 5",
"basis": "rule"
},
"roc63_dn": {
"yes_no": 0.5846,
"rule": "roc(C, 63) < -5",
"basis": "rule"
},
"trend": {
"yes_no": 0.2176,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.459
}
},
"context": {
"symbol": "IWM",
"as_of": "2026-10-30"
}
}Index provider · example 16
Research index: which reversal candles is XOM printing today?
Researching a candlestick-signal index: test which reversal patterns are present today on a liquid name.
- StateXOM
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XOM"} The server fills in the latest completed session.
Questions
hammer | rule | hammer()hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back. |
inv_hammer | rule | inverted_hammer()inverted hammer candle: Shooting-star shape after a five-bar decline. |
dragonfly | rule | dragonfly_doji()dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick. |
gravestone | rule | gravestone_doji()gravestone doji candle: Doji with a long upper wick and almost no lower wick. |
marubozu | rule | marubozu()marubozu candle: Body at least 90% of the range: almost no wicks. |
tweezer_top | rule | tweezer_top()tweezer top candle: Green then red, with highs within 0.1%. |
Answers
| Question | Answer | Reading |
|---|---|---|
hammerhammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back. | 0.0971 | false |
inv_hammerinverted hammer candle: Shooting-star shape after a five-bar decline. | 0.1089 | false |
dragonflydragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick. | 0.0971 | false |
gravestonegravestone doji candle: Doji with a long upper wick and almost no lower wick. | 0.1089 | false |
marubozumarubozu candle: Body at least 90% of the range: almost no wicks. | 0.057 | false |
tweezer_toptweezer top candle: Green then red, with highs within 0.1%. | 0.0537 | false |
What it means
For XOM on the session of 2026-10-30: Not true: hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back.; inverted hammer candle: Shooting-star shape after a five-bar decline.; dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.; gravestone doji candle: Doji with a long upper wick and almost no lower wick.; marubozu candle: Body at least 90% of the range: almost no wicks.; tweezer top candle: Green then red, with highs within 0.1%..
Each pattern is an exact definition, so the research team can count signals over time and test them before any index uses one.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XOM"
},
"questions": {
"hammer": {
"type": "yes_no",
"ask": "hammer()"
},
"inv_hammer": {
"type": "yes_no",
"ask": "inverted_hammer()"
},
"dragonfly": {
"type": "yes_no",
"ask": "dragonfly_doji()"
},
"gravestone": {
"type": "yes_no",
"ask": "gravestone_doji()"
},
"marubozu": {
"type": "yes_no",
"ask": "marubozu()"
},
"tweezer_top": {
"type": "yes_no",
"ask": "tweezer_top()"
}
}
}Response JSON (XOM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"hammer": {
"yes_no": 0.0971,
"rule": "hammer()",
"basis": "rule"
},
"inv_hammer": {
"yes_no": 0.1089,
"rule": "inverted_hammer()",
"basis": "rule"
},
"dragonfly": {
"yes_no": 0.0971,
"rule": "dragonfly_doji()",
"basis": "rule"
},
"gravestone": {
"yes_no": 0.1089,
"rule": "gravestone_doji()",
"basis": "rule"
},
"marubozu": {
"yes_no": 0.057,
"rule": "marubozu()",
"basis": "rule"
},
"tweezer_top": {
"yes_no": 0.0537,
"rule": "tweezer_top()",
"basis": "rule"
}
},
"context": {
"symbol": "XOM",
"as_of": "2026-10-30"
}
}dragonfly_doji gravestone_doji hammer inverted_hammer marubozu tweezer_top
Index provider · example 17
Dividend ex-dates for total-return index calculation
Total-return indexes reinvest on ex-dates. Flag constituents going ex in the next 30 days so the calculation team is ready.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then JPM, XOM, one request each. The server fills in the latest completed session.
Questions
ex_soon | rule | days_to_ex_div <= 30Goes ex-dividend within 30 days |
ex_recent | English → rule | Did the stock go ex-dividend in the last 30 days? |
next_up | English → rule | Is the next declared dividend larger than the last one? |
pays | rule | pays_dividend > 0.5Pays a dividend |
Answers
| Symbol | ex_soonrule | ex_recentrule | next_uprule | paysrule | Fired |
|---|---|---|---|---|---|
AAPL | 0.0537 | 0.0537 | 0.50 | 0.8591 | none |
JPM | 0.0537 | 0.9317 | 0.50 | 0.8591 | none |
XOM | 0.0537 | 0.0537 | 0.50 | 0.8591 | none |
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.
ex_soon >= 0.6→Webhookindex-calcWhat it means
Session of 2026-10-30, 3 symbols: Goes ex-dividend within 30 days: true for none of 3. Did the stock go ex-dividend in the last 30 days: true for JPM of 3. Is the next declared dividend larger than the last one: true for none of 3. Pays a dividend: true for AAPL, JPM, XOM of 3. tr_calc fired for none.
Only declared ex-dates count, so a name with nothing declared answers no and is checked again next week.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"ex_soon": {
"type": "yes_no",
"ask": "days_to_ex_div <= 30"
},
"ex_recent": {
"type": "yes_no",
"instructions": "Did the stock go ex-dividend in the last 30 days?"
},
"next_up": {
"type": "yes_no",
"instructions": "Is the next declared dividend larger than the last one?"
},
"pays": {
"type": "yes_no",
"ask": "pays_dividend > 0.5"
}
},
"actions": [
{
"id": "tr_calc",
"when": "ex_soon >= 0.6",
"do": "webhook",
"connection": "index-calc",
"body": {
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"event": "ex_dividend_within_30d",
"p": "{{ex_soon}}",
"next_div_higher": "{{next_up}}"
}
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"ex_soon": {
"yes_no": 0.0537,
"rule": "days_to_ex_div <= 30",
"basis": "rule"
},
"ex_recent": {
"yes_no": 0.0537,
"rule": "days_since_ex_div <= 30",
"basis": "pattern"
},
"next_up": {
"yes_no": 0.5,
"rule": "next_div_amount > last_div_amount",
"basis": "pattern"
},
"pays": {
"yes_no": 0.8591,
"rule": "pays_dividend > 0.5",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "tr_calc",
"fired": false,
"status": "skipped"
}
]
}days_since_ex_div days_to_ex_div last_div_amount next_div_amount pays_dividend
Index provider · example 18
Trend-strength index rule: ADX and directional movement on TSLA
A trend-strength index includes names whose ADX shows a strong directional move. Test the rule and its components on one name.
- StateTSLA
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TSLA"} The server fills in the latest completed session.
Questions
adx25 | rule | adx(14) > 25Trending (ADX above 25) |
uptrend | rule | adx(14) > 20 and diplus(14) > diminus(14)Trending up (ADX over 20 and +DI over −DI) |
di_down | rule | diminus(14) > diplus(14)-DI above +DI (directional pressure down) |
stoch | rule | stochk(14) > stochd(14)Stochastic %K above %D |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
adx25Trending (ADX above 25) | 0.0632 | false |
uptrendTrending up (ADX over 20 and +DI over −DI) | 0.1291 | false |
di_down-DI above +DI (directional pressure down) | 0.153 | false |
stochStochastic %K above %D | 0.2868 | false |
up_weekHigher in a week | 0.487 | 49% · close to even |
What it means
For TSLA on the session of 2026-10-30: Not true: Trending (ADX above 25); Trending up (ADX over 20 and +DI over −DI); -DI above +DI (directional pressure down); Stochastic %K above %D. Forecasts: Higher in a week 49%.
ADX says how strong a trend is, the DI lines say which way; the index needs both before admitting a name.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TSLA"
},
"questions": {
"adx25": {
"type": "yes_no",
"ask": "adx(14) > 25"
},
"uptrend": {
"type": "yes_no",
"ask": "adx(14) > 20 and diplus(14) > diminus(14)"
},
"di_down": {
"type": "yes_no",
"ask": "diminus(14) > diplus(14)"
},
"stoch": {
"type": "yes_no",
"ask": "stochk(14) > stochd(14)"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (TSLA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"adx25": {
"yes_no": 0.0632,
"rule": "adx(14) > 25",
"basis": "rule"
},
"uptrend": {
"yes_no": 0.1291,
"rule": "adx(14) > 20 and diplus(14) > diminus(14)",
"basis": "rule"
},
"di_down": {
"yes_no": 0.153,
"rule": "diminus(14) > diplus(14)",
"basis": "rule"
},
"stoch": {
"yes_no": 0.2868,
"rule": "stochk(14) > stochd(14)",
"basis": "rule"
},
"up_week": {
"yes_no": 0.487
}
},
"context": {
"symbol": "TSLA",
"as_of": "2026-10-30"
}
}Index provider · example 19
Weekly methodology check: smoothed trend on the S&P 500
Every Friday, recompute a smoothed-trend rule the index uses, and email the methodology owner if it changes state.
- ScheduleFri at 17:15 ET
- StateSPY
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
rec | rule | C > rec(C, self + 0.1 * (C - self))Above a recursive exponential smoother (alpha 0.1) |
rma | rule | C > rma(C, 50)Above its 50-day Wilder average |
hlc3 | rule | hlc3() > sma(hlc3(), 20)Typical price above its 20-day average |
ohlc4 | rule | ohlc4() > sma(C, 10)Average price of the day above the 10-day close average |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
recAbove a recursive exponential smoother (alpha 0.1) | 0.0786 | false |
rmaAbove its 50-day Wilder average | 0.496 | on the line (false) |
hlc3Typical price above its 20-day average | 0.0824 | false |
ohlc4Average price of the day above the 10-day close average | 0.0939 | false |
drop5A 5% drawdown within a month | 0.203 | 20% · unlikely |
Actions
Rules on the answers decide what to send.
rec >= 0.6 and rma >= 0.6→Emailmethodology-ownerelse→Emailmethodology-owner{
"subject": "SPY smoothed trend: not up (2026-10-30)",
"text": "Recursive smoother 8%, Wilder 50-day 50%. State: not up."
}What it means
For SPY on the session of 2026-10-30: Not true: Above a recursive exponential smoother (alpha 0.1); Typical price above its 20-day average; Average price of the day above the 10-day close average. On the line: Above its 50-day Wilder average. Forecasts: A 5% drawdown within a month 20%. Fired: state_down (Email → methodology-owner).
The rec() rule is the smoother written as a recursion; the email documents its state every week whatever it is.
As a scheduled workflow (Fri at 17:15 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 methodology check: smoothed trend on the S&P 500",
"symbols": "SPY",
"days": [
5
],
"at_time": "17:15",
"model": "ora-fin-0.1.1",
"questions": {
"rec": {
"type": "yes_no",
"ask": "C > rec(C, self + 0.1 * (C - self))"
},
"rma": {
"type": "yes_no",
"ask": "C > rma(C, 50)"
},
"hlc3": {
"type": "yes_no",
"ask": "hlc3() > sma(hlc3(), 20)"
},
"ohlc4": {
"type": "yes_no",
"ask": "ohlc4() > sma(C, 10)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "state",
"when": "rec >= 0.6 and rma >= 0.6",
"do": "email",
"connection": "methodology-owner",
"subject": "{{symbol}} smoothed trend: up ({{as_of}})",
"message": "Recursive smoother {{rec|pct}}, Wilder 50-day {{rma|pct}}, typical price {{hlc3|pct}}. State: up."
},
{
"id": "state_down",
"when": "else",
"do": "email",
"connection": "methodology-owner",
"subject": "{{symbol}} smoothed trend: not up ({{as_of}})",
"message": "Recursive smoother {{rec|pct}}, Wilder 50-day {{rma|pct}}. State: not up."
}
]
}Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"rec": {
"type": "yes_no",
"ask": "C > rec(C, self + 0.1 * (C - self))"
},
"rma": {
"type": "yes_no",
"ask": "C > rma(C, 50)"
},
"hlc3": {
"type": "yes_no",
"ask": "hlc3() > sma(hlc3(), 20)"
},
"ohlc4": {
"type": "yes_no",
"ask": "ohlc4() > sma(C, 10)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "state",
"when": "rec >= 0.6 and rma >= 0.6",
"do": "email",
"connection": "methodology-owner",
"subject": "{{symbol}} smoothed trend: up ({{as_of}})",
"message": "Recursive smoother {{rec|pct}}, Wilder 50-day {{rma|pct}}, typical price {{hlc3|pct}}. State: up."
},
{
"id": "state_down",
"when": "else",
"do": "email",
"connection": "methodology-owner",
"subject": "{{symbol}} smoothed trend: not up ({{as_of}})",
"message": "Recursive smoother {{rec|pct}}, Wilder 50-day {{rma|pct}}. State: not up."
}
],
"dry_run": true
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"rec": {
"yes_no": 0.0786,
"rule": "C > rec(C, self + 0.1 * (C - self))",
"basis": "rule"
},
"rma": {
"yes_no": 0.496,
"rule": "C > rma(C, 50)",
"basis": "rule"
},
"hlc3": {
"yes_no": 0.0824,
"rule": "hlc3() > sma(hlc3(), 20)",
"basis": "rule"
},
"ohlc4": {
"yes_no": 0.0939,
"rule": "ohlc4() > sma(C, 10)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.203
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "state",
"fired": false,
"status": "skipped"
},
{
"id": "state_down",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "methodology-owner",
"preview": {
"subject": "SPY smoothed trend: not up (2026-10-30)",
"text": "Recursive smoother 8%, Wilder 50-day 50%. State: not up."
}
}
]
}Index provider · example 20
Swing-structure screen: is XLK making higher lows?
A structural-trend index qualifies funds that keep making higher swing lows. Check the last three confirmed swing lows and the last two highs.
- StateXLK
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XLK"} The server fills in the latest completed session.
Questions
hl | rule | swinglow(5, 1) > swinglow(5, 2)Latest swing low above the one before |
hh | rule | swinghigh(5, 1) > swinghigh(5, 2)Latest swing high above the one before |
hl3 | rule | swinglow(5, 2) > swinglow(5, 3)The previous swing low above the one before it |
above_sh | rule | C > swinghigh(5)Above its last confirmed swing high |
new_high | forecast | Will it make a new 20-day high in the next week? A new 20-day high next week |
Answers
| Question | Answer | Reading |
|---|---|---|
hlLatest swing low above the one before | 0.4372 | on the line (false) |
hhLatest swing high above the one before | 0.9351 | true |
hl3The previous swing low above the one before it | 0.705 | true |
above_shAbove its last confirmed swing high | 0.0575 | false |
new_highA new 20-day high next week | 0.04 | 4% · unlikely |
What it means
For XLK on the session of 2026-10-30: True now: Latest swing high above the one before; The previous swing low above the one before it. Not true: Above its last confirmed swing high. On the line: Latest swing low above the one before. Forecasts: A new 20-day high next week 4%.
Swing pivots are confirmed only bars later, so the rule never looks ahead; three rising lows in a row qualifies.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLK"
},
"questions": {
"hl": {
"type": "yes_no",
"ask": "swinglow(5, 1) > swinglow(5, 2)"
},
"hh": {
"type": "yes_no",
"ask": "swinghigh(5, 1) > swinghigh(5, 2)"
},
"hl3": {
"type": "yes_no",
"ask": "swinglow(5, 2) > swinglow(5, 3)"
},
"above_sh": {
"type": "yes_no",
"ask": "C > swinghigh(5)"
},
"new_high": {
"type": "yes_no",
"instructions": "Will it make a new 20-day high in the next week?"
}
}
}Response JSON (XLK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"hl": {
"yes_no": 0.4372,
"rule": "swinglow(5, 1) > swinglow(5, 2)",
"basis": "rule"
},
"hh": {
"yes_no": 0.9351,
"rule": "swinghigh(5, 1) > swinghigh(5, 2)",
"basis": "rule"
},
"hl3": {
"yes_no": 0.705,
"rule": "swinglow(5, 2) > swinglow(5, 3)",
"basis": "rule"
},
"above_sh": {
"yes_no": 0.0575,
"rule": "C > swinghigh(5)",
"basis": "rule"
},
"new_high": {
"yes_no": 0.04
}
},
"context": {
"symbol": "XLK",
"as_of": "2026-10-30"
}
}Information, not investment advice. Rules answer from the latest completed daily session; forecasts are probabilities. Actions ran as dry runs: nothing was sent. More in Institutions: ETF issuer, Insurance investment office, Pension fund, Endowment, Sovereign wealth fund.