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

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

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

State

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

Questions

mom_12_1ruleC[-21] > C[-252]
Price a month ago above price a year ago (12-1 momentum)
mom_3mruleroc(C, 63) > 0
Positive three-month rate of change
above_200dEnglish → ruleIs the stock above its 200-day moving average?
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
mom_12_1
Price a month ago above price a year ago (12-1 momentum)
0.9463true
mom_3m
Positive three-month rate of change
0.9423true
above_200d
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.9463true
beat_spy
Beating SPY over a month
0.53153% · close to even
up_week
Higher in a week
0.5959% · 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"
  }
}

offset roc sma

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.

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

State

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

Questions

rec_filterruleC > rec(C, self + 0.1 * (C - self))
Close above a recursive smoother (gain 0.1)
ema_20ruleC > ema(C, 20)
Close above the 20-day EMA
linregruleC > linreg(C, 20)
Close above the 20-day regression value
rec_sloperulerec(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_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
rec_filter
Close above a recursive smoother (gain 0.1)
0.3041false
ema_20
Close above the 20-day EMA
0.3192false
linreg
Close above the 20-day regression value
0.2494false
rec_slope
The recursive smoother is higher than 5 sessions ago
0.608true
up_week
Higher in a week
0.57457% · 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"
  }
}

ema linreg rec ref

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.

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

State

{"symbol":"AAPL"} then MSFT, NVDA, AMZN, TSLA, JPM, one request each. The server fills in the latest completed session.

Questions

loser_5druleC < C[-5]
Down over the last five sessions
z5rulezscore(C / C[-5] - 1, 60) < -1
Five-day return more than 1 sd below its 60-day norm
rsi2rulersi(C, 2) < 10
Two-day RSI under 10
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

Symbolloser_5drulez5rulersi2ruleup_weekforecast
AAPL0.73920.39490.14640.59
MSFT0.62530.09590.58120.574
NVDA0.79310.32160.5910.527
AMZN0.88360.37610.50930.493
TSLA0.07350.05370.13450.487
JPM0.15120.05910.16020.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"
  }
}

offset rsi zscore

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.

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

State

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

Questions

adx25ruleadx(14) > 25
ADX over 25
di_spreadrulediplus(14) - diminus(14) > 10
+DI more than 10 points above -DI
di_minusrulediminus(14) > diplus(14)
-DI above +DI
since_borulebarssince(C > highest(C, 20)) < 10
A 20-day breakout in the last 10 sessions
new_highforecastWill it make a new 20-day high in the next week?
A new 20-day high next week

Answers

QuestionAnswerReading
adx25
ADX over 25
0.0708false
di_spread
+DI more than 10 points above -DI
0.3957false
di_minus
-DI above +DI
0.1748false
since_bo
A 20-day breakout in the last 10 sessions
0.9316true
new_high
A new 20-day high next week
0.86587% · 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"
  }
}

adx barssince diminus diplus highest

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.

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

State

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

Questions

mean_spikeruleV > 2 * ref(avg(V, 20), -1)
Volume more than twice the previous 20-day average
median_spikeruleV > 2 * median(V, 20)
Volume more than twice its 20-day median
rank90rulepercentrank(V, 50) > 90
Volume in the top tenth of 50 sessions
obvruleobv() > sma(obv(), 20)
On-balance volume above its 20-day average
vol_spike_tmrforecastWill volume spike tomorrow?
A volume spike tomorrow

Answers

QuestionAnswerReading
mean_spike
Volume more than twice the previous 20-day average
0.5394on the line (true)
median_spike
Volume more than twice its 20-day median
0.6441true
rank90
Volume in the top tenth of 50 sessions
0.6546true
obv
On-balance volume above its 20-day average
0.2203false
vol_spike_tmr
A volume spike tomorrow
0.10110% · 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"
  }
}

avg median obv percentrank ref sma

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.

ora-fin-0.1.1SPY10 questions
  1. StateSPY
  2. Questions10 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

dojiruledoji()
doji candle: Body at most 10% of the day's range.
hammerrulehammer()
hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back.
shootingruleshooting_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_bullruleengulfing_bull()
engulfing bull candle: A green body that engulfs yesterday's red body.
engulf_bearruleengulfing_bear()
engulfing bear candle: A red body that engulfs yesterday's green body.
harami_bullruleharami_bull()
harami bull candle: A small green body inside yesterday's red body.
harami_bearruleharami_bear()
harami bear candle: A small red body inside yesterday's green body.
morningrulemorning_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.
eveningruleevening_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.
marubozurulemarubozu()
marubozu candle: Body at least 90% of the range: almost no wicks.

Answers

QuestionAnswerReading
doji
doji candle: Body at most 10% of the day's range.
0.0579false
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.
0.0941false
shooting
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
0.0537false
engulf_bull
engulfing bull candle: A green body that engulfs yesterday's red body.
0.0597false
engulf_bear
engulfing bear candle: A red body that engulfs yesterday's green body.
0.0604false
harami_bull
harami bull candle: A small green body inside yesterday's red body.
0.0604false
harami_bear
harami bear candle: A small red body inside yesterday's green body.
0.0597false
morning
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.
0.0579false
evening
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.
0.1524false
marubozu
marubozu candle: Body at least 90% of the range: almost no wicks.
0.0537false

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.

