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

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 (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.

ora-fin-0.1.1JPM5 questions1 action
  1. StateJPM
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

rsiEnglish → ruleIs the 14-day RSI above 50?
macdEnglish → ruleIs the MACD line above its signal line?
bbEnglish → ruleIs the stock above the middle Bollinger Band?
stochEnglish → ruleIs stochastic %K above %D?
obvEnglish → ruleIs on-balance volume higher than 20 sessions ago?

Answers

QuestionAnswerReading
rsi
Is the 14-day RSI above 50
compiled to rsi(C, 14) > 50
0.4703on the line (false)
macd
Is the MACD line above its signal line
compiled to macd(C) > macdsignal(C)
0.88true
bb
Is the stock above the middle Bollinger Band
compiled to C > bbmid(C, 20)
0.6851true
stoch
Is stochastic %K above %D
compiled to stochk(14, 3, 3) > stochd(14, 3, 3)
0.8036true
obv
Is on-balance volume higher than 20 sessions ago
compiled to obv() > ref(obv(), -20)
0.9091true

Actions

Rules on the answers decide what to send.

rsi >= 0→Emaildata-qa
What each action would send 1 of 1 fired · dry run, nothing sent
qawould send (dry run)Email → data-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."
      }
    }
  ]
}

bbmid macd macdsignal obv ref rsi stochd stochk

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.

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

State

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

Questions

adxruleadx(14) > 25
Trending (ADX above 25)
dirulediplus(14) > diminus(14)
+DI above -DI: buyers in control
stackedruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
sloperulelinreg(C, 50) > ref(linreg(C, 50), -10)
50-day regression line higher than two weeks ago

Answers

Symboladxruledirulestackedrulesloperule
XOM0.88590.94090.94360.9329
CVX0.91020.93740.94020.9276
COP0.92950.93170.93280.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"
  }
}

adx diminus diplus ema linreg ref sma

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.

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

State

{"symbol":"AGG"} then LQD, HYG, one request each. The server fills in the latest completed session.

Questions

obvruleobv() > sma(obv(), 20)
On-balance volume above its 20-day average
volruleV > avg(V, 20)
Volume above its 20-day average
up_volEnglish → ruleDid the stock rise on above-average volume?
trendruleC > sma(C, 50)
Above the 50-day average

Answers

Symbolobvrulevolruleup_volruletrendrule
AGG0.90990.93290.810.8598
LQD0.90050.84080.57890.6552
HYG0.16750.71130.16730.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"
  }
}

avg obv offset ref sma

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.

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

State

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

Questions

highEnglish → ruleDid the stock make a new 52-week closing high?
volruleV > avg(V, 20)
Volume above its 20-day average
extEnglish → ruleIs the stock more than 10% above its 200-day moving average?
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symbolhighrulevolruleextruledrop5forecastFired
MSFT0.10380.91050.94310.422none
COST0.06140.92970.08130.319none

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-alerts
MSFT 0 of 1 fired · dry run, nothing sent
COST 0 of 1 fired · dry run, nothing sent

What 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"
    }
  ]
}

avg highest sma

Data vendor / platform · example 15

Mean-reversion signal dataset for consumer names

Deliver oversold signals with their trend context for a mean-reversion client.

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

State

{"symbol":"NKE"} then SBUX, MCD, one request each. The server fills in the latest completed session.

Questions

rsi2rulersi(C, 2) < 10
Two-day RSI under 10
zrulezscore(C, 20) < -2
Two deviations under the 20-day mean
bandruleC < bblower(C, 20, 2)
Closed under the lower Bollinger band
trendEnglish → ruleIs the stock above its 200-day moving average?
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

Symbolrsi2rulezrulebandruletrendruleup_weekforecast
NKE0.05750.05610.05370.05370.598
SBUX0.14190.06570.05370.80580.504
MCD0.05750.0560.05370.06570.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"
  }
}

bblower rsi sma zscore

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.

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

State

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

Questions

