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

ora-fin-0.1.15 symbols, one request each6 questions
  1. State5 symbols
  2. Questions6 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

surprise5ruleeps_surprise_pct > 5
EPS beat by more than 5%
rev_surprulerevenue_surprise_pct > 1
Revenue beat by more than 1%
streakrulebeat_streak >= 3
Beat EPS three or more quarters in a row
gaprulelast_earnings_gap > 0
Gapped up after the last report
above_preruleC > pre_earnings_close
Holding above the pre-earnings close
beat_nextforecastWill the stock beat earnings next quarter?
Beating earnings next quarter

Answers

Symbolsurprise5rulerev_surprulestreakrulegapruleabove_prerulebeat_nextforecast
AAPL0.94630.05370.94630.05370.8310.545
NVDA0.94630.94630.94630.94630.21410.516
COST0.05370.05370.06830.05370.94630.481
JPM0.08440.05370.05370.94630.65050.506
NKE0.94630.05370.94630.05370.9240.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.

ora-fin-0.1.15 symbols, one request each6 questions
  1. State5 symbols
  2. Questions6 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"KO"} then PEP, PG, MO, VZ, one request each. The server fills in the latest completed session.

Questions

yieldrulediv_yield_ttm > 3
Trailing yield above 3%
growthruleyears_of_growth >= 10
Ten or more years of dividend growth
changerulediv_change_pct > 3
Last payment raised more than 3%
countrulediv_count_ttm >= 4
Pays at least quarterly
trendEnglish → ruleIs the stock above its 200-day moving average?
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symbolyieldrulegrowthrulechangerulecountruletrendruledrop5forecast
KO0.05370.94630.22230.550.94630.361
PEP0.94630.94630.22230.550.10340.418
PG0.20910.94630.22230.550.94310.357
MO0.94630.94630.94630.550.94630.543
VZ0.94630.94630.22230.550.34480.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.

ora-fin-0.1.15 symbols, one request each6 questions1 actionworkflow · Mon–Fri at 17:30 ET
  1. ScheduleMon–Fri at 17:30 ET
  2. State5 symbols
  3. Questions6 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

{"symbol":"SPY"} then QQQ, IWM, TLT, GLD, one request each. The server fills in the latest completed session.

Questions

trendruleC > sma(C, 200)
Above the 200-day
momruleroc(C, 20) > 0
Positive 20-day momentum
osrulersi(C, 2) < 10
Two-day RSI under 10
squeezerule(bbupper(C, 20, 2) - bblower(C, 20, 2)) / bbmid(C, 20) < 0.06
Bollinger bands narrower than 6% of price
up_weekforecastWill the stock be higher in a week?
Higher in a week
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symboltrendrulemomruleosrulesqueezeruleup_weekforecastdrop5forecastFired
SPY0.94510.14580.51640.8990.5980.203snapshot
QQQ0.79870.06320.53560.07890.5610.443snapshot
IWM0.55640.34950.19380.83860.5260.234snapshot
TLT0.11270.9340.06630.13710.5610.164snapshot
GLD0.05370.15530.5940.2780.5660.435snapshot

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
SPY 1 of 1 fired · dry run, nothing sent
snapshotwould send (dry run)Webhook → research-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
}
QQQ 1 of 1 fired · dry run, nothing sent
snapshotwould send (dry run)Webhook → research-warehouse
{
  "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
}
IWM 1 of 1 fired · dry run, nothing sent
snapshotwould send (dry run)Webhook → research-warehouse
{
  "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
}
TLT 1 of 1 fired · dry run, nothing sent
snapshotwould send (dry run)Webhook → research-warehouse
{
  "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
}
GLD 1 of 1 fired · dry run, nothing sent
snapshotwould send (dry run)Webhook → research-warehouse
{
  "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
        }
      }
    }
  ]
}

bblower bbmid bbupper roc rsi sma

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.

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

State

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

Questions

zrulezscore(C, 20) < -2
Two deviations under the 20-day mean
pctbEnglish → ruleIs Bollinger %B below 0.2?
below_bandruleC < bblower(C, 20, 2)
Closed under the lower Bollinger band
back_insiderulecrossup(C, bblower(C, 20, 2))
Crossed back above the lower band
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
z
Two deviations under the 20-day mean
0.0585false
pctb
Is Bollinger %B below 0.2
compiled to (C - bblower(C, 20)) / (bbupper(C, 20) - bblower(C, 20)) < 0.2
0.074false
below_band
Closed under the lower Bollinger band
0.0568false
back_inside
Crossed back above the lower band
0.05false
rally5
A 5% rally within a month
0.38138% · 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"
  }
}

bblower bbupper crossup zscore

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.

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

State

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

Questions