ora-fin-0.1.1QQQ10 questions
  1. StateQQQ
  2. Questions10 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

dragonflyruledragonfly_doji()
dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.
gravestonerulegravestone_doji()
gravestone doji candle: Doji with a long upper wick and almost no lower wick.
spinningrulespinning_top()
spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides.
hangingrulehanging_man()
hanging man candle: Hammer shape, closing above the close five bars back.
inv_hammerruleinverted_hammer()
inverted hammer candle: Shooting-star shape after a five-bar decline.
piercingrulepiercing_line()
piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open).
darkruledark_cloud()
dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).
soldiersrulethree_white_soldiers()
three white soldiers candle: Three green bars, each closing higher and opening inside the previous body.
crowsrulethree_black_crows()
three black crows candle: Three red bars, each closing lower and opening inside the previous body.
tweezer_bruletweezer_bottom()
tweezer bottom candle: Red then green, with lows within 0.1% of each other.

Answers

QuestionAnswerReading
dragonfly
dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.
0.0749false
gravestone
gravestone doji candle: Doji with a long upper wick and almost no lower wick.
0.0537false
spinning
spinning top candle: Small body (10–30% of range) with wicks of at least a quarter of the range on both sides.
0.0865false
hanging
hanging man candle: Hammer shape, closing above the close five bars back.
0.1466false
inv_hammer
inverted hammer candle: Shooting-star shape after a five-bar decline.
0.0537false
piercing
piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open).
0.0537false
dark
dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).
0.0537false
soldiers
three white soldiers candle: Three green bars, each closing higher and opening inside the previous body.
0.0537false
crows
three black crows candle: Three red bars, each closing lower and opening inside the previous body.
0.0537false
tweezer_b
tweezer bottom candle: Red then green, with lows within 0.1% of each other.
0.0537false

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.

ora-fin-0.1.1NVDA7 questions
  1. StateNVDA
  2. Questions7 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

upper_halfruleC > hl2()
Closed in the upper half of the bar
typical_uprulehlc3() > sma(hlc3(), 20)
Typical price above its 20-day average
ohlc_upruleohlc4() > ref(ohlc4(), -1)
OHLC average above yesterday's
long_lowerruleleast(O, C) - L > 2 * abs(C - O)
Lower wick more than twice the body
long_upperruleH - greatest(O, C) > 2 * abs(C - O)
Upper wick more than twice the body
tweezer_topruletweezer_top()
tweezer top candle: Green then red, with highs within 0.1%.
up_tomorrowforecastWill the stock be up tomorrow?
Up tomorrow

Answers

QuestionAnswerReading
upper_half
Closed in the upper half of the bar
0.3742false
typical_up
Typical price above its 20-day average
0.0713false
ohlc_up
OHLC average above yesterday's
0.0685false
long_lower
Lower wick more than twice the body
0.1245false
long_upper
Upper wick more than twice the body
0.0714false
tweezer_top
tweezer top candle: Green then red, with highs within 0.1%.
0.0664false
up_tomorrow
Up tomorrow
0.48549% · 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"
  }
}

abs greatest hl2 hlc3 least ohlc4 ref sma tweezer_top

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

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

State

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

Questions

regime_osrulersi(C, 14) < iif(C > sma(C, 200), 40, 30)
RSI under 40 in an uptrend, under 30 in a downtrend
neutral_bandrulebetween(rsi(C, 14), 40, 60)
RSI between 40 and 60
regimerule(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
trendEnglish → ruleIs the stock above its 200-day moving average?
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
regime_os
RSI under 40 in an uptrend, under 30 in a downtrend
0.1346false
neutral_band
RSI between 40 and 60
0.95true
regime
Oversold, with the line set by the trend
0.1364false
trend
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.5564on the line (true)
rally5
A 5% rally within a month
0.28528% · 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"
  }
}

between iif rsi sma

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.

ora-fin-0.1.1TSLA6 questions
  1. StateTSLA
  2. Questions6 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

hv_ccrulestd(log(C / C[-1]), 20) * sqrt(252) > 0.5
20-day close-to-close volatility above 50%
atr_pctruleatr_pct(14) > 3
ATR over 3% of price
range_volrulesum(log(H / L), 20) / 20 > 0.03
Average log high/low range above 3%
vol_ratiorulestd(log(C / C[-1]), 5) > std(log(C / C[-1]), 60)
5-day volatility above 60-day volatility
vol_upforecastWill volatility be higher over the next month?
Higher volatility next month
hv30forecastWill annualized volatility over the next 21 sessions exceed 30%?
Next-month volatility above 30%

Answers

QuestionAnswerReading
hv_cc
20-day close-to-close volatility above 50%
0.1042false
atr_pct
ATR over 3% of price
0.848true
range_vol
Average log high/low range above 3%
0.3554false
vol_ratio
5-day volatility above 60-day volatility
0.5391on the line (true)
vol_up
Higher volatility next month
0.44645% · close to even
hv30
Next-month volatility above 30%
0.44144% · 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"
  }
}

atr_pct log offset sqrt std sum

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.

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