Use cases · Builders
Data vendor / platform: 20 ways to use Ora
Derived signals and event flags as a product, delivered by webhook to clients. Each example is a complete, runnable request with the real answers it returned (49 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 (64)
ref 10sma 8offset 6rsi 5ema 3avg 3abs 2pays_dividend 2adx 2atr_pct 2bblower 2bbmid 2days_since_split 2log 2sqrt 2std 2obv 2atr 2beat_eps_last 1beat_revenue_last 1beat_streak 1eps_growth_yoy 1eps_surprise_pct 1last_earnings_move 1cut_last 1days_to_ex_div 1div_yield_ttm 1raised_last 1years_of_growth 1doji 1engulfing_bear 1engulfing_bull 1evening_star 1hammer 1marubozu 1morning_star 1shooting_star 1bbupper 1macdhist 1days_to_split 1last_split_ratio 1reverse_split_last 1median 1percentrank 1swinghigh 1swinglow 1macd 1macdsignal 1stochd 1stochk 1diminus 1diplus 1linreg 1highest 1zscore 1days_to_earnings 1greatest 1hl2 1hlc3 1least 1ohlc4 1tr 1rec 1rma 1
Examples 11–20 of 20 · page 2 of 2
Data vendor / platform · example 11
QA: diff an in-house indicator feed against Ora for JPM
Daily QA job: compute a handful of indicators in-house and compare with Ora's exact rules; email on any mismatch.
- StateJPM
- Questions5 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"JPM"} The server fills in the latest completed session.
Questions
rsi | English → rule | Is the 14-day RSI above 50? |
macd | English → rule | Is the MACD line above its signal line? |
bb | English → rule | Is the stock above the middle Bollinger Band? |
stoch | English → rule | Is stochastic %K above %D? |
obv | English → rule | Is on-balance volume higher than 20 sessions ago? |
Answers
| Question | Answer | Reading |
|---|---|---|
rsiIs the 14-day RSI above 50 compiled to rsi(C, 14) > 50 | 0.4703 | on the line (false) |
macdIs the MACD line above its signal line compiled to macd(C) > macdsignal(C) | 0.88 | true |
bbIs the stock above the middle Bollinger Band compiled to C > bbmid(C, 20) | 0.6851 | true |
stochIs stochastic %K above %D compiled to stochk(14, 3, 3) > stochd(14, 3, 3) | 0.8036 | true |
obvIs on-balance volume higher than 20 sessions ago compiled to obv() > ref(obv(), -20) | 0.9091 | true |
Actions
Rules on the answers decide what to send.
rsi >= 0→Emaildata-qa{
"subject": "Indicator QA JPM (2026-10-30)",
"text": "JPM: RSI over 50 47%, MACD over signal 88%, above mid band 69%, %K over %D 80%, OBV up over 20 sessions 91%. Compare with the in-house feed."
}What it means
For JPM on the session of 2026-10-30: True now: Is the MACD line above its signal line; Is the stock above the middle Bollinger Band; Is stochastic %K above %D; Is on-balance volume higher than 20 sessions ago. On the line: Is the 14-day RSI above 50. Fired: qa (Email → data-qa).
English questions return the rule they compiled to, so QA can see exactly which parameters the comparison used.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JPM"
},
"questions": {
"rsi": {
"type": "yes_no",
"instructions": "Is the 14-day RSI above 50?"
},
"macd": {
"type": "yes_no",
"instructions": "Is the MACD line above its signal line?"
},
"bb": {
"type": "yes_no",
"instructions": "Is the stock above the middle Bollinger Band?"
},
"stoch": {
"type": "yes_no",
"instructions": "Is stochastic %K above %D?"
},
"obv": {
"type": "yes_no",
"instructions": "Is on-balance volume higher than 20 sessions ago?"
}
},
"actions": [
{
"id": "qa",
"when": "rsi >= 0",
"do": "email",
"connection": "data-qa",
"subject": "Indicator QA {{symbol}} ({{as_of}})",
"message": "{{symbol}}: RSI over 50 {{rsi|pct}}, MACD over signal {{macd|pct}}, above mid band {{bb|pct}}, %K over %D {{stoch|pct}}, OBV up over 20 sessions {{obv|pct}}. Compare with the in-house feed."
}
],
"dry_run": true
}Response JSON (JPM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"rsi": {
"yes_no": 0.4703,
"rule": "rsi(C, 14) > 50",
"basis": "comparison"
},
"macd": {
"yes_no": 0.88,
"rule": "macd(C) > macdsignal(C)",
"basis": "comparison"
},
"bb": {
"yes_no": 0.6851,
"rule": "C > bbmid(C, 20)",
"basis": "comparison"
},
"stoch": {
"yes_no": 0.8036,
"rule": "stochk(14, 3, 3) > stochd(14, 3, 3)",
"basis": "comparison"
},
"obv": {
"yes_no": 0.9091,
"rule": "obv() > ref(obv(), -20)",
"basis": "pattern"
}
},
"context": {
"symbol": "JPM",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "qa",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "data-qa",
"preview": {
"subject": "Indicator QA JPM (2026-10-30)",
"text": "JPM: RSI over 50 47%, MACD over signal 88%, above mid band 69%, %K over %D 80%, OBV up over 20 sessions 91%. Compare with the in-house feed."
}
}
]
}Data vendor / platform · example 12
A trend-strength score input for energy names
Score trend strength from ADX, directional movement and stacked averages for an energy screen product.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XOM"} then CVX, COP, one request each. The server fills in the latest completed session.
Questions
adx | rule | adx(14) > 25Trending (ADX above 25) |
di | rule | diplus(14) > diminus(14)+DI above -DI: buyers in control |
stacked | rule | C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)Stacked averages: close > 20 EMA > 50 > 200 |
slope | rule | linreg(C, 50) > ref(linreg(C, 50), -10)50-day regression line higher than two weeks ago |
Answers
| Symbol | adxrule | dirule | stackedrule | sloperule |
|---|---|---|---|---|
XOM | 0.8859 | 0.9409 | 0.9436 | 0.9329 |
CVX | 0.9102 | 0.9374 | 0.9402 | 0.9276 |
COP | 0.9295 | 0.9317 | 0.9328 | 0.9079 |
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: Trending (ADX above 25): true for XOM, CVX, COP of 3. +DI above -DI: buyers in control: true for XOM, CVX, COP of 3. Stacked averages: close > 20 EMA > 50 > 200: true for XOM, CVX, COP of 3. 50-day regression line higher than two weeks ago: true for XOM, CVX, COP of 3.
The score is the count of true rules; clients get both the score and the answers so they can reweight.
Request JSON (XOM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XOM"
},
"questions": {
"adx": {
"type": "yes_no",
"ask": "adx(14) > 25"
},
"di": {
"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)"
},
"slope": {
"type": "yes_no",
"ask": "linreg(C, 50) > ref(linreg(C, 50), -10)"
}
}
}Response JSON (XOM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"adx": {
"yes_no": 0.8859,
"rule": "adx(14) > 25",
"basis": "rule"
},
"di": {
"yes_no": 0.9409,
"rule": "diplus(14) > diminus(14)",
"basis": "rule"
},
"stacked": {
"yes_no": 0.9436,
"rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"slope": {
"yes_no": 0.9329,
"rule": "linreg(C, 50) > ref(linreg(C, 50), -10)",
"basis": "rule"
}
},
"context": {
"symbol": "XOM",
"as_of": "2026-10-30"
}
}Data vendor / platform · example 13
Flow proxy for bond ETFs: OBV and volume trends in AGG, LQD, HYG
Use volume-based rules as a rough proxy for flows into bond funds.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AGG"} then LQD, HYG, one request each. The server fills in the latest completed session.
Questions
obv | rule | obv() > sma(obv(), 20)On-balance volume above its 20-day average |
vol | rule | V > avg(V, 20)Volume above its 20-day average |
up_vol | English → rule | Did the stock rise on above-average volume? |
trend | rule | C > sma(C, 50)Above the 50-day average |
Answers
| Symbol | obvrule | volrule | up_volrule | trendrule |
|---|---|---|---|---|
AGG | 0.9099 | 0.9329 | 0.81 | 0.8598 |
LQD | 0.9005 | 0.8408 | 0.5789 | 0.6552 |
HYG | 0.1675 | 0.7113 | 0.1673 | 0.1914 |
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: On-balance volume above its 20-day average: true for AGG, LQD of 3. Volume above its 20-day average: true for AGG, LQD, HYG of 3. Did the stock rise on above-average volume: true for AGG of 3. Above the 50-day average: true for AGG, LQD of 3.
Volume rules are a proxy, not real flow data; the product documentation says so plainly.
Request JSON (AGG; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AGG"
},
"questions": {
"obv": {
"type": "yes_no",
"ask": "obv() > sma(obv(), 20)"
},
"vol": {
"type": "yes_no",
"ask": "V > avg(V, 20)"
},
"up_vol": {
"type": "yes_no",
"instructions": "Did the stock rise on above-average volume?"
},
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
}
}
}Response JSON (AGG, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"obv": {
"yes_no": 0.9099,
"rule": "obv() > sma(obv(), 20)",
"basis": "rule"
},
"vol": {
"yes_no": 0.9329,
"rule": "V > avg(V, 20)",
"basis": "rule"
},
"up_vol": {
"yes_no": 0.81,
"rule": "(C > C[-1]) and (V > ref(avg(V, 20), -1))",
"basis": "pattern"
},
"trend": {
"yes_no": 0.8598,
"rule": "C > sma(C, 50)",
"basis": "rule"
}
},
"context": {
"symbol": "AGG",
"as_of": "2026-10-30"
}
}Data vendor / platform · example 14
Client Slack alerts for 52-week highs in mega caps
Post to a client's Slack channel when one of their tracked names makes a new 52-week closing high.
- State2 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"MSFT"} then COST, one request each. The server fills in the latest completed session.
Questions
high | English → rule | Did the stock make a new 52-week closing high? |
vol | rule | V > avg(V, 20)Volume above its 20-day average |
ext | English → rule | Is the stock more than 10% above its 200-day moving average? |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | highrule | volrule | extrule | drop5forecast | Fired |
|---|---|---|---|---|---|
MSFT | 0.1038 | 0.9105 | 0.9431 | 0.422 | none |
COST | 0.0614 | 0.9297 | 0.0813 | 0.319 | 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.
high >= 0.6→Slackclient-acme-alertsWhat it means
Session of 2026-10-30, 2 symbols: Did the stock make a new 52-week closing high: true for none of 2. Volume above its 20-day average: true for MSFT, COST of 2. Is the stock more than 10% above its 200-day moving average: true for MSFT of 2. Highest odds for “A 5% drawdown within a month”: MSFT at 42%. client_slack fired for none.
A client channel only hears about real highs; the extension flag adds context without a forecast.
Request JSON (MSFT; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"high": {
"type": "yes_no",
"instructions": "Did the stock make a new 52-week closing high?"
},
"vol": {
"type": "yes_no",
"ask": "V > avg(V, 20)"
},
"ext": {
"type": "yes_no",
"instructions": "Is the stock more than 10% above its 200-day moving average?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "client_slack",
"when": "high >= 0.6",
"do": "slack",
"connection": "client-acme-alerts",
"message": "{{symbol}} ({{as_of}}) closed at a new 52-week high. Above-average volume {{vol|pct}}; more than 10% over its 200-day {{ext|pct}}."
}
],
"dry_run": true
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"high": {
"yes_no": 0.1038,
"rule": "C > highest(C, 252)",
"basis": "pattern"
},
"vol": {
"yes_no": 0.9105,
"rule": "V > avg(V, 20)",
"basis": "rule"
},
"ext": {
"yes_no": 0.9431,
"rule": "C > sma(C, 200) * 1.1",
"basis": "comparison"
},
"drop5": {
"yes_no": 0.422
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "client_slack",
"fired": false,
"status": "skipped"
}
]
}Data vendor / platform · example 15
Mean-reversion signal dataset for consumer names
Deliver oversold signals with their trend context for a mean-reversion client.
- State3 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NKE"} then SBUX, MCD, one request each. The server fills in the latest completed session.
Questions
rsi2 | rule | rsi(C, 2) < 10Two-day RSI under 10 |
z | rule | zscore(C, 20) < -2Two deviations under the 20-day mean |
band | rule | C < bblower(C, 20, 2)Closed under the lower Bollinger band |
trend | English → rule | Is the stock above its 200-day moving average? |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Symbol | rsi2rule | zrule | bandrule | trendrule | up_weekforecast |
|---|---|---|---|---|---|
NKE | 0.0575 | 0.0561 | 0.0537 | 0.0537 | 0.598 |
SBUX | 0.1419 | 0.0657 | 0.0537 | 0.8058 | 0.504 |
MCD | 0.0575 | 0.056 | 0.0537 | 0.0657 | 0.522 |
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: Two-day RSI under 10: true for none of 3. Two deviations under the 20-day mean: true for none of 3. Closed under the lower Bollinger band: true for none of 3. Is the stock above its 200-day moving average: true for SBUX of 3. Highest odds for “Higher in a week”: NKE at 60%.
Oversold rules with the trend flag let clients choose between buying dips in uptrends only or in any trend.
Request JSON (NKE; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NKE"
},
"questions": {
"rsi2": {
"type": "yes_no",
"ask": "rsi(C, 2) < 10"
},
"z": {
"type": "yes_no",
"ask": "zscore(C, 20) < -2"
},
"band": {
"type": "yes_no",
"ask": "C < bblower(C, 20, 2)"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (NKE, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"rsi2": {
"yes_no": 0.0575,
"rule": "rsi(C, 2) < 10",
"basis": "rule"
},
"z": {
"yes_no": 0.0561,
"rule": "zscore(C, 20) < -2",
"basis": "rule"
},
"band": {
"yes_no": 0.0537,
"rule": "C < bblower(C, 20, 2)",
"basis": "rule"
},
"trend": {
"yes_no": 0.0537,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"up_week": {
"yes_no": 0.598
}
},
"context": {
"symbol": "NKE",
"as_of": "2026-10-30"
}
}Data vendor / platform · example 16
Realized volatility term proxy for GLD, SLV and USO
Ship short and long realized-volatility states for commodity funds, with the forecast for the next month.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"GLD"} then SLV, USO, one request each. The server fills in the latest completed session.
Questions
short_gt_long | English → rule | Is 5-day volatility higher than 20-day volatility? |
hv | rule | std(log(C / C[-1]), 60) * sqrt(252) > 0.2560-day realized volatility above 25% a year |
atr_up | rule | atr(14) > 1.2 * ref(atr(14), -10)ATR up 20% in two weeks |
hv_next | forecast | Will annualized volatility over the next 21 sessions exceed 30%? Next-month volatility above 30% |
Answers
| Symbol | short_gt_longrule | hvrule | atr_uprule | hv_nextforecast |
|---|---|---|---|---|
GLD | 0.9045 | 0.1074 | 0.0733 | 0.567 |
SLV | 0.7039 | 0.9463 | 0.0583 | 0.439 |
USO | 0.4049 | 0.946 | 0.0961 | 0.586 |
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: Is 5-day volatility higher than 20-day volatility: true for GLD, SLV of 3. 60-day realized volatility above 25% a year: true for SLV, USO of 3. ATR up 20% in two weeks: true for none of 3. Highest odds for “Next-month volatility above 30%”: USO at 59%.
Short-over-long volatility describes a rising regime; the forecast field is labeled as a probability in the schema.
Request JSON (GLD; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "GLD"
},
"questions": {
"short_gt_long": {
"type": "yes_no",
"instructions": "Is 5-day volatility higher than 20-day volatility?"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 60) * sqrt(252) > 0.25"
},
"atr_up": {
"type": "yes_no",
"ask": "atr(14) > 1.2 * ref(atr(14), -10)"
},
"hv_next": {
"type": "yes_no",
"instructions": "Will annualized volatility over the next 21 sessions exceed 30%?"
}
}
}Response JSON (GLD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"short_gt_long": {
"yes_no": 0.9045,
"rule": "std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19)",
"basis": "pattern"
},
"hv": {
"yes_no": 0.1074,
"rule": "std(log(C / C[-1]), 60) * sqrt(252) > 0.25",
"basis": "rule"
},
"atr_up": {
"yes_no": 0.0733,
"rule": "atr(14) > 1.2 * ref(atr(14), -10)",
"basis": "rule"
},
"hv_next": {
"yes_no": 0.567
}
},
"context": {
"symbol": "GLD",
"as_of": "2026-10-30"
}
}Data vendor / platform · example 17
Crypto ETF signals dataset: IBIT, ETHE and MSTR
Add crypto-linked vehicles to the signal feed with the same schema as equities.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"IBIT"} then ETHE, MSTR, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 50)Above the 50-day average |
rsi | rule | rsi(C, 14) > 50RSI above 50 |
atr | rule | atr_pct(14) > 3A typical day moves more than 3% |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Symbol | trendrule | rsirule | atrrule | drop10forecast |
|---|---|---|---|---|
IBIT | 0.1649 | 0.111 | 0.2365 | 0.566 |
ETHE | 0.1255 | 0.1207 | 0.9437 | 0.648 |
MSTR | 0.1883 | 0.1221 | 0.9463 | 0.777 |
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: Above the 50-day average: true for none of 3. RSI above 50: true for none of 3. A typical day moves more than 3%: true for ETHE, MSTR of 3. Highest odds for “A 10% drawdown within a month”: MSTR at 78%.
Same questions, same schema, different asset; clients do not need a separate integration for crypto vehicles.
Request JSON (IBIT; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "IBIT"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"rsi": {
"type": "yes_no",
"ask": "rsi(C, 14) > 50"
},
"atr": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
}
}Response JSON (IBIT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.1649,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"rsi": {
"yes_no": 0.111,
"rule": "rsi(C, 14) > 50",
"basis": "rule"
},
"atr": {
"yes_no": 0.2365,
"rule": "atr_pct(14) > 3",
"basis": "rule"
},
"drop10": {
"yes_no": 0.566
}
},
"context": {
"symbol": "IBIT",
"as_of": "2026-10-30"
}
}Data vendor / platform · example 18
Weekly coverage report email to the data team
Each Friday, email the data team a coverage check on flagship symbols, using facts that need the calendar and corporate actions.
- ScheduleFri at 16:50 ET
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then KO, SPY, one request each. The server fills in the latest completed session.
Questions
earn_known | rule | days_to_earnings < 99999a next earnings date is on the calendar |
div | rule | pays_dividend > 0.5Pays a dividend |
split_any | rule | days_since_split < 99999any split on record |
rsi | rule | rsi(C, 14) > 50RSI above 50 |
Answers
| Symbol | earn_knownrule | divrule | split_anyrule | rsirule | Fired |
|---|---|---|---|---|---|
AAPL | 0.9463 | 0.8591 | 0.9463 | 0.8179 | coverage |
KO | 0.50 | 0.8591 | 0.9463 | 0.8988 | coverage |
SPY | 0.50 | 0.8591 | 0.45 | 0.0919 | coverage |
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.
rsi >= 0→Emaildata-team{
"subject": "Coverage AAPL (2026-10-30)",
"text": "AAPL: next earnings date known 95%, pays a dividend 86%, split on record 95%."
}{
"subject": "Coverage KO (2026-10-30)",
"text": "KO: next earnings date known 50%, pays a dividend 86%, split on record 95%."
}{
"subject": "Coverage SPY (2026-10-30)",
"text": "SPY: next earnings date known 50%, pays a dividend 86%, split on record 45%."
}What it means
Session of 2026-10-30, 3 symbols: a next earnings date is on the calendar: true for AAPL of 3. Pays a dividend: true for AAPL, KO, SPY of 3. any split on record: true for AAPL, KO of 3. RSI above 50: true for AAPL, KO of 3. coverage fired for AAPL, KO, SPY.
A fact that answers one half means not known; for an ETF like SPY the earnings check is expected to be unknown, not a gap in data.
As a scheduled workflow (Fri at 16:50 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 coverage report email to the data team",
"symbols": "AAPL KO SPY",
"days": [
5
],
"at_time": "16:50",
"model": "ora-fin-0.1.1",
"questions": {
"earn_known": {
"type": "yes_no",
"ask": "days_to_earnings < 99999"
},
"div": {
"type": "yes_no",
"ask": "pays_dividend > 0.5"
},
"split_any": {
"type": "yes_no",
"ask": "days_since_split < 99999"
},
"rsi": {
"type": "yes_no",
"ask": "rsi(C, 14) > 50"
}
},
"actions": [
{
"id": "coverage",
"when": "rsi >= 0",
"do": "email",
"connection": "data-team",
"subject": "Coverage {{symbol}} ({{as_of}})",
"message": "{{symbol}}: next earnings date known {{earn_known|pct}}, pays a dividend {{div|pct}}, split on record {{split_any|pct}}."
}
]
}Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"earn_known": {
"type": "yes_no",
"ask": "days_to_earnings < 99999"
},
"div": {
"type": "yes_no",
"ask": "pays_dividend > 0.5"
},
"split_any": {
"type": "yes_no",
"ask": "days_since_split < 99999"
},
"rsi": {
"type": "yes_no",
"ask": "rsi(C, 14) > 50"
}
},
"actions": [
{
"id": "coverage",
"when": "rsi >= 0",
"do": "email",
"connection": "data-team",
"subject": "Coverage {{symbol}} ({{as_of}})",
"message": "{{symbol}}: next earnings date known {{earn_known|pct}}, pays a dividend {{div|pct}}, split on record {{split_any|pct}}."
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"earn_known": {
"yes_no": 0.9463,
"rule": "days_to_earnings < 99999",
"basis": "rule"
},
"div": {
"yes_no": 0.8591,
"rule": "pays_dividend > 0.5",
"basis": "rule"
},
"split_any": {
"yes_no": 0.9463,
"rule": "days_since_split < 99999",
"basis": "rule"
},
"rsi": {
"yes_no": 0.8179,
"rule": "rsi(C, 14) > 50",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "coverage",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "data-team",
"preview": {
"subject": "Coverage AAPL (2026-10-30)",
"text": "AAPL: next earnings date known 95%, pays a dividend 86%, split on record 95%."
}
}
]
}Data vendor / platform · example 19
Bar-shape features for TQQQ: wicks, bodies and true range
Deliver bar-shape features derived from OHLC for clients building their own pattern models.
- StateTQQQ
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TQQQ"} The server fills in the latest completed session.
Questions
lower_wick | rule | least(O, C) - L > 2 * abs(C - O)lower wick over twice the body |
upper_wick | rule | H - greatest(O, C) > 2 * abs(C - O)upper wick over twice the body |
wide | rule | tr() > 1.5 * ref(atr(14), -1)true range over 1.5 times yesterday's ATR |
upper_half | rule | C > hl2()closed in the upper half of the range |
typical | rule | hlc3() > ohlc4()typical price above the four-price average |
Answers
| Question | Answer | Reading |
|---|---|---|
lower_wicklower wick over twice the body | 0.1612 | false |
upper_wickupper wick over twice the body | 0.0804 | false |
widetrue range over 1.5 times yesterday's ATR | 0.9416 | true |
upper_halfclosed in the upper half of the range | 0.3885 | false |
typicaltypical price above the four-price average | 0.0794 | false |
What it means
For TQQQ on the session of 2026-10-30: True now: true range over 1.5 times yesterday's ATR. Not true: lower wick over twice the body; upper wick over twice the body; closed in the upper half of the range; typical price above the four-price average.
These are pure arithmetic on the bar, delivered as exact flags; clients combine them as they like.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TQQQ"
},
"questions": {
"lower_wick": {
"type": "yes_no",
"ask": "least(O, C) - L > 2 * abs(C - O)"
},
"upper_wick": {
"type": "yes_no",
"ask": "H - greatest(O, C) > 2 * abs(C - O)"
},
"wide": {
"type": "yes_no",
"ask": "tr() > 1.5 * ref(atr(14), -1)"
},
"upper_half": {
"type": "yes_no",
"ask": "C > hl2()"
},
"typical": {
"type": "yes_no",
"ask": "hlc3() > ohlc4()"
}
}
}Response JSON (TQQQ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"lower_wick": {
"yes_no": 0.1612,
"rule": "least(O, C) - L > 2 * abs(C - O)",
"basis": "rule"
},
"upper_wick": {
"yes_no": 0.0804,
"rule": "H - greatest(O, C) > 2 * abs(C - O)",
"basis": "rule"
},
"wide": {
"yes_no": 0.9416,
"rule": "tr() > 1.5 * ref(atr(14), -1)",
"basis": "rule"
},
"upper_half": {
"yes_no": 0.3885,
"rule": "C > hl2()",
"basis": "rule"
},
"typical": {
"yes_no": 0.0794,
"rule": "hlc3() > ohlc4()",
"basis": "rule"
}
},
"context": {
"symbol": "TQQQ",
"as_of": "2026-10-30"
}
}Data vendor / platform · example 20
Recursive filter signal for EEM with rec()
Offer a custom adaptive-filter signal built with rec(), compared with the standard EMA, for an emerging-markets client.
- StateEEM
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"EEM"} The server fills in the latest completed session.
Questions
rec | rule | C > rec(C, self + 0.2 * (C - self))close above a recursive filter with alpha one fifth |
ema | rule | C > ema(C, 9)close above the 9-day EMA |
rma | rule | rma(C, 14) > ref(rma(C, 14), -5)14-day Wilder average rising over a week |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
recclose above a recursive filter with alpha one fifth | 0.083 | false |
emaclose above the 9-day EMA | 0.083 | false |
rma14-day Wilder average rising over a week | 0.081 | false |
up_weekHigher in a week | 0.55 | 55% · close to even |
What it means
For EEM on the session of 2026-10-30: Not true: close above a recursive filter with alpha one fifth; close above the 9-day EMA; 14-day Wilder average rising over a week. Forecasts: Higher in a week 55%.
A filter with alpha one fifth matches a 9-day EMA; agreement between the two is a built-in check on the custom signal.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "EEM"
},
"questions": {
"rec": {
"type": "yes_no",
"ask": "C > rec(C, self + 0.2 * (C - self))"
},
"ema": {
"type": "yes_no",
"ask": "C > ema(C, 9)"
},
"rma": {
"type": "yes_no",
"ask": "rma(C, 14) > ref(rma(C, 14), -5)"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (EEM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"rec": {
"yes_no": 0.083,
"rule": "C > rec(C, self + 0.2 * (C - self))",
"basis": "rule"
},
"ema": {
"yes_no": 0.083,
"rule": "C > ema(C, 9)",
"basis": "rule"
},
"rma": {
"yes_no": 0.081,
"rule": "rma(C, 14) > ref(rma(C, 14), -5)",
"basis": "rule"
},
"up_week": {
"yes_no": 0.55
}
},
"context": {
"symbol": "EEM",
"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 Builders: Quant developer, Fintech app builder, Robo-advisor, Broker app, Algo / bot developer, Trading educator / newsletter.