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 1–10 of 21 · page 1 of 3
Quant researcher · example 1
Momentum signal vs the forecast model on AAPL
Put a classic 12-1 style momentum rule next to the model's one-month forecast to see where the exact signal and the learned odds agree.
- StateAAPL
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} The server fills in the latest completed session.
Questions
mom_12_1 | rule | C[-21] > C[-252]Price a month ago above price a year ago (12-1 momentum) |
mom_3m | rule | roc(C, 63) > 0Positive three-month rate of change |
above_200d | English → rule | Is the stock above its 200-day moving average? |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
mom_12_1Price a month ago above price a year ago (12-1 momentum) | 0.9463 | true |
mom_3mPositive three-month rate of change | 0.9423 | true |
above_200dIs the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.9463 | true |
beat_spyBeating SPY over a month | 0.531 | 53% · close to even |
up_weekHigher in a week | 0.59 | 59% · close to even |
What it means
For AAPL on the session of 2026-10-30: True now: Price a month ago above price a year ago (12-1 momentum); Positive three-month rate of change; Is the stock above its 200-day moving average. Forecasts: Beating SPY over a month 53%; Higher in a week 59%.
Rules carry a rule field and answer near certainty; forecasts carry none and read as odds. Agreement between the two is the interesting cell in a study.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"mom_12_1": {
"type": "yes_no",
"ask": "C[-21] > C[-252]"
},
"mom_3m": {
"type": "yes_no",
"ask": "roc(C, 63) > 0"
},
"above_200d": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"mom_12_1": {
"yes_no": 0.9463,
"rule": "C[-21] > C[-252]",
"basis": "rule"
},
"mom_3m": {
"yes_no": 0.9423,
"rule": "roc(C, 63) > 0",
"basis": "rule"
},
"above_200d": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"beat_spy": {
"yes_no": 0.531
},
"up_week": {
"yes_no": 0.59
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}Quant researcher · example 2
A recursive filter signal with rec() on MSFT
Test an adaptive smoother built with rec(): an exponential filter with a 0.1 gain, compared with an EMA and a regression line.
- StateMSFT
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MSFT"} The server fills in the latest completed session.
Questions
rec_filter | rule | C > rec(C, self + 0.1 * (C - self))Close above a recursive smoother (gain 0.1) |
ema_20 | rule | C > ema(C, 20)Close above the 20-day EMA |
linreg | rule | C > linreg(C, 20)Close above the 20-day regression value |
rec_slope | rule | rec(C, self + 0.1 * (C - self)) > ref(rec(C, self + 0.1 * (C - self)), -5)The recursive smoother is higher than 5 sessions ago |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
rec_filterClose above a recursive smoother (gain 0.1) | 0.3041 | false |
ema_20Close above the 20-day EMA | 0.3192 | false |
linregClose above the 20-day regression value | 0.2494 | false |
rec_slopeThe recursive smoother is higher than 5 sessions ago | 0.608 | true |
up_weekHigher in a week | 0.574 | 57% · close to even |
What it means
For MSFT on the session of 2026-10-30: True now: The recursive smoother is higher than 5 sessions ago. Not true: Close above a recursive smoother (gain 0.1); Close above the 20-day EMA; Close above the 20-day regression value. Forecasts: Higher in a week 57%.
Three smoothers usually agree in a trend and disagree at turns; disagreement is where a new filter earns or loses its keep.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"rec_filter": {
"type": "yes_no",
"ask": "C > rec(C, self + 0.1 * (C - self))"
},
"ema_20": {
"type": "yes_no",
"ask": "C > ema(C, 20)"
},
"linreg": {
"type": "yes_no",
"ask": "C > linreg(C, 20)"
},
"rec_slope": {
"type": "yes_no",
"ask": "rec(C, self + 0.1 * (C - self)) > ref(rec(C, self + 0.1 * (C - self)), -5)"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"rec_filter": {
"yes_no": 0.3041,
"rule": "C > rec(C, self + 0.1 * (C - self))",
"basis": "rule"
},
"ema_20": {
"yes_no": 0.3192,
"rule": "C > ema(C, 20)",
"basis": "rule"
},
"linreg": {
"yes_no": 0.2494,
"rule": "C > linreg(C, 20)",
"basis": "rule"
},
"rec_slope": {
"yes_no": 0.608,
"rule": "rec(C, self + 0.1 * (C - self)) > ref(rec(C, self + 0.1 * (C - self)), -5)",
"basis": "rule"
},
"up_week": {
"yes_no": 0.574
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
}
}Quant researcher · example 3
Short-term reversal across a mega-cap universe
Score a one-week reversal signal on six large caps in one batch and line it up with the next-week forecast.
- State6 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} then MSFT, NVDA, AMZN, TSLA, JPM, one request each. The server fills in the latest completed session.
Questions
loser_5d | rule | C < C[-5]Down over the last five sessions |
z5 | rule | zscore(C / C[-5] - 1, 60) < -1Five-day return more than 1 sd below its 60-day norm |
rsi2 | rule | rsi(C, 2) < 10Two-day RSI under 10 |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Symbol | loser_5drule | z5rule | rsi2rule | up_weekforecast |
|---|---|---|---|---|
AAPL | 0.7392 | 0.3949 | 0.1464 | 0.59 |
MSFT | 0.6253 | 0.0959 | 0.5812 | 0.574 |
NVDA | 0.7931 | 0.3216 | 0.591 | 0.527 |
AMZN | 0.8836 | 0.3761 | 0.5093 | 0.493 |
TSLA | 0.0735 | 0.0537 | 0.1345 | 0.487 |
JPM | 0.1512 | 0.0591 | 0.1602 | 0.558 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 6 symbols: Down over the last five sessions: true for AAPL, MSFT, NVDA, AMZN of 6. Five-day return more than 1 sd below its 60-day norm: true for none of 6. Two-day RSI under 10: true for none of 6. Highest odds for “Higher in a week”: AAPL at 59%.
In a reversal study the losers by rule should show higher next-week odds; if they do not, the effect is not present in this cross-section today.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"loser_5d": {
"type": "yes_no",
"ask": "C < C[-5]"
},
"z5": {
"type": "yes_no",
"ask": "zscore(C / C[-5] - 1, 60) < -1"
},
"rsi2": {
"type": "yes_no",
"ask": "rsi(C, 2) < 10"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"loser_5d": {
"yes_no": 0.7392,
"rule": "C < C[-5]",
"basis": "rule"
},
"z5": {
"yes_no": 0.3949,
"rule": "zscore(C / C[-5] - 1, 60) < -1",
"basis": "rule"
},
"rsi2": {
"yes_no": 0.1464,
"rule": "rsi(C, 2) < 10",
"basis": "rule"
},
"up_week": {
"yes_no": 0.59
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}Quant researcher · example 4
ADX and DMI trend-strength features on XLE
Build a trend-strength feature set: ADX level, DI spread, and how long since the last 20-day breakout.
- StateXLE
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XLE"} The server fills in the latest completed session.
Questions
adx25 | rule | adx(14) > 25ADX over 25 |
di_spread | rule | diplus(14) - diminus(14) > 10+DI more than 10 points above -DI |
di_minus | rule | diminus(14) > diplus(14)-DI above +DI |
since_bo | rule | barssince(C > highest(C, 20)) < 10A 20-day breakout in the last 10 sessions |
new_high | forecast | Will it make a new 20-day high in the next week? A new 20-day high next week |
Answers
| Question | Answer | Reading |
|---|---|---|
adx25ADX over 25 | 0.0708 | false |
di_spread+DI more than 10 points above -DI | 0.3957 | false |
di_minus-DI above +DI | 0.1748 | false |
since_boA 20-day breakout in the last 10 sessions | 0.9316 | true |
new_highA new 20-day high next week | 0.865 | 87% · likely |
What it means
For XLE on the session of 2026-10-30: True now: A 20-day breakout in the last 10 sessions. Not true: ADX over 25; +DI more than 10 points above -DI; -DI above +DI. Forecasts: A new 20-day high next week 87%.
Strong ADX with a wide positive DI spread and a recent breakout describes a trending regime; the new-high forecast tests persistence.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XLE"
},
"questions": {
"adx25": {
"type": "yes_no",
"ask": "adx(14) > 25"
},
"di_spread": {
"type": "yes_no",
"ask": "diplus(14) - diminus(14) > 10"
},
"di_minus": {
"type": "yes_no",
"ask": "diminus(14) > diplus(14)"
},
"since_bo": {
"type": "yes_no",
"ask": "barssince(C > highest(C, 20)) < 10"
},
"new_high": {
"type": "yes_no",
"instructions": "Will it make a new 20-day high in the next week?"
}
}
}Response JSON (XLE, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"adx25": {
"yes_no": 0.0708,
"rule": "adx(14) > 25",
"basis": "rule"
},
"di_spread": {
"yes_no": 0.3957,
"rule": "diplus(14) - diminus(14) > 10",
"basis": "rule"
},
"di_minus": {
"yes_no": 0.1748,
"rule": "diminus(14) > diplus(14)",
"basis": "rule"
},
"since_bo": {
"yes_no": 0.9316,
"rule": "barssince(C > highest(C, 20)) < 10",
"basis": "rule"
},
"new_high": {
"yes_no": 0.865
}
},
"context": {
"symbol": "XLE",
"as_of": "2026-10-30"
}
}Quant researcher · example 5
Robust volume anomaly with median() and percentrank()
Compare a mean-based volume spike with median and percentile versions that resist outliers.
- StateAMD
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AMD"} The server fills in the latest completed session.
Questions
mean_spike | rule | V > 2 * ref(avg(V, 20), -1)Volume more than twice the previous 20-day average |
median_spike | rule | V > 2 * median(V, 20)Volume more than twice its 20-day median |
rank90 | rule | percentrank(V, 50) > 90Volume in the top tenth of 50 sessions |
obv | rule | obv() > sma(obv(), 20)On-balance volume above its 20-day average |
vol_spike_tmr | forecast | Will volume spike tomorrow? A volume spike tomorrow |
Answers
| Question | Answer | Reading |
|---|---|---|
mean_spikeVolume more than twice the previous 20-day average | 0.5394 | on the line (true) |
median_spikeVolume more than twice its 20-day median | 0.6441 | true |
rank90Volume in the top tenth of 50 sessions | 0.6546 | true |
obvOn-balance volume above its 20-day average | 0.2203 | false |
vol_spike_tmrA volume spike tomorrow | 0.101 | 10% · unlikely |
What it means
For AMD on the session of 2026-10-30: True now: Volume more than twice its 20-day median; Volume in the top tenth of 50 sessions. Not true: On-balance volume above its 20-day average. On the line: Volume more than twice the previous 20-day average. Forecasts: A volume spike tomorrow 10%.
When mean and median versions disagree, one outlier day is driving the average; the median version is the cleaner feature.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AMD"
},
"questions": {
"mean_spike": {
"type": "yes_no",
"ask": "V > 2 * ref(avg(V, 20), -1)"
},
"median_spike": {
"type": "yes_no",
"ask": "V > 2 * median(V, 20)"
},
"rank90": {
"type": "yes_no",
"ask": "percentrank(V, 50) > 90"
},
"obv": {
"type": "yes_no",
"ask": "obv() > sma(obv(), 20)"
},
"vol_spike_tmr": {
"type": "yes_no",
"instructions": "Will volume spike tomorrow?"
}
}
}Response JSON (AMD, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"mean_spike": {
"yes_no": 0.5394,
"rule": "V > 2 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"median_spike": {
"yes_no": 0.6441,
"rule": "V > 2 * median(V, 20)",
"basis": "rule"
},
"rank90": {
"yes_no": 0.6546,
"rule": "percentrank(V, 50) > 90",
"basis": "rule"
},
"obv": {
"yes_no": 0.2203,
"rule": "obv() > sma(obv(), 20)",
"basis": "rule"
},
"vol_spike_tmr": {
"yes_no": 0.101
}
},
"context": {
"symbol": "AMD",
"as_of": "2026-10-30"
}
}Quant researcher · example 6
A full candlestick feature panel on SPY
Record every candlestick pattern as a binary feature for one day, the raw input to a pattern study.
- StateSPY
- Questions10 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
doji | rule | doji()doji candle: Body at most 10% of the day's range. |
hammer | rule | hammer()hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back. |
shooting | rule | shooting_star()shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise. |
engulf_bull | rule | engulfing_bull()engulfing bull candle: A green body that engulfs yesterday's red body. |
engulf_bear | rule | engulfing_bear()engulfing bear candle: A red body that engulfs yesterday's green body. |
harami_bull | rule | harami_bull()harami bull candle: A small green body inside yesterday's red body. |
harami_bear | rule | harami_bear()harami bear candle: A small red body inside yesterday's green body. |
morning | rule | morning_star()morning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first. |
evening | rule | evening_star()evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first. |
marubozu | rule | marubozu()marubozu candle: Body at least 90% of the range: almost no wicks. |
Answers
| Question | Answer | Reading |
|---|---|---|
dojidoji candle: Body at most 10% of the day's range. | 0.0579 | false |
hammerhammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back. | 0.0941 | false |
shootingshooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise. | 0.0537 | false |
engulf_bullengulfing bull candle: A green body that engulfs yesterday's red body. | 0.0597 | false |
engulf_bearengulfing bear candle: A red body that engulfs yesterday's green body. | 0.0604 | false |
harami_bullharami bull candle: A small green body inside yesterday's red body. | 0.0604 | false |
harami_bearharami bear candle: A small red body inside yesterday's green body. | 0.0597 | false |
morningmorning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first. | 0.0579 | false |
eveningevening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first. | 0.1524 | false |
marubozumarubozu candle: Body at least 90% of the range: almost no wicks. | 0.0537 | false |
What it means
For SPY on the session of 2026-10-30: Not true: doji candle: Body at most 10% of the day's range.; hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back.; shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.; engulfing bull candle: A green body that engulfs yesterday's red body.; engulfing bear candle: A red body that engulfs yesterday's green body.; harami bull candle: A small green body inside yesterday's red body.; harami bear candle: A small red body inside yesterday's green body.; morning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first.; evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.; marubozu candle: Body at least 90% of the range: almost no wicks..
Most features are zero on most days; that sparsity is why pattern studies need long histories and many symbols.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"doji": {
"type": "yes_no",
"ask": "doji()"
},
"hammer": {
"type": "yes_no",
"ask": "hammer()"
},
"shooting": {
"type": "yes_no",
"ask": "shooting_star()"
},
"engulf_bull": {
"type": "yes_no",
"ask": "engulfing_bull()"
},
"engulf_bear": {
"type": "yes_no",
"ask": "engulfing_bear()"
},
"harami_bull": {
"type": "yes_no",
"ask": "harami_bull()"
},
"harami_bear": {
"type": "yes_no",
"ask": "harami_bear()"
},
"morning": {
"type": "yes_no",
"ask": "morning_star()"
},
"evening": {
"type": "yes_no",
"ask": "evening_star()"
},
"marubozu": {
"type": "yes_no",
"ask": "marubozu()"
}
}
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"doji": {
"yes_no": 0.0579,
"rule": "doji()",
"basis": "rule"
},
"hammer": {
"yes_no": 0.0941,
"rule": "hammer()",
"basis": "rule"
},
"shooting": {
"yes_no": 0.0537,
"rule": "shooting_star()",
"basis": "rule"
},
"engulf_bull": {
"yes_no": 0.0597,
"rule": "engulfing_bull()",
"basis": "rule"
},
"engulf_bear": {
"yes_no": 0.0604,
"rule": "engulfing_bear()",
"basis": "rule"
},
"harami_bull": {
"yes_no": 0.0604,
"rule": "harami_bull()",
"basis": "rule"
},
"harami_bear": {
"yes_no": 0.0597,
"rule": "harami_bear()",
"basis": "rule"
},
"morning": {
"yes_no": 0.0579,
"rule": "morning_star()",
"basis": "rule"
},
"evening": {
"yes_no": 0.1524,
"rule": "evening_star()",
"basis": "rule"
},
"marubozu": {
"yes_no": 0.0537,
"rule": "marubozu()",
"basis": "rule"
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
}
}doji engulfing_bear engulfing_bull evening_star hammer harami_bear harami_bull marubozu morning_star shooting_star
Quant researcher · example 7
Candlestick feature panel, part two, on QQQ
The remaining patterns as binary features, so a study can cover the full pattern set.
- StateQQQ
- Questions10 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"QQQ"} The server fills in the latest completed session.
Questions
dragonfly | rule | dragonfly_doji()dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick. |
gravestone | rule | gravestone_doji()gravestone doji candle: Doji with a long upper wick and almost no lower wick. |
spinning | rule | spinning_top()spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides. |
hanging | rule | hanging_man()hanging man candle: Hammer shape, closing above the close five bars back. |
inv_hammer | rule | inverted_hammer()inverted hammer candle: Shooting-star shape after a five-bar decline. |
piercing | rule | piercing_line()piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open). |
dark | rule | dark_cloud()dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open). |
soldiers | rule | three_white_soldiers()three white soldiers candle: Three green bars, each closing higher and opening inside the previous body. |
crows | rule | three_black_crows()three black crows candle: Three red bars, each closing lower and opening inside the previous body. |
tweezer_b | rule | tweezer_bottom()tweezer bottom candle: Red then green, with lows within 0.1% of each other. |
Answers
| Question | Answer | Reading |
|---|---|---|
dragonflydragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick. | 0.0749 | false |
gravestonegravestone doji candle: Doji with a long upper wick and almost no lower wick. | 0.0537 | false |
spinningspinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides. | 0.0865 | false |
hanginghanging man candle: Hammer shape, closing above the close five bars back. | 0.1466 | false |
inv_hammerinverted hammer candle: Shooting-star shape after a five-bar decline. | 0.0537 | false |
piercingpiercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open). | 0.0537 | false |
darkdark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open). | 0.0537 | false |
soldiersthree white soldiers candle: Three green bars, each closing higher and opening inside the previous body. | 0.0537 | false |
crowsthree black crows candle: Three red bars, each closing lower and opening inside the previous body. | 0.0537 | false |
tweezer_btweezer bottom candle: Red then green, with lows within 0.1% of each other. | 0.0537 | false |
What it means
For QQQ on the session of 2026-10-30: Not true: dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.; gravestone doji candle: Doji with a long upper wick and almost no lower wick.; spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides.; hanging man candle: Hammer shape, closing above the close five bars back.; inverted hammer candle: Shooting-star shape after a five-bar decline.; piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open).; dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).; three white soldiers candle: Three green bars, each closing higher and opening inside the previous body.; three black crows candle: Three red bars, each closing lower and opening inside the previous body.; tweezer bottom candle: Red then green, with lows within 0.1% of each other..
Paired with part one, every pattern function is recorded; label each row later with the realized next-week return.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "QQQ"
},
"questions": {
"dragonfly": {
"type": "yes_no",
"ask": "dragonfly_doji()"
},
"gravestone": {
"type": "yes_no",
"ask": "gravestone_doji()"
},
"spinning": {
"type": "yes_no",
"ask": "spinning_top()"
},
"hanging": {
"type": "yes_no",
"ask": "hanging_man()"
},
"inv_hammer": {
"type": "yes_no",
"ask": "inverted_hammer()"
},
"piercing": {
"type": "yes_no",
"ask": "piercing_line()"
},
"dark": {
"type": "yes_no",
"ask": "dark_cloud()"
},
"soldiers": {
"type": "yes_no",
"ask": "three_white_soldiers()"
},
"crows": {
"type": "yes_no",
"ask": "three_black_crows()"
},
"tweezer_b": {
"type": "yes_no",
"ask": "tweezer_bottom()"
}
}
}Response JSON (QQQ, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"dragonfly": {
"yes_no": 0.0749,
"rule": "dragonfly_doji()",
"basis": "rule"
},
"gravestone": {
"yes_no": 0.0537,
"rule": "gravestone_doji()",
"basis": "rule"
},
"spinning": {
"yes_no": 0.0865,
"rule": "spinning_top()",
"basis": "rule"
},
"hanging": {
"yes_no": 0.1466,
"rule": "hanging_man()",
"basis": "rule"
},
"inv_hammer": {
"yes_no": 0.0537,
"rule": "inverted_hammer()",
"basis": "rule"
},
"piercing": {
"yes_no": 0.0537,
"rule": "piercing_line()",
"basis": "rule"
},
"dark": {
"yes_no": 0.0537,
"rule": "dark_cloud()",
"basis": "rule"
},
"soldiers": {
"yes_no": 0.0537,
"rule": "three_white_soldiers()",
"basis": "rule"
},
"crows": {
"yes_no": 0.0537,
"rule": "three_black_crows()",
"basis": "rule"
},
"tweezer_b": {
"yes_no": 0.0537,
"rule": "tweezer_bottom()",
"basis": "rule"
}
},
"context": {
"symbol": "QQQ",
"as_of": "2026-10-30"
}
}dark_cloud dragonfly_doji gravestone_doji hanging_man inverted_hammer piercing_line spinning_top three_black_crows three_white_soldiers tweezer_bottom
Quant researcher · example 8
Bar geometry features: wicks, bodies and price centers
Describe the latest bar with geometry features built from hl2, hlc3, ohlc4, least and greatest.
- StateNVDA
- Questions7 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
upper_half | rule | C > hl2()Closed in the upper half of the bar |
typical_up | rule | hlc3() > sma(hlc3(), 20)Typical price above its 20-day average |
ohlc_up | rule | ohlc4() > ref(ohlc4(), -1)OHLC average above yesterday's |
long_lower | rule | least(O, C) - L > 2 * abs(C - O)Lower wick more than twice the body |
long_upper | rule | H - greatest(O, C) > 2 * abs(C - O)Upper wick more than twice the body |
tweezer_top | rule | tweezer_top()tweezer top candle: Green then red, with highs within 0.1%. |
up_tomorrow | forecast | Will the stock be up tomorrow? Up tomorrow |
Answers
| Question | Answer | Reading |
|---|---|---|
upper_halfClosed in the upper half of the bar | 0.3742 | false |
typical_upTypical price above its 20-day average | 0.0713 | false |
ohlc_upOHLC average above yesterday's | 0.0685 | false |
long_lowerLower wick more than twice the body | 0.1245 | false |
long_upperUpper wick more than twice the body | 0.0714 | false |
tweezer_toptweezer top candle: Green then red, with highs within 0.1%. | 0.0664 | false |
up_tomorrowUp tomorrow | 0.485 | 49% · close to even |
What it means
For NVDA on the session of 2026-10-30: Not true: Closed in the upper half of the bar; Typical price above its 20-day average; OHLC average above yesterday's; Lower wick more than twice the body; Upper wick more than twice the body; tweezer top candle: Green then red, with highs within 0.1%.. Forecasts: Up tomorrow 49%.
Geometry features are cheap, exact and plentiful; the up-tomorrow forecast is the benchmark any one-day feature must beat.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"upper_half": {
"type": "yes_no",
"ask": "C > hl2()"
},
"typical_up": {
"type": "yes_no",
"ask": "hlc3() > sma(hlc3(), 20)"
},
"ohlc_up": {
"type": "yes_no",
"ask": "ohlc4() > ref(ohlc4(), -1)"
},
"long_lower": {
"type": "yes_no",
"ask": "least(O, C) - L > 2 * abs(C - O)"
},
"long_upper": {
"type": "yes_no",
"ask": "H - greatest(O, C) > 2 * abs(C - O)"
},
"tweezer_top": {
"type": "yes_no",
"ask": "tweezer_top()"
},
"up_tomorrow": {
"type": "yes_no",
"instructions": "Will the stock be up tomorrow?"
}
}
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"upper_half": {
"yes_no": 0.3742,
"rule": "C > hl2()",
"basis": "rule"
},
"typical_up": {
"yes_no": 0.0713,
"rule": "hlc3() > sma(hlc3(), 20)",
"basis": "rule"
},
"ohlc_up": {
"yes_no": 0.0685,
"rule": "ohlc4() > ref(ohlc4(), -1)",
"basis": "rule"
},
"long_lower": {
"yes_no": 0.1245,
"rule": "least(O, C) - L > 2 * abs(C - O)",
"basis": "rule"
},
"long_upper": {
"yes_no": 0.0714,
"rule": "H - greatest(O, C) > 2 * abs(C - O)",
"basis": "rule"
},
"tweezer_top": {
"yes_no": 0.0664,
"rule": "tweezer_top()",
"basis": "rule"
},
"up_tomorrow": {
"yes_no": 0.485
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
}
}Quant researcher · example 9
Regime-dependent thresholds with iif() on IWM
Test an oversold rule whose threshold changes with the trend regime, and a band rule written with between().
- StateIWM
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"IWM"} The server fills in the latest completed session.
Questions
regime_os | rule | rsi(C, 14) < iif(C > sma(C, 200), 40, 30)RSI under 40 in an uptrend, under 30 in a downtrend |
neutral_band | rule | between(rsi(C, 14), 40, 60)RSI between 40 and 60 |
regime | rule | (C > sma(C, 200) and rsi(C, 14) < 40) or (C < sma(C, 200) and rsi(C, 14) < 25)Oversold, with the line set by the trend |
trend | English → rule | Is the stock above its 200-day moving average? |
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 |
|---|---|---|
regime_osRSI under 40 in an uptrend, under 30 in a downtrend | 0.1346 | false |
neutral_bandRSI between 40 and 60 | 0.95 | true |
regimeOversold, with the line set by the trend | 0.1364 | false |
trendIs the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.5564 | on the line (true) |
rally5A 5% rally within a month | 0.285 | 28% · unlikely |
What it means
For IWM on the session of 2026-10-30: True now: RSI between 40 and 60. Not true: RSI under 40 in an uptrend, under 30 in a downtrend; Oversold, with the line set by the trend. On the line: Is the stock above its 200-day moving average. Forecasts: A 5% rally within a month 28%.
Regime-aware thresholds trade less in downtrends; compare the hit rate of each version against the rally forecast over many days.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "IWM"
},
"questions": {
"regime_os": {
"type": "yes_no",
"ask": "rsi(C, 14) < iif(C > sma(C, 200), 40, 30)"
},
"neutral_band": {
"type": "yes_no",
"ask": "between(rsi(C, 14), 40, 60)"
},
"regime": {
"type": "yes_no",
"ask": "(C > sma(C, 200) and rsi(C, 14) < 40) or (C < sma(C, 200) and rsi(C, 14) < 25)"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"rally5": {
"type": "yes_no",
"instructions": "Will it rally at least 5% at some point in the next month?"
}
}
}Response JSON (IWM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"regime_os": {
"yes_no": 0.1346,
"rule": "rsi(C, 14) < iif(C > sma(C, 200), 40, 30)",
"basis": "rule"
},
"neutral_band": {
"yes_no": 0.95,
"rule": "between(rsi(C, 14), 40, 60)",
"basis": "rule"
},
"regime": {
"yes_no": 0.1364,
"rule": "(C > sma(C, 200) and rsi(C, 14) < 40) or (C < sma(C, 200) and rsi(C, 14) < 25)",
"basis": "rule"
},
"trend": {
"yes_no": 0.5564,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"rally5": {
"yes_no": 0.285
}
},
"context": {
"symbol": "IWM",
"as_of": "2026-10-30"
}
}Quant researcher · example 10
Comparing volatility estimators on TSLA
Close-to-close, ATR-based and range-based volatility measures side by side, with the model's volatility forecasts.
- StateTSLA
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"TSLA"} The server fills in the latest completed session.
Questions
hv_cc | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.520-day close-to-close volatility above 50% |
atr_pct | rule | atr_pct(14) > 3ATR over 3% of price |
range_vol | rule | sum(log(H / L), 20) / 20 > 0.03Average log high/low range above 3% |
vol_ratio | rule | std(log(C / C[-1]), 5) > std(log(C / C[-1]), 60)5-day volatility above 60-day volatility |
vol_up | forecast | Will volatility be higher over the next month? Higher volatility next month |
hv30 | forecast | Will annualized volatility over the next 21 sessions exceed 30%? Next-month volatility above 30% |
Answers
| Question | Answer | Reading |
|---|---|---|
hv_cc20-day close-to-close volatility above 50% | 0.1042 | false |
atr_pctATR over 3% of price | 0.848 | true |
range_volAverage log high/low range above 3% | 0.3554 | false |
vol_ratio5-day volatility above 60-day volatility | 0.5391 | on the line (true) |
vol_upHigher volatility next month | 0.446 | 45% · close to even |
hv30Next-month volatility above 30% | 0.441 | 44% · close to even |
What it means
For TSLA on the session of 2026-10-30: True now: ATR over 3% of price. Not true: 20-day close-to-close volatility above 50%; Average log high/low range above 3%. On the line: 5-day volatility above 60-day volatility. Forecasts: Higher volatility next month 45%; Next-month volatility above 30% 44%.
Estimators that agree describe the regime robustly; the forecasts test whether today's regime predicts next month's.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TSLA"
},
"questions": {
"hv_cc": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.5"
},
"atr_pct": {
"type": "yes_no",
"ask": "atr_pct(14) > 3"
},
"range_vol": {
"type": "yes_no",
"ask": "sum(log(H / L), 20) / 20 > 0.03"
},
"vol_ratio": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 5) > std(log(C / C[-1]), 60)"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
},
"hv30": {
"type": "yes_no",
"instructions": "Will annualized volatility over the next 21 sessions exceed 30%?"
}
}
}Response JSON (TSLA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"hv_cc": {
"yes_no": 0.1042,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.5",
"basis": "rule"
},
"atr_pct": {
"yes_no": 0.848,
"rule": "atr_pct(14) > 3",
"basis": "rule"
},
"range_vol": {
"yes_no": 0.3554,
"rule": "sum(log(H / L), 20) / 20 > 0.03",
"basis": "rule"
},
"vol_ratio": {
"yes_no": 0.5391,
"rule": "std(log(C / C[-1]), 5) > std(log(C / C[-1]), 60)",
"basis": "rule"
},
"vol_up": {
"yes_no": 0.446
},
"hv30": {
"yes_no": 0.441
}
},
"context": {
"symbol": "TSLA",
"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 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.