short_gt_longEnglish → ruleIs 5-day volatility higher than 20-day volatility?
hvrulestd(log(C / C[-1]), 60) * sqrt(252) > 0.25
60-day realized volatility above 25% a year
atr_upruleatr(14) > 1.2 * ref(atr(14), -10)
ATR up 20% in two weeks
hv_nextforecastWill annualized volatility over the next 21 sessions exceed 30%?
Next-month volatility above 30%

Answers

Symbolshort_gt_longrulehvruleatr_uprulehv_nextforecast
GLD0.90450.10740.07330.567
SLV0.70390.94630.05830.439
USO0.40490.9460.09610.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"
  }
}

atr log offset ref sqrt std

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.

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

State

{"symbol":"IBIT"} then ETHE, MSTR, one request each. The server fills in the latest completed session.

Questions

trendruleC > sma(C, 50)
Above the 50-day average
rsirulersi(C, 14) > 50
RSI above 50
atrruleatr_pct(14) > 3
A typical day moves more than 3%
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

Symboltrendrulersiruleatrruledrop10forecast
IBIT0.16490.1110.23650.566
ETHE0.12550.12070.94370.648
MSTR0.18830.12210.94630.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"
  }
}

atr_pct rsi sma

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.

ora-fin-0.1.13 symbols, one request each4 questions1 actionworkflow · Fri at 16:50 ET
  1. ScheduleFri at 16:50 ET
  2. State3 symbols
  3. Questions4 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

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

Questions

earn_knownruledays_to_earnings < 99999
a next earnings date is on the calendar
divrulepays_dividend > 0.5
Pays a dividend
split_anyruledays_since_split < 99999
any split on record
rsirulersi(C, 14) > 50
RSI above 50

Answers

Symbolearn_knownruledivrulesplit_anyrulersiruleFired
AAPL0.94630.85910.94630.8179coverage
KO0.500.85910.94630.8988coverage
SPY0.500.85910.450.0919coverage

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
AAPL 1 of 1 fired · dry run, nothing sent
coveragewould send (dry run)Email → data-team
{
  "subject": "Coverage AAPL (2026-10-30)",
  "text": "AAPL: next earnings date known 95%, pays a dividend 86%, split on record 95%."
}
KO 1 of 1 fired · dry run, nothing sent
coveragewould send (dry run)Email → data-team
{
  "subject": "Coverage KO (2026-10-30)",
  "text": "KO: next earnings date known 50%, pays a dividend 86%, split on record 95%."
}
SPY 1 of 1 fired · dry run, nothing sent
coveragewould send (dry run)Email → data-team
{
  "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%."
      }
    }
  ]
}

days_since_split days_to_earnings pays_dividend rsi

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.

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

State

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

Questions

lower_wickruleleast(O, C) - L > 2 * abs(C - O)
lower wick over twice the body
upper_wickruleH - greatest(O, C) > 2 * abs(C - O)
upper wick over twice the body
wideruletr() > 1.5 * ref(atr(14), -1)
true range over 1.5 times yesterday's ATR
upper_halfruleC > hl2()
closed in the upper half of the range
typicalrulehlc3() > ohlc4()
typical price above the four-price average

Answers

QuestionAnswerReading
lower_wick
lower wick over twice the body
0.1612false
upper_wick
upper wick over twice the body
0.0804false
wide
true range over 1.5 times yesterday's ATR
0.9416true
upper_half
closed in the upper half of the range
0.3885false
typical
typical price above the four-price average
0.0794false

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"
  }
}

abs atr greatest hl2 hlc3 least ohlc4 ref tr

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.

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

State

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

Questions

recruleC > rec(C, self + 0.2 * (C - self))
close above a recursive filter with alpha one fifth
emaruleC > ema(C, 9)
close above the 9-day EMA
rmarulerma(C, 14) > ref(rma(C, 14), -5)
14-day Wilder average rising over a week
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
rec
close above a recursive filter with alpha one fifth
0.083false
ema
close above the 9-day EMA
0.083false
rma
14-day Wilder average rising over a week
0.081false
up_week
Higher in a week
0.5555% · 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"
  }
}

ema rec ref rma

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.

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