Use cases · Buy side
Quant researcher: 21 ways to use Ora
Signal ideas as exact rules, compared with forecasts, across a universe and over time. Each example is a complete, runnable request with the real answers it returned (42 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 (83)
sma 7offset 5rsi 4ref 3roc 2ema 2zscore 2highest 2abs 2log 2sum 2bblower 2bbupper 2crossup 2linreg 1rec 1adx 1barssince 1diminus 1diplus 1avg 1median 1obv 1percentrank 1doji 1engulfing_bear 1engulfing_bull 1evening_star 1hammer 1harami_bear 1harami_bull 1marubozu 1morning_star 1shooting_star 1dark_cloud 1dragonfly_doji 1gravestone_doji 1hanging_man 1inverted_hammer 1piercing_line 1spinning_top 1three_black_crows 1three_white_soldiers 1tweezer_bottom 1greatest 1hl2 1hlc3 1least 1ohlc4 1tweezer_top 1between 1iif 1atr_pct 1sqrt 1std 1beat_streak 1eps_surprise_pct 1last_earnings_gap 1pre_earnings_close 1revenue_surprise_pct 1div_change_pct 1div_count_ttm 1div_yield_ttm 1years_of_growth 1bbmid 1cum 1sign 1swinghigh 1swinglow 1cci 1stochd 1stochk 1willr 1rma 1wma 1highestbars 1days_since_earnings 1days_since_split 1days_to_earnings 1days_to_split 1last_earnings_move 1reverse_split_last 1lowestbars 1
Examples 11–20 of 21 · page 2 of 3
Quant researcher · example 11
Earnings surprise as a factor across five names
Collect surprise, streak and reaction facts across a small universe as inputs to a post-earnings factor.
- State5 symbols
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} then NVDA, COST, JPM, NKE, one request each. The server fills in the latest completed session.
Questions
surprise5 | rule | eps_surprise_pct > 5EPS beat by more than 5% |
rev_surp | rule | revenue_surprise_pct > 1Revenue beat by more than 1% |
streak | rule | beat_streak >= 3Beat EPS three or more quarters in a row |
gap | rule | last_earnings_gap > 0Gapped up after the last report |
above_pre | rule | C > pre_earnings_closeHolding above the pre-earnings close |
beat_next | forecast | Will the stock beat earnings next quarter? Beating earnings next quarter |
Answers
| Symbol | surprise5rule | rev_surprule | streakrule | gaprule | above_prerule | beat_nextforecast |
|---|---|---|---|---|---|---|
AAPL | 0.9463 | 0.0537 | 0.9463 | 0.0537 | 0.831 | 0.545 |
NVDA | 0.9463 | 0.9463 | 0.9463 | 0.9463 | 0.2141 | 0.516 |
COST | 0.0537 | 0.0537 | 0.0683 | 0.0537 | 0.9463 | 0.481 |
JPM | 0.0844 | 0.0537 | 0.0537 | 0.9463 | 0.6505 | 0.506 |
NKE | 0.9463 | 0.0537 | 0.9463 | 0.0537 | 0.924 | 0.567 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 5 symbols: EPS beat by more than 5%: true for AAPL, NVDA, NKE of 5. Revenue beat by more than 1%: true for NVDA of 5. Beat EPS three or more quarters in a row: true for AAPL, NVDA, NKE of 5. Gapped up after the last report: true for NVDA, JPM of 5. Highest odds for “Beating earnings next quarter”: NKE at 57%.
Facts are point in time (they count only from the reaction session), so they are safe features; the beat-next forecast is the target to compare against.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"surprise5": {
"type": "yes_no",
"ask": "eps_surprise_pct > 5"
},
"rev_surp": {
"type": "yes_no",
"ask": "revenue_surprise_pct > 1"
},
"streak": {
"type": "yes_no",
"ask": "beat_streak >= 3"
},
"gap": {
"type": "yes_no",
"ask": "last_earnings_gap > 0"
},
"above_pre": {
"type": "yes_no",
"ask": "C > pre_earnings_close"
},
"beat_next": {
"type": "yes_no",
"instructions": "Will the stock beat earnings next quarter?"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"surprise5": {
"yes_no": 0.9463,
"rule": "eps_surprise_pct > 5",
"basis": "rule"
},
"rev_surp": {
"yes_no": 0.0537,
"rule": "revenue_surprise_pct > 1",
"basis": "rule"
},
"streak": {
"yes_no": 0.9463,
"rule": "beat_streak >= 3",
"basis": "rule"
},
"gap": {
"yes_no": 0.0537,
"rule": "last_earnings_gap > 0",
"basis": "rule"
},
"above_pre": {
"yes_no": 0.831,
"rule": "C > pre_earnings_close",
"basis": "rule"
},
"beat_next": {
"yes_no": 0.545
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}beat_streak eps_surprise_pct last_earnings_gap pre_earnings_close revenue_surprise_pct
Quant researcher · example 12
Dividend factor features for a yield study
Yield, growth record and payout changes for income stocks, as inputs to a dividend-growth factor.
- State5 symbols
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"KO"} then PEP, PG, MO, VZ, one request each. The server fills in the latest completed session.
Questions
yield | rule | div_yield_ttm > 3Trailing yield above 3% |
growth | rule | years_of_growth >= 10Ten or more years of dividend growth |
change | rule | div_change_pct > 3Last payment raised more than 3% |
count | rule | div_count_ttm >= 4Pays at least quarterly |
trend | English → rule | Is the stock 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 | yieldrule | growthrule | changerule | countrule | trendrule | drop5forecast |
|---|---|---|---|---|---|---|
KO | 0.0537 | 0.9463 | 0.2223 | 0.55 | 0.9463 | 0.361 |
PEP | 0.9463 | 0.9463 | 0.2223 | 0.55 | 0.1034 | 0.418 |
PG | 0.2091 | 0.9463 | 0.2223 | 0.55 | 0.9431 | 0.357 |
MO | 0.9463 | 0.9463 | 0.9463 | 0.55 | 0.9463 | 0.543 |
VZ | 0.9463 | 0.9463 | 0.2223 | 0.55 | 0.3448 | 0.421 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 5 symbols: Trailing yield above 3%: true for PEP, MO, VZ of 5. Ten or more years of dividend growth: true for KO, PEP, PG, MO, VZ of 5. Last payment raised more than 3%: true for MO of 5. Pays at least quarterly: true for none of 5. Highest odds for “A 5% drawdown within a month”: MO at 54%.
Dividend facts are split-adjusted and point in time; pair them with the drawdown forecast to study income with lower risk.
Request JSON (KO; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "KO"
},
"questions": {
"yield": {
"type": "yes_no",
"ask": "div_yield_ttm > 3"
},
"growth": {
"type": "yes_no",
"ask": "years_of_growth >= 10"
},
"change": {
"type": "yes_no",
"ask": "div_change_pct > 3"
},
"count": {
"type": "yes_no",
"ask": "div_count_ttm >= 4"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
}
}Response JSON (KO, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"yield": {
"yes_no": 0.0537,
"rule": "div_yield_ttm > 3",
"basis": "rule"
},
"growth": {
"yes_no": 0.9463,
"rule": "years_of_growth >= 10",
"basis": "rule"
},
"change": {
"yes_no": 0.2223,
"rule": "div_change_pct > 3",
"basis": "rule"
},
"count": {
"yes_no": 0.55,
"rule": "div_count_ttm >= 4",
"basis": "rule"
},
"trend": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"drop5": {
"yes_no": 0.361
}
},
"context": {
"symbol": "KO",
"as_of": "2026-10-30"
}
}div_change_pct div_count_ttm div_yield_ttm sma years_of_growth
Quant researcher · example 13
Nightly signal snapshot to the research warehouse
After each close, record a fixed signal set for a test universe and post it to the research database for later labelling.
- ScheduleMon–Fri at 17:30 ET
- State5 symbols
- Questions6 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"SPY"} then QQQ, IWM, TLT, GLD, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 200)Above the 200-day |
mom | rule | roc(C, 20) > 0Positive 20-day momentum |
os | rule | rsi(C, 2) < 10Two-day RSI under 10 |
squeeze | rule | (bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06Bollinger bands narrower than 6% of price |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | trendrule | momrule | osrule | squeezerule | up_weekforecast | drop5forecast | Fired |
|---|---|---|---|---|---|---|---|
SPY | 0.9451 | 0.1458 | 0.5164 | 0.899 | 0.598 | 0.203 | snapshot |
QQQ | 0.7987 | 0.0632 | 0.5356 | 0.0789 | 0.561 | 0.443 | snapshot |
IWM | 0.5564 | 0.3495 | 0.1938 | 0.8386 | 0.526 | 0.234 | snapshot |
TLT | 0.1127 | 0.934 | 0.0663 | 0.1371 | 0.561 | 0.164 | snapshot |
GLD | 0.0537 | 0.1553 | 0.594 | 0.278 | 0.566 | 0.435 | snapshot |
true false not known for rules; forecasts are odds. Hover a column for its question.
Actions
Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.
trend >= 0→Webhookresearch-warehouse{
"table": "signal_snapshots",
"symbol": "SPY",
"as_of": "2026-10-30",
"trend": 0.9451,
"mom": 0.1458,
"os": 0.5164,
"squeeze": 0.899,
"f_up_week": 0.598,
"f_drop5": 0.203
}{
"table": "signal_snapshots",
"symbol": "QQQ",
"as_of": "2026-10-30",
"trend": 0.7987,
"mom": 0.0632,
"os": 0.5356,
"squeeze": 0.0789,
"f_up_week": 0.561,
"f_drop5": 0.443
}{
"table": "signal_snapshots",
"symbol": "IWM",
"as_of": "2026-10-30",
"trend": 0.5564,
"mom": 0.3495,
"os": 0.1938,
"squeeze": 0.8386,
"f_up_week": 0.526,
"f_drop5": 0.234
}{
"table": "signal_snapshots",
"symbol": "TLT",
"as_of": "2026-10-30",
"trend": 0.1127,
"mom": 0.934,
"os": 0.0663,
"squeeze": 0.1371,
"f_up_week": 0.561,
"f_drop5": 0.164
}{
"table": "signal_snapshots",
"symbol": "GLD",
"as_of": "2026-10-30",
"trend": 0.0537,
"mom": 0.1553,
"os": 0.594,
"squeeze": 0.278,
"f_up_week": 0.566,
"f_drop5": 0.435
}What it means
Session of 2026-10-30, 5 symbols: Above the 200-day: true for SPY, QQQ of 5. Positive 20-day momentum: true for TLT of 5. Two-day RSI under 10: true for none of 5. Bollinger bands narrower than 6% of price: true for SPY, IWM of 5. Highest odds for “Higher in a week”: SPY at 60%. snapshot fired for SPY, QQQ, IWM, TLT, GLD.
Storing rules and forecasts each night builds an out-of-sample record; labels come later from the realized prices.
As a scheduled workflow (Mon–Fri at 17:30 ET)
Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.
{
"name": "Nightly signal snapshot to the research warehouse",
"symbols": "SPY QQQ IWM TLT GLD",
"days": [
1,
2,
3,
4,
5
],
"at_time": "17:30",
"model": "ora-fin-0.1.1",
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 200)"
},
"mom": {
"type": "yes_no",
"ask": "roc(C, 20) > 0"
},
"os": {
"type": "yes_no",
"ask": "rsi(C, 2) < 10"
},
"squeeze": {
"type": "yes_no",
"ask": "(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "snapshot",
"when": "trend >= 0",
"do": "webhook",
"connection": "research-warehouse",
"body": {
"table": "signal_snapshots",
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"trend": "{{trend}}",
"mom": "{{mom}}",
"os": "{{os}}",
"squeeze": "{{squeeze}}",
"f_up_week": "{{up_week}}",
"f_drop5": "{{drop5}}"
}
}
]
}Request JSON (SPY; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 200)"
},
"mom": {
"type": "yes_no",
"ask": "roc(C, 20) > 0"
},
"os": {
"type": "yes_no",
"ask": "rsi(C, 2) < 10"
},
"squeeze": {
"type": "yes_no",
"ask": "(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "snapshot",
"when": "trend >= 0",
"do": "webhook",
"connection": "research-warehouse",
"body": {
"table": "signal_snapshots",
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"trend": "{{trend}}",
"mom": "{{mom}}",
"os": "{{os}}",
"squeeze": "{{squeeze}}",
"f_up_week": "{{up_week}}",
"f_drop5": "{{drop5}}"
}
}
],
"dry_run": true
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9451,
"rule": "C > sma(C, 200)",
"basis": "rule"
},
"mom": {
"yes_no": 0.1458,
"rule": "roc(C, 20) > 0",
"basis": "rule"
},
"os": {
"yes_no": 0.5164,
"rule": "rsi(C, 2) < 10",
"basis": "rule"
},
"squeeze": {
"yes_no": 0.899,
"rule": "(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06",
"basis": "rule"
},
"up_week": {
"yes_no": 0.598
},
"drop5": {
"yes_no": 0.203
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "snapshot",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "research-warehouse",
"preview": {
"body": {
"table": "signal_snapshots",
"symbol": "SPY",
"as_of": "2026-10-30",
"trend": 0.9451,
"mom": 0.1458,
"os": 0.5164,
"squeeze": 0.899,
"f_up_week": 0.598,
"f_drop5": 0.203
}
}
}
]
}Quant researcher · example 14
Mean-reversion entry: z-score and Bollinger %B on KO
Test whether two definitions of stretched-below-average fire on the same day on a low-volatility stock.
- StateKO
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"KO"} The server fills in the latest completed session.
Questions
z | rule | zscore(C, 20) < -2Two deviations under the 20-day mean |
pctb | English → rule | Is Bollinger %B below 0.2? |
below_band | rule | C < bblower(C, 20, 2)Closed under the lower Bollinger band |
back_inside | rule | crossup(C, bblower(C, 20, 2))Crossed back above the lower band |
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 |
|---|---|---|
zTwo deviations under the 20-day mean | 0.0585 | false |
pctbIs Bollinger %B below 0.2 compiled to (C - bblower(C, 20)) / (bbupper(C, 20) - bblower(C, 20)) < 0.2 | 0.074 | false |
below_bandClosed under the lower Bollinger band | 0.0568 | false |
back_insideCrossed back above the lower band | 0.05 | false |
rally5A 5% rally within a month | 0.381 | 38% · unlikely |
What it means
For KO on the session of 2026-10-30: Not true: Two deviations under the 20-day mean; Is Bollinger %B below 0.2; Closed under the lower Bollinger band; Crossed back above the lower band. Forecasts: A 5% rally within a month 38%.
When definitions disagree the signal is fragile; a study should pick one and test it, not combine them after the fact.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "KO"
},
"questions": {
"z": {
"type": "yes_no",
"ask": "zscore(C, 20) < -2"
},
"pctb": {
"type": "yes_no",
"instructions": "Is Bollinger %B below 0.2?"
},
"below_band": {
"type": "yes_no",
"ask": "C < bblower(C, 20, 2)"
},
"back_inside": {
"type": "yes_no",
"ask": "crossup(C, bblower(C, 20, 2))"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
}
}Response JSON (KO, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"z": {
"yes_no": 0.0585,
"rule": "zscore(C, 20) < -2",
"basis": "rule"
},
"pctb": {
"yes_no": 0.074,
"rule": "(C - bblower(C, 20)) / (bbupper(C, 20) - bblower(C, 20)) < 0.2",
"basis": "pattern"
},
"below_band": {
"yes_no": 0.0568,
"rule": "C < bblower(C, 20, 2)",
"basis": "rule"
},
"back_inside": {
"yes_no": 0.05,
"rule": "crossup(C, bblower(C, 20, 2))",
"basis": "rule"
},
"rally5": {
"yes_no": 0.381
}
},
"context": {
"symbol": "KO",
"as_of": "2026-10-30"
}
}Quant researcher · example 15
Long-horizon up/down ratio with cum() on SPY and TLT
Compare full-history up-day counts with recent up-day counts as a crude persistence measure.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} then TLT, one request each. The server fills in the latest completed session.
Questions
cum_ratio | rule | cum(C > C[-1]) > cum(C < C[-1])More up days than down days over the whole history |
recent | rule | sum(C > C[-1], 20) > 10More than 10 up days of the last 20 |
sign_sum | rule | sum(sign(C - C[-1]), 20) > 0Net up days over 20 sessions positive |
mostly_up | rule | sum(C > C[-1], 10) >= 6Up on at least six of the last ten days |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Symbol | cum_ratiorule | recentrule | sign_sumrule | mostly_uprule | up_weekforecast |
|---|---|---|---|---|---|
SPY | 0.9463 | 0.45 | 0.45 | 0.55 | 0.598 |
TLT | 0.0537 | 0.9414 | 0.9414 | 0.55 | 0.561 |
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: More up days than down days over the whole history: true for SPY of 2. More than 10 up days of the last 20: true for TLT of 2. Net up days over 20 sessions positive: true for TLT of 2. Up on at least six of the last ten days: true for none of 2. Highest odds for “Higher in a week”: SPY at 60%.
Full-history counts change slowly; the recent counts are the moving part, and comparing them shows whether a series is acting out of character.
Request JSON (SPY; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"cum_ratio": {
"type": "yes_no",
"ask": "cum(C > C[-1]) > cum(C < C[-1])"
},
"recent": {
"type": "yes_no",
"ask": "sum(C > C[-1], 20) > 10"
},
"sign_sum": {
"type": "yes_no",
"ask": "sum(sign(C - C[-1]), 20) > 0"
},
"mostly_up": {
"type": "yes_no",
"ask": "sum(C > C[-1], 10) >= 6"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"cum_ratio": {
"yes_no": 0.9463,
"rule": "cum(C > C[-1]) > cum(C < C[-1])",
"basis": "rule"
},
"recent": {
"yes_no": 0.45,
"rule": "sum(C > C[-1], 20) > 10",
"basis": "rule"
},
"sign_sum": {
"yes_no": 0.45,
"rule": "sum(sign(C - C[-1]), 20) > 0",
"basis": "rule"
},
"mostly_up": {
"yes_no": 0.55,
"rule": "sum(C > C[-1], 10) >= 6",
"basis": "rule"
},
"up_week": {
"yes_no": 0.598
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}Quant researcher · example 16
Swing structure features with k-indexed swing points
Encode market structure from the last three swing highs and lows on SPY, using the k argument of swinghigh and swinglow.
- StateSPY
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
hh | rule | swinghigh(5, 1) > swinghigh(5, 2)Latest swing high above the one before |
hh2 | rule | swinghigh(5, 2) > swinghigh(5, 3)Second swing high above the third |
hl | rule | swinglow(5, 1) > swinglow(5, 2)Latest swing low above the one before |
hl2 | rule | swinglow(5, 2) > swinglow(5, 3)Second swing low above the third |
above_sh | rule | C > swinghigh(5)Above its last confirmed swing high |
break_res | forecast | Will it break above resistance this week? Breaking resistance this week |
Answers
| Question | Answer | Reading |
|---|---|---|
hhLatest swing high above the one before | 0.833 | true |
hh2Second swing high above the third | 0.6229 | true |
hlLatest swing low above the one before | 0.8195 | true |
hl2Second swing low above the third | 0.2302 | false |
above_shAbove its last confirmed swing high | 0.0546 | false |
break_resBreaking resistance this week | 0.482 | 48% · close to even |
What it means
For SPY on the session of 2026-10-30: True now: Latest swing high above the one before; Second swing high above the third; Latest swing low above the one before. Not true: Second swing low above the third; Above its last confirmed swing high. Forecasts: Breaking resistance this week 48%.
Swing points are confirmed five bars late, so these features never look ahead; two steps of higher highs and lows is a stricter trend definition.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"hh": {
"type": "yes_no",
"ask": "swinghigh(5, 1) > swinghigh(5, 2)"
},
"hh2": {
"type": "yes_no",
"ask": "swinghigh(5, 2) > swinghigh(5, 3)"
},
"hl": {
"type": "yes_no",
"ask": "swinglow(5, 1) > swinglow(5, 2)"
},
"hl2": {
"type": "yes_no",
"ask": "swinglow(5, 2) > swinglow(5, 3)"
},
"above_sh": {
"type": "yes_no",
"ask": "C > swinghigh(5)"
},
"break_res": {
"type": "yes_no",
"instructions": "Will it break above resistance this week?"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"hh": {
"yes_no": 0.833,
"rule": "swinghigh(5, 1) > swinghigh(5, 2)",
"basis": "rule"
},
"hh2": {
"yes_no": 0.6229,
"rule": "swinghigh(5, 2) > swinghigh(5, 3)",
"basis": "rule"
},
"hl": {
"yes_no": 0.8195,
"rule": "swinglow(5, 1) > swinglow(5, 2)",
"basis": "rule"
},
"hl2": {
"yes_no": 0.2302,
"rule": "swinglow(5, 2) > swinglow(5, 3)",
"basis": "rule"
},
"above_sh": {
"yes_no": 0.0546,
"rule": "C > swinghigh(5)",
"basis": "rule"
},
"break_res": {
"yes_no": 0.482
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}Quant researcher · example 17
Oscillator agreement: RSI, stochastic, CCI and Williams %R on HD
Measure how often four overbought definitions agree on the same day.
- StateHD
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"HD"} The server fills in the latest completed session.
Questions
rsi | rule | rsi(C, 14) > 70RSI over 70 |
stoch | rule | stochk(14) > 80 and stochk(14) > stochd(14)Stochastic %K over 80 and above %D |
cci | rule | cci(20) > 100CCI over 100 |
willr | rule | willr(14) > -20Williams %R above -20 |
down_week | forecast | Will the stock be lower in a week? Lower in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
rsiRSI over 70 | 0.392 | false |
stochStochastic %K over 80 and above %D | 0.6275 | true |
cciCCI over 100 | 0.6086 | true |
willrWilliams %R above -20 | 0.6317 | true |
down_weekLower in a week | 0.514 | 51% · close to even |
What it means
For HD on the session of 2026-10-30: True now: Stochastic %K over 80 and above %D; CCI over 100; Williams %R above -20. Not true: RSI over 70. Forecasts: Lower in a week 51%.
Oscillators are highly correlated; counting agreement shows how much independent information each adds before stacking them in a model.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "HD"
},
"questions": {
"rsi": {
"type": "yes_no",
"ask": "rsi(C, 14) > 70"
},
"stoch": {
"type": "yes_no",
"ask": "stochk(14) > 80 and stochk(14) > stochd(14)"
},
"cci": {
"type": "yes_no",
"ask": "cci(20) > 100"
},
"willr": {
"type": "yes_no",
"ask": "willr(14) > -20"
},
"down_week": {
"type": "yes_no",
"instructions": "Will the stock be lower in a week?"
}
}
}Response JSON (HD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"rsi": {
"yes_no": 0.392,
"rule": "rsi(C, 14) > 70",
"basis": "rule"
},
"stoch": {
"yes_no": 0.6275,
"rule": "stochk(14) > 80 and stochk(14) > stochd(14)",
"basis": "rule"
},
"cci": {
"yes_no": 0.6086,
"rule": "cci(20) > 100",
"basis": "rule"
},
"willr": {
"yes_no": 0.6317,
"rule": "willr(14) > -20",
"basis": "rule"
},
"down_week": {
"yes_no": 0.514
}
},
"context": {
"symbol": "HD",
"as_of": "2026-10-30"
}
}Quant researcher · example 18
WMA, EMA, RMA and SMA crossovers compared on XLK
Check how different averaging kernels change a fast-over-slow trend signal on the same series.
- StateXLK
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XLK"} The server fills in the latest completed session.
Questions
sma_x | rule | sma(C, 10) > sma(C, 30)10-day SMA above the 30-day |
ema_x | rule | ema(C, 10) > ema(C, 30)10-day EMA above the 30-day |
wma_x | rule | wma(C, 10) > wma(C, 30)10-day WMA above the 30-day |
rma_x | rule | rma(C, 10) > rma(C, 30)10-day RMA above the 30-day |
crossup | rule | crossup(ema(C, 10), ema(C, 30))10-day EMA crossed above the 30-day today |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
sma_x10-day SMA above the 30-day | 0.0778 | false |
ema_x10-day EMA above the 30-day | 0.1207 | false |
wma_x10-day WMA above the 30-day | 0.1136 | false |
rma_x10-day RMA above the 30-day | 0.6646 | true |
crossup10-day EMA crossed above the 30-day today | 0.05 | false |
up_weekHigher in a week | 0.546 | 55% · close to even |
What it means
For XLK on the session of 2026-10-30: True now: 10-day RMA above the 30-day. Not true: 10-day SMA above the 30-day; 10-day EMA above the 30-day; 10-day WMA above the 30-day; 10-day EMA crossed above the 30-day today. Forecasts: Higher in a week 55%.
Kernels differ in lag; where they disagree the faster ones have turned first, which is where a crossover study's edge or noise lives.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLK"
},
"questions": {
"sma_x": {
"type": "yes_no",
"ask": "sma(C, 10) > sma(C, 30)"
},
"ema_x": {
"type": "yes_no",
"ask": "ema(C, 10) > ema(C, 30)"
},
"wma_x": {
"type": "yes_no",
"ask": "wma(C, 10) > wma(C, 30)"
},
"rma_x": {
"type": "yes_no",
"ask": "rma(C, 10) > rma(C, 30)"
},
"crossup": {
"type": "yes_no",
"ask": "crossup(ema(C, 10), ema(C, 30))"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (XLK, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"sma_x": {
"yes_no": 0.0778,
"rule": "sma(C, 10) > sma(C, 30)",
"basis": "rule"
},
"ema_x": {
"yes_no": 0.1207,
"rule": "ema(C, 10) > ema(C, 30)",
"basis": "rule"
},
"wma_x": {
"yes_no": 0.1136,
"rule": "wma(C, 10) > wma(C, 30)",
"basis": "rule"
},
"rma_x": {
"yes_no": 0.6646,
"rule": "rma(C, 10) > rma(C, 30)",
"basis": "rule"
},
"crossup": {
"yes_no": 0.05,
"rule": "crossup(ema(C, 10), ema(C, 30))",
"basis": "rule"
},
"up_week": {
"yes_no": 0.546
}
},
"context": {
"symbol": "XLK",
"as_of": "2026-10-30"
}
}Quant researcher · example 19
Research alert: rule fires vs forecast disagree on GLD
Flag days when an exact breakout rule fires but the model gives low new-high odds, for manual review of the disagreement.
- StateGLD
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"GLD"} The server fills in the latest completed session.
Questions
breakout | rule | C > highest(C, 20)20-day closing breakout |
donchian | rule | C > highest(C, 55)55-day closing breakout |
recent_high | rule | highestbars(H, 20) <= 3Set its 20-day high in the last four sessions |
new_high | forecast | Will it make a new 20-day high in the next week? A new 20-day high next week |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
breakout20-day closing breakout | 0.0619 | false |
donchian55-day closing breakout | 0.0537 | false |
recent_highSet its 20-day high in the last four sessions | 0.083 | false |
new_highA new 20-day high next week | 0.039 | 4% · unlikely |
up_weekHigher in a week | 0.566 | 57% · close to even |
Actions
Rules on the answers decide what to send.
breakout >= 0.6 and new_high < 0.4→Slackquant-researchbreakout >= 0.6→EmailmeWhat it means
For GLD on the session of 2026-10-30: Not true: 20-day closing breakout; 55-day closing breakout; Set its 20-day high in the last four sessions. Forecasts: A new 20-day high next week 4%; Higher in a week 57%. No action fired: every rule was false.
Disagreements between an exact rule and the learned odds are the most informative rows for research; they are logged, not traded.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "GLD"
},
"questions": {
"breakout": {
"type": "yes_no",
"ask": "C > highest(C, 20)"
},
"donchian": {
"type": "yes_no",
"ask": "C > highest(C, 55)"
},
"recent_high": {
"type": "yes_no",
"ask": "highestbars(H, 20) <= 3"
},
"new_high": {
"type": "yes_no",
"instructions": "Will it make a new 20-day high in the next week?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
},
"actions": [
{
"id": "disagree",
"when": "breakout >= 0.6 and new_high < 0.4",
"do": "slack",
"connection": "quant-research",
"message": "{{symbol}} ({{as_of}}): breakout rule fired ({{breakout|pct}}) but new-high odds are {{new_high|pct}}. Log for the disagreement study."
},
{
"id": "agree",
"when": "breakout >= 0.6",
"do": "email",
"connection": "me",
"subject": "{{symbol}}: breakout and forecast agree",
"message": "{{symbol}} ({{as_of}}): breakout {{breakout|pct}}, new-high odds {{new_high|pct}}, higher in a week {{up_week|pct}}."
}
],
"dry_run": true
}Response JSON (GLD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"breakout": {
"yes_no": 0.0619,
"rule": "C > highest(C, 20)",
"basis": "rule"
},
"donchian": {
"yes_no": 0.0537,
"rule": "C > highest(C, 55)",
"basis": "rule"
},
"recent_high": {
"yes_no": 0.083,
"rule": "highestbars(H, 20) <= 3",
"basis": "rule"
},
"new_high": {
"yes_no": 0.039
},
"up_week": {
"yes_no": 0.566
}
},
"context": {
"symbol": "GLD",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "disagree",
"fired": false,
"status": "skipped"
},
{
"id": "agree",
"fired": false,
"status": "skipped"
}
]
}Quant researcher · example 20
Event-window features: earnings proximity and splits on a batch
Mark which names sit inside an earnings or split window so event days can be excluded from a clean technical study.
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NVDA"} then WMT, ORCL, CRM, one request each. The server fills in the latest completed session.
Questions
earn_near | rule | days_to_earnings <= 5 or days_since_earnings <= 2Within 5 days before or 2 days after earnings |
split_near | rule | days_since_split <= 30 or days_to_split <= 30Within 30 days of a split |
reverse | rule | reverse_split_last > 0.5Last split was a reverse split |
big_reaction | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
Answers
| Symbol | earn_nearrule | split_nearrule | reverserule | big_reactionrule |
|---|---|---|---|---|
NVDA | 0.0537 | 0.0537 | 0.1409 | 0.9463 |
WMT | 0.0537 | 0.0537 | 0.1409 | 0.9338 |
ORCL | 0.0537 | 0.0537 | 0.1409 | 0.0537 |
CRM | 0.0537 | 0.0537 | 0.1409 | 0.9463 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 4 symbols: Within 5 days before or 2 days after earnings: true for none of 4. Within 30 days of a split: true for none of 4. Last split was a reverse split: true for none of 4. Last earnings move bigger than 5%: true for NVDA, WMT, CRM of 4.
Excluding event windows keeps a technical study from mistaking earnings gaps for signal; the facts answer 0.5 when a date is unknown.
Request JSON (NVDA; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"earn_near": {
"type": "yes_no",
"ask": "days_to_earnings <= 5 or days_since_earnings <= 2"
},
"split_near": {
"type": "yes_no",
"ask": "days_since_split <= 30 or days_to_split <= 30"
},
"reverse": {
"type": "yes_no",
"ask": "reverse_split_last > 0.5"
},
"big_reaction": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
}
}
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"earn_near": {
"yes_no": 0.0537,
"rule": "days_to_earnings <= 5 or days_since_earnings <= 2",
"basis": "rule"
},
"split_near": {
"yes_no": 0.0537,
"rule": "days_since_split <= 30 or days_to_split <= 30",
"basis": "rule"
},
"reverse": {
"yes_no": 0.1409,
"rule": "reverse_split_last > 0.5",
"basis": "rule"
},
"big_reaction": {
"yes_no": 0.9463,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
}
}abs days_since_earnings days_since_split days_to_earnings days_to_split last_earnings_move reverse_split_last
Information, not investment advice. Rules answer from the latest completed daily session; forecasts are probabilities. Actions ran as dry runs: nothing was sent. More in Buy side: Financial advisor / RIA, Wealth manager, Family office, Hedge fund PM, Portfolio manager (long-only), Risk manager, Private equity, VC / growth investor, Fund-of-funds allocator.