cum_ratiorulecum(C > C[-1]) > cum(C < C[-1])
More up days than down days over the whole history
recentrulesum(C > C[-1], 20) > 10
More than 10 up days of the last 20
sign_sumrulesum(sign(C - C[-1]), 20) > 0
Net up days over 20 sessions positive
mostly_uprulesum(C > C[-1], 10) >= 6
Up on at least six of the last ten days
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

Symbolcum_ratiorulerecentrulesign_sumrulemostly_upruleup_weekforecast
SPY0.94630.450.450.550.598
TLT0.05370.94140.94140.550.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"
  }
}

cum offset sign sum

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.

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

State

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

Questions

hhruleswinghigh(5, 1) > swinghigh(5, 2)
Latest swing high above the one before
hh2ruleswinghigh(5, 2) > swinghigh(5, 3)
Second swing high above the third
hlruleswinglow(5, 1) > swinglow(5, 2)
Latest swing low above the one before
hl2ruleswinglow(5, 2) > swinglow(5, 3)
Second swing low above the third
above_shruleC > swinghigh(5)
Above its last confirmed swing high
break_resforecastWill it break above resistance this week?
Breaking resistance this week

Answers

QuestionAnswerReading
hh
Latest swing high above the one before
0.833true
hh2
Second swing high above the third
0.6229true
hl
Latest swing low above the one before
0.8195true
hl2
Second swing low above the third
0.2302false
above_sh
Above its last confirmed swing high
0.0546false
break_res
Breaking resistance this week
0.48248% · 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"
  }
}

swinghigh swinglow

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.

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

State

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

Questions

rsirulersi(C, 14) > 70
RSI over 70
stochrulestochk(14) > 80 and stochk(14) > stochd(14)
Stochastic %K over 80 and above %D
ccirulecci(20) > 100
CCI over 100
willrrulewillr(14) > -20
Williams %R above -20
down_weekforecastWill the stock be lower in a week?
Lower in a week

Answers

QuestionAnswerReading
rsi
RSI over 70
0.392false
stoch
Stochastic %K over 80 and above %D
0.6275true
cci
CCI over 100
0.6086true
willr
Williams %R above -20
0.6317true
down_week
Lower in a week
0.51451% · 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"
  }
}

cci rsi stochd stochk willr

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.

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

State

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

Questions

sma_xrulesma(C, 10) > sma(C, 30)
10-day SMA above the 30-day
ema_xruleema(C, 10) > ema(C, 30)
10-day EMA above the 30-day
wma_xrulewma(C, 10) > wma(C, 30)
10-day WMA above the 30-day
rma_xrulerma(C, 10) > rma(C, 30)
10-day RMA above the 30-day
crossuprulecrossup(ema(C, 10), ema(C, 30))
10-day EMA crossed above the 30-day today
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
sma_x
10-day SMA above the 30-day
0.0778false
ema_x
10-day EMA above the 30-day
0.1207false
wma_x
10-day WMA above the 30-day
0.1136false
rma_x
10-day RMA above the 30-day
0.6646true
crossup
10-day EMA crossed above the 30-day today
0.05false
up_week
Higher in a week
0.54655% · 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"
  }
}

crossup ema rma sma wma

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.

ora-fin-0.1.1GLD5 questions2 actions
  1. StateGLD
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

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

Questions

breakoutruleC > highest(C, 20)
20-day closing breakout
donchianruleC > highest(C, 55)
55-day closing breakout
recent_highrulehighestbars(H, 20) <= 3
Set its 20-day high in the last four sessions
new_highforecastWill it make a new 20-day high in the next week?
A new 20-day high next week
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
breakout
20-day closing breakout
0.0619false
donchian
55-day closing breakout
0.0537false
recent_high
Set its 20-day high in the last four sessions
0.083false
new_high
A new 20-day high next week
0.0394% · unlikely
up_week
Higher in a week
0.56657% · close to even

Actions

Rules on the answers decide what to send.

breakout >= 0.6 and new_high < 0.4→Slackquant-research
breakout >= 0.6→Emailme
What each action would send 0 of 2 fired · dry run, nothing sent
disagreerule false: skipped
agreerule false: skipped

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

highest highestbars

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.

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

State

{"symbol":"NVDA"} then WMT, ORCL, CRM, one request each. The server fills in the latest completed session.

Questions

earn_nearruledays_to_earnings <= 5 or days_since_earnings <= 2
Within 5 days before or 2 days after earnings
split_nearruledays_since_split <= 30 or days_to_split <= 30
Within 30 days of a split
reverserulereverse_split_last > 0.5
Last split was a reverse split
big_reactionruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%

Answers

Symbolearn_nearrulesplit_nearrulereverserulebig_reactionrule
NVDA0.05370.05370.14090.9463
WMT0.05370.05370.14090.9338
ORCL0.05370.05370.14090.0537
CRM0.05370.05370.14090.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.

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