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

Portfolio manager (long-only): 20 ways to use Ora

Benchmark-aware stock picking: entry timing, trims, earnings risk and sector tilts. Each example is a complete, runnable request with the real answers it returned (46 requests, captured 2026-10-31), what they mean and, where it fits, the action it would send.

Answers were captured on ora-fin-0.1.1. Another model changes the request JSON and the Playground link; run it there to see its answers.
Rule functions and facts used by this player (64)

sma 11ref 5abs 4roc 4max 4offset 3atr 2last_earnings_move 2adx 2diminus 2diplus 2ema 2beat_eps_last 2last_earnings_gap 2min 2avg 2between 1rsi 1wma 1cci 1willr 1beats_last4 1days_to_earnings 1linreg 1beat_revenue_last 1eps_year_ago 1last_eps 1pre_earnings_close 1revenue_growth_yoy 1harami_bull 1morning_star 1piercing_line 1cut_last 1div_yield_ttm 1years_of_growth 1crossdown 1lowest 1median 1obv 1sign 1sum 1tr 1doji 1highestbars 1macdhist 1dark_cloud 1engulfing_bear 1evening_star 1days_since_earnings 1lowestbars 1zscore 1gap_down 1hlc3 1mean 1rec 1rma 1days_since_split 1days_to_ex_div 1days_to_split 1last_split_ratio 1raised_last 1swinghigh 1swinglow 1three_black_crows 1

Examples 1–10 of 20 · page 1 of 2

Portfolio manager (long-only) · example 1

Timing an add to MSFT in a long-only book

The thesis is set; the PM wants to add on weakness inside the trend rather than into strength.

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

trendEnglish → ruleIs the stock above its 200-day moving average?
pullbackrule(C > sma(C, 50)) and (sma(C, 50) > sma(C, 200)) and (L <= sma(C, 20) * 1.01) and (C >= sma(C, 20))
Uptrend pullback to the 20-day (entry zone)
rsi_midrulebetween(rsi(C, 14), 35, 55)
RSI(14) between 35 and 55
wma_uprulewma(C, 10) > wma(C, 30)
10-day weighted average above the 30-day
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
trend
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.9463true
pullback
Uptrend pullback to the 20-day (entry zone)
0.2573false
rsi_mid
RSI(14) between 35 and 55
0.95true
wma_up
10-day weighted average above the 30-day
0.5008on the line (true)
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: Is the stock above its 200-day moving average; RSI(14) between 35 and 55. Not true: Uptrend pullback to the 20-day (entry zone). On the line: 10-day weighted average above the 30-day. Forecasts: Higher in a week 57%.

Trend true with a pullback to the 20-day is the add zone; if the stock is extended instead, the PM leaves the order resting lower.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MSFT"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "pullback": {
      "type": "yes_no",
      "ask": "(C > sma(C, 50)) and (sma(C, 50) > sma(C, 200)) and (L <= sma(C, 20) * 1.01) and (C >= sma(C, 20))"
    },
    "rsi_mid": {
      "type": "yes_no",
      "ask": "between(rsi(C, 14), 35, 55)"
    },
    "wma_up": {
      "type": "yes_no",
      "ask": "wma(C, 10) > wma(C, 30)"
    },
    "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": {
    "trend": {
      "yes_no": 0.9463,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "pullback": {
      "yes_no": 0.2573,
      "rule": "(C > sma(C, 50)) and (sma(C, 50) > sma(C, 200)) and (L <= sma(C, 20) * 1.01) and (C >= sma(C, 20))",
      "basis": "rule"
    },
    "rsi_mid": {
      "yes_no": 0.95,
      "rule": "between(rsi(C, 14), 35, 55)",
      "basis": "rule"
    },
    "wma_up": {
      "yes_no": 0.5008,
      "rule": "wma(C, 10) > wma(C, 30)",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.574
    }
  },
  "context": {
    "symbol": "MSFT",
    "as_of": "2026-10-30"
  }
}

between rsi sma wma

Portfolio manager (long-only) · example 2

Trim LLY into strength or hold the overweight?

LLY has grown into a large active weight; decide whether price is stretched enough to trim part of it.

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

State

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

Questions

stretchedruleC > sma(C, 20) + 2 * atr(14)
Stretched: more than 2 ATR above the 20-day
extEnglish → ruleIs the stock more than 10% above its 200-day moving average?
cci_hotrulecci(20) > 150
CCI(20) above 150
willr_toprulewillr(14) > -20
Williams %R above −20
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
stretched
Stretched: more than 2 ATR above the 20-day
0.919true
ext
Is the stock more than 10% above its 200-day moving average
compiled to C > sma(C, 200) * 1.1
0.9463true
cci_hot
CCI(20) above 150
0.7458true
willr_top
Williams %R above −20
0.6655true
drop5
A 5% drawdown within a month
0.58358% · close to even

Actions

Rules on the answers decide what to send.

stretched >= 0.6 and (cci_hot >= 0.6 or willr_top >= 0.6)→Emailpm-team
else→Emailpm-team
What each action would send 1 of 2 fired · dry run, nothing sent
trimwould send (dry run)Email → pm-team
{
  "subject": "LLY: trim candidate (2026-10-30)",
  "text": "LLY is 2 ATR over its 20-day with an overbought oscillator (CCI 75%, Williams %R 67%). 5% drawdown odds within a month: 58%. Proposal: trim a third of the active weight."
}
holdrule false: skipped

What it means

For LLY on the session of 2026-10-30: True now: Stretched: more than 2 ATR above the 20-day; Is the stock more than 10% above its 200-day moving average; CCI(20) above 150; Williams %R above −20. Forecasts: A 5% drawdown within a month 58%. Fired: trim (Email → pm-team).

The trim email needs price stretch and an oscillator to agree; the else branch documents that the weight was reviewed and kept.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "LLY"
  },
  "questions": {
    "stretched": {
      "type": "yes_no",
      "ask": "C > sma(C, 20) + 2 * atr(14)"
    },
    "ext": {
      "type": "yes_no",
      "instructions": "Is the stock more than 10% above its 200-day moving average?"
    },
    "cci_hot": {
      "type": "yes_no",
      "ask": "cci(20) > 150"
    },
    "willr_top": {
      "type": "yes_no",
      "ask": "willr(14) > -20"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "trim",
      "when": "stretched >= 0.6 and (cci_hot >= 0.6 or willr_top >= 0.6)",
      "do": "email",
      "connection": "pm-team",
      "subject": "{{symbol}}: trim candidate ({{as_of}})",
      "message": "{{symbol}} is 2 ATR over its 20-day with an overbought oscillator (CCI {{cci_hot|pct}}, Williams %R {{willr_top|pct}}). 5% drawdown odds within a month: {{drop5|pct}}. Proposal: trim a third of the active weight."
    },
    {
      "id": "hold",
      "when": "else",
      "do": "email",
      "connection": "pm-team",
      "subject": "{{symbol}}: hold the weight",
      "message": "{{symbol}} ({{as_of}}) is not stretched (rule {{stretched|pct}}). No trim proposed."
    }
  ],
  "dry_run": true
}
Response JSON (LLY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "stretched": {
      "yes_no": 0.919,
      "rule": "C > sma(C, 20) + 2 * atr(14)",
      "basis": "rule"
    },
    "ext": {
      "yes_no": 0.9463,
      "rule": "C > sma(C, 200) * 1.1",
      "basis": "comparison"
    },
    "cci_hot": {
      "yes_no": 0.7458,
      "rule": "cci(20) > 150",
      "basis": "rule"
    },
    "willr_top": {
      "yes_no": 0.6655,
      "rule": "willr(14) > -20",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.583
    }
  },
  "context": {
    "symbol": "LLY",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "trim",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "pm-team",
      "preview": {
        "subject": "LLY: trim candidate (2026-10-30)",
        "text": "LLY is 2 ATR over its 20-day with an overbought oscillator (CCI 75%, Williams %R 67%). 5% drawdown odds within a month: 58%. Proposal: trim a third of the active weight."
      }
    },
    {
      "id": "hold",
      "fired": false,
      "status": "skipped"
    }
  ]
}

atr cci sma willr

Portfolio manager (long-only) · example 3

Which holdings report in the next two weeks?

Before the earnings season, list the core holdings with a report coming and how they reacted last time.

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

State

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

Questions

soonEnglish → ruleIs earnings in the next 14 days?
big_lastruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%
beat_streakEnglish → ruleHas the stock beaten EPS estimates in at least 3 of the last 4 quarters?
pre_trendruledays_to_earnings <= 10 and C > sma(C, 50)
Earnings within 10 days, above the 50-day

Answers

Symbolsoonrulebig_lastrulebeat_streakrulepre_trendrule
AAPL0.94630.94630.85910.9119
AMZN0.05370.05370.14090.0537
JPM0.05370.06640.14090.0537
UNH0.05370.05370.85910.0537
COST0.05370.05370.550.0537

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: Is earnings in the next 14 days: true for AAPL of 5. Last earnings move bigger than 5%: true for AAPL of 5. Has the stock beaten EPS estimates in at least 3 of the last 4 quarters: true for AAPL, UNH of 5. Earnings within 10 days, above the 50-day: true for AAPL of 5.

Names with a report close and a large last reaction are where position sizing matters most going into the print.

Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "soon": {
      "type": "yes_no",
      "instructions": "Is earnings in the next 14 days?"
    },
    "big_last": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    },
    "beat_streak": {
      "type": "yes_no",
      "instructions": "Has the stock beaten EPS estimates in at least 3 of the last 4 quarters?"
    },
    "pre_trend": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10 and C > sma(C, 50)"
    }
  }
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "soon": {
      "yes_no": 0.9463,
      "rule": "days_to_earnings <= 14",
      "basis": "pattern"
    },
    "big_last": {
      "yes_no": 0.9463,
      "rule": "abs(last_earnings_move) > 5",
      "basis": "rule"
    },
    "beat_streak": {
      "yes_no": 0.8591,
      "rule": "beats_last4 >= 3",
      "basis": "pattern"
    },
    "pre_trend": {
      "yes_no": 0.9119,
      "rule": "days_to_earnings <= 10 and C > sma(C, 50)",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  }
}

abs beats_last4 days_to_earnings last_earnings_move sma

Portfolio manager (long-only) · example 4

Sector tilt check: technology vs health care

Compare the two largest sector bets in the portfolio on trend, momentum and odds of beating the market.

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

State

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

Questions

trendruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
momruleroc(C, 20) > 5
Up more than 5% in 20 sessions
linreg_uprulelinreg(C, 50) > ref(linreg(C, 50), -10)
50-day regression line rising over two weeks
adxruleadx(14) > 20 and diplus(14) > diminus(14)
Trending up (ADX over 20 and +DI over −DI)
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulemomrulelinreg_upruleadxrulebeat_spyforecast
XLK0.07010.05370.12110.06370.498
XLV0.93840.91570.9410.90420.534

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: Stacked averages: close > 20 EMA > 50 > 200: true for XLV of 2. Up more than 5% in 20 sessions: true for XLV of 2. 50-day regression line rising over two weeks: true for XLV of 2. Trending up (ADX over 20 and +DI over −DI): true for XLV of 2. Highest odds for “Beating SPY over a month”: XLV at 53%.

The sleeve with more trend rules true and better odds against SPY keeps its overweight; the weaker one is the funding source.

Request JSON (XLK; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLK"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
    },
    "mom": {
      "type": "yes_no",
      "ask": "roc(C, 20) > 5"
    },
    "linreg_up": {
      "type": "yes_no",
      "ask": "linreg(C, 50) > ref(linreg(C, 50), -10)"
    },
    "adx": {
      "type": "yes_no",
      "ask": "adx(14) > 20 and diplus(14) > diminus(14)"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  }
}
Response JSON (XLK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.0701,
      "rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "mom": {
      "yes_no": 0.0537,
      "rule": "roc(C, 20) > 5",
      "basis": "rule"
    },
    "linreg_up": {
      "yes_no": 0.1211,
      "rule": "linreg(C, 50) > ref(linreg(C, 50), -10)",
      "basis": "rule"
    },
    "adx": {
      "yes_no": 0.0637,
      "rule": "adx(14) > 20 and diplus(14) > diminus(14)",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.498
    }
  },
  "context": {
    "symbol": "XLK",
    "as_of": "2026-10-30"
  }
}

adx diminus diplus ema linreg ref roc sma

Portfolio manager (long-only) · example 5

NFLX post-earnings review for the investment committee

Summarize what the last report did: beat or miss, revenue growth, the gap and whether the stock holds above the pre-report close.

ora-fin-0.1.1NFLX6 questions2 actions
  1. StateNFLX
  2. Questions6 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

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

Questions

beat_bothrulebeat_eps_last > 0.5 and beat_revenue_last > 0.5
Beat on EPS and revenue last quarter
rev_growthEnglish → ruleDid revenue grow more than 5% year over year?
gaprulelast_earnings_gap > 0
Gapped up after the last report
above_preruleC > pre_earnings_close
Holding above the pre-earnings close
eps_upEnglish → ruleIs EPS up year over year?
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
beat_both
Beat on EPS and revenue last quarter
0.8591true
rev_growth
Did revenue grow more than 5% year over year
compiled to revenue_growth_yoy > 5
0.9463true
gap
Gapped up after the last report
0.0537false
above_pre
Holding above the pre-earnings close
0.1227false
eps_up
Is EPS up year over year
compiled to last_eps > eps_year_ago
0.9463true
up_week
Higher in a week
0.50651% · close to even

Actions

Rules on the answers decide what to send.

beat_both >= 0.6→Slackinvestment-committee
else→Slackinvestment-committee
What each action would send 1 of 2 fired · dry run, nothing sent
ic_notewould send (dry run)Slack → investment-committee
{
  "text": "NFLX (2026-10-30): beat on EPS and revenue (86%), revenue growth over 5% 95%, holding above pre-earnings close 12%."
}
miss_noterule false: skipped

What it means

For NFLX on the session of 2026-10-30: True now: Beat on EPS and revenue last quarter; Did revenue grow more than 5% year over year; Is EPS up year over year. Not true: Gapped up after the last report; Holding above the pre-earnings close. Forecasts: Higher in a week 51%. Fired: ic_note (Slack → investment-committee).

The committee gets one line either way: a beat summary, or a flag to revisit the thesis.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NFLX"
  },
  "questions": {
    "beat_both": {
      "type": "yes_no",
      "ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
    },
    "rev_growth": {
      "type": "yes_no",
      "instructions": "Did revenue grow more than 5% year over year?"
    },
    "gap": {
      "type": "yes_no",
      "ask": "last_earnings_gap > 0"
    },
    "above_pre": {
      "type": "yes_no",
      "ask": "C > pre_earnings_close"
    },
    "eps_up": {
      "type": "yes_no",
      "instructions": "Is EPS up year over year?"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  },
  "actions": [
    {
      "id": "ic_note",
      "when": "beat_both >= 0.6",
      "do": "slack",
      "connection": "investment-committee",
      "message": "{{symbol}} ({{as_of}}): beat on EPS and revenue ({{beat_both|pct}}), revenue growth over 5% {{rev_growth|pct}}, holding above pre-earnings close {{above_pre|pct}}."
    },
    {
      "id": "miss_note",
      "when": "else",
      "do": "slack",
      "connection": "investment-committee",
      "message": "{{symbol}} ({{as_of}}): did not beat on both lines ({{beat_both|pct}}). Thesis review on the agenda."
    }
  ],
  "dry_run": true
}
Response JSON (NFLX, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "beat_both": {
      "yes_no": 0.8591,
      "rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
      "basis": "rule"
    },
    "rev_growth": {
      "yes_no": 0.9463,
      "rule": "revenue_growth_yoy > 5",
      "basis": "pattern"
    },
    "gap": {
      "yes_no": 0.0537,
      "rule": "last_earnings_gap > 0",
      "basis": "rule"
    },
    "above_pre": {
      "yes_no": 0.1227,
      "rule": "C > pre_earnings_close",
      "basis": "rule"
    },
    "eps_up": {
      "yes_no": 0.9463,
      "rule": "last_eps > eps_year_ago",
      "basis": "pattern"
    },
    "up_week": {
      "yes_no": 0.506
    }
  },
  "context": {
    "symbol": "NFLX",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "ic_note",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "investment-committee",
      "preview": {
        "text": "NFLX (2026-10-30): beat on EPS and revenue (86%), revenue growth over 5% 95%, holding above pre-earnings close 12%."
      }
    },
    {
      "id": "miss_note",
      "fired": false,
      "status": "skipped"
    }
  ]
}

beat_eps_last beat_revenue_last eps_year_ago last_earnings_gap last_eps pre_earnings_close revenue_growth_yoy

Portfolio manager (long-only) · example 6

Is the cap-weighted index leaving equal-weight behind?

A concentrated benchmark makes underweights painful; compare SPY with the equal-weight RSP on trend and momentum.

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 RSP, one request each. The server fills in the latest completed session.

Questions

mom3mruleC > C[-63]
Higher than three months ago
rocruleroc(C, 63) > 5
Up more than 5% over three months
near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
ema_trendruleC > ema(C, 50)
Above the 50-day exponential average
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symbolmom3mrulerocrulenear_highruleema_trendrulebeat_spyforecast
SPY0.38090.05370.08340.1230.514
RSP0.59710.12140.40490.82380.446

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: Higher than three months ago: true for none of 2. Up more than 5% over three months: true for none of 2. Within 2% of the 52-week high: true for none of 2. Above the 50-day exponential average: true for RSP of 2. Highest odds for “Beating SPY over a month”: SPY at 51%.

If SPY shows momentum that RSP lacks, breadth is narrow and the book's equal-ish weights will lag the benchmark.

Request JSON (SPY; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "mom3m": {
      "type": "yes_no",
      "ask": "C > C[-63]"
    },
    "roc": {
      "type": "yes_no",
      "ask": "roc(C, 63) > 5"
    },
    "near_high": {
      "type": "yes_no",
      "ask": "C >= 0.98 * max(H, 252)"
    },
    "ema_trend": {
      "type": "yes_no",
      "ask": "C > ema(C, 50)"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  }
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "mom3m": {
      "yes_no": 0.3809,
      "rule": "C > C[-63]",
      "basis": "rule"
    },
    "roc": {
      "yes_no": 0.0537,
      "rule": "roc(C, 63) > 5",
      "basis": "rule"
    },
    "near_high": {
      "yes_no": 0.0834,
      "rule": "C >= 0.98 * max(H, 252)",
      "basis": "rule"
    },
    "ema_trend": {
      "yes_no": 0.123,
      "rule": "C > ema(C, 50)",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.514
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  }
}

ema max offset roc

Portfolio manager (long-only) · example 7

Did UNH print a reversal candle near its lows?

A beaten-down holding: look for a morning star, piercing line or bullish harami before adding back.

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

State

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

Questions

starrulemorning_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.
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).
haramiruleharami_bull()
harami bull candle: A small green body inside yesterday's red body.
near_lowEnglish → ruleIs the stock within 10% of its 52-week low?
below_200dEnglish → ruleIs the stock below its 200-day moving average?
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
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.
0.0925false
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.1039false
harami
harami bull candle: A small green body inside yesterday's red body.
0.1039false
near_low
Is the stock within 10% of its 52-week low
compiled to abs(C / min(L, 252) - 1) <= 0.1
0.0537false
below_200d
Is the stock below its 200-day moving average
compiled to C < sma(C, 200)
0.0537false
up_week
Higher in a week
0.48549% · close to even

What it means

For UNH on the session of 2026-10-30: Not true: 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.; piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open).; harami bull candle: A small green body inside yesterday's red body.; Is the stock within 10% of its 52-week low; Is the stock below its 200-day moving average. Forecasts: Higher in a week 49%.

A reversal candle near the 52-week low is a reason to re-examine the add, while the 200-day rule says whether the downtrend is still intact.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "UNH"
  },
  "questions": {
    "star": {
      "type": "yes_no",
      "ask": "morning_star()"
    },
    "piercing": {
      "type": "yes_no",
      "ask": "piercing_line()"
    },
    "harami": {
      "type": "yes_no",
      "ask": "harami_bull()"
    },
    "near_low": {
      "type": "yes_no",
      "instructions": "Is the stock within 10% of its 52-week low?"
    },
    "below_200d": {
      "type": "yes_no",
      "instructions": "Is the stock below its 200-day moving average?"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  }
}
Response JSON (UNH, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "star": {
      "yes_no": 0.0925,
      "rule": "morning_star()",
      "basis": "rule"
    },
    "piercing": {
      "yes_no": 0.1039,
      "rule": "piercing_line()",
      "basis": "rule"
    },
    "harami": {
      "yes_no": 0.1039,
      "rule": "harami_bull()",
      "basis": "rule"
    },
    "near_low": {
      "yes_no": 0.0537,
      "rule": "abs(C / min(L, 252) - 1) <= 0.1",
      "basis": "comparison"
    },
    "below_200d": {
      "yes_no": 0.0537,
      "rule": "C < sma(C, 200)",
      "basis": "comparison"
    },
    "up_week": {
      "yes_no": 0.485
    }
  },
  "context": {
    "symbol": "UNH",
    "as_of": "2026-10-30"
  }
}

abs harami_bull min morning_star piercing_line sma

Portfolio manager (long-only) · example 8

Quality dividend sleeve: who still qualifies?

Monthly screen of the dividend sleeve: pays, has grown for a decade, did not cut, and is above its 200-day.

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

State

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

Questions

growerruleyears_of_growth >= 10
Ten years of dividend growth
no_cutrulecut_last < 0.5
Did not cut its last dividend
trendEnglish → ruleIs the stock above its 200-day moving average?
yieldEnglish → ruleIs the dividend yield above 3%?

Answers

Symbolgrowerruleno_cutruletrendruleyieldrule
JNJ0.94630.85910.94540.0648
PG0.94630.85910.94310.2091
PEP0.94630.85910.10340.9463
KO0.94630.85910.94630.0537
MCD0.94630.85910.06570.0537

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: Ten years of dividend growth: true for JNJ, PG, PEP, KO, MCD of 5. Did not cut its last dividend: true for JNJ, PG, PEP, KO, MCD of 5. Is the stock above its 200-day moving average: true for JNJ, PG, KO of 5. Is the dividend yield above 3%: true for PEP of 5.

A name that fails the growth or no-cut fact leaves the sleeve; the trend rule decides whether new money goes in now or later.

Request JSON (JNJ; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JNJ"
  },
  "questions": {
    "grower": {
      "type": "yes_no",
      "ask": "years_of_growth >= 10"
    },
    "no_cut": {
      "type": "yes_no",
      "ask": "cut_last < 0.5"
    },
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "yield": {
      "type": "yes_no",
      "instructions": "Is the dividend yield above 3%?"
    }
  }
}
Response JSON (JNJ, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "grower": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 10",
      "basis": "rule"
    },
    "no_cut": {
      "yes_no": 0.8591,
      "rule": "cut_last < 0.5",
      "basis": "rule"
    },
    "trend": {
      "yes_no": 0.9454,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "yield": {
      "yes_no": 0.0648,
      "rule": "div_yield_ttm > 3",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "JNJ",
    "as_of": "2026-10-30"
  }
}

cut_last div_yield_ttm sma years_of_growth

Portfolio manager (long-only) · example 9

Daily breakdown watch on the top holdings

After each close, flag any top holding that closed below its 20-day low or crossed under its 50-day.

ora-fin-0.1.16 symbols, one request each3 questions1 actionworkflow · Mon–Fri at 16:30 ET
  1. ScheduleMon–Fri at 16:30 ET
  2. State6 symbols
  3. Questions3 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

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

Questions

breakdownruleC < lowest(L, 20)
Closed under the 20-day low
lose_50drulecrossdown(C, sma(C, 50))
Closed below the 50-day today
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symbolbreakdownrulelose_50druledrop5forecastFired
AAPL0.07440.050.365none
MSFT0.3650.050.422none
NVDA0.75540.050.523flag
AMZN0.54180.050.462none
JPM0.10050.950.30flag
LLY0.05370.050.583none

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.

breakdown >= 0.6 or lose_50d >= 0.6→Slackpm-desk
AAPL 0 of 1 fired · dry run, nothing sent
MSFT 0 of 1 fired · dry run, nothing sent
NVDA 1 of 1 fired · dry run, nothing sent
flagwould send (dry run)Slack → pm-desk
{
  "text": "NVDA (2026-10-30): broke its 20-day low (76%) or lost the 50-day (5%). 5% drawdown odds: 52%."
}
AMZN 0 of 1 fired · dry run, nothing sent
JPM 1 of 1 fired · dry run, nothing sent
flagwould send (dry run)Slack → pm-desk
{
  "text": "JPM (2026-10-30): broke its 20-day low (10%) or lost the 50-day (95%). 5% drawdown odds: 30%."
}
LLY 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 6 symbols: Closed under the 20-day low: true for NVDA of 6. Closed below the 50-day today: true for JPM of 6. Highest odds for “A 5% drawdown within a month”: LLY at 58%. flag fired for NVDA, JPM.

A quiet channel means no top holding broke a level; a message starts a thesis check, not an automatic sale.

As a scheduled workflow (Mon–Fri at 16: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": "Daily breakdown watch on the top holdings",
  "symbols": "AAPL MSFT NVDA AMZN JPM LLY",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "16:30",
  "model": "ora-fin-0.1.1",
  "questions": {
    "breakdown": {
      "type": "yes_no",
      "ask": "C < lowest(L, 20)"
    },
    "lose_50d": {
      "type": "yes_no",
      "ask": "crossdown(C, sma(C, 50))"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "flag",
      "when": "breakdown >= 0.6 or lose_50d >= 0.6",
      "do": "slack",
      "connection": "pm-desk",
      "message": "{{symbol}} ({{as_of}}): broke its 20-day low ({{breakdown|pct}}) or lost the 50-day ({{lose_50d|pct}}). 5% drawdown odds: {{drop5|pct}}."
    }
  ]
}
Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "breakdown": {
      "type": "yes_no",
      "ask": "C < lowest(L, 20)"
    },
    "lose_50d": {
      "type": "yes_no",
      "ask": "crossdown(C, sma(C, 50))"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "flag",
      "when": "breakdown >= 0.6 or lose_50d >= 0.6",
      "do": "slack",
      "connection": "pm-desk",
      "message": "{{symbol}} ({{as_of}}): broke its 20-day low ({{breakdown|pct}}) or lost the 50-day ({{lose_50d|pct}}). 5% drawdown odds: {{drop5|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "breakdown": {
      "yes_no": 0.0744,
      "rule": "C < lowest(L, 20)",
      "basis": "rule"
    },
    "lose_50d": {
      "yes_no": 0.05,
      "rule": "crossdown(C, sma(C, 50))",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.365
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "flag",
      "fired": false,
      "status": "skipped"
    }
  ]
}

crossdown lowest sma

Portfolio manager (long-only) · example 10

AAPL momentum quality: smooth trend or noisy spike?

Check whether the recent gains came with steady up days and rising volume, the kind of trend a long-only book prefers to hold.

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

mostly_uprulesum(C > C[-1], 10) >= 6
Up on at least six of the last ten days
sign_sumrulesum(sign(C - C[-1]), 20) > 4
At least 5 more up days than down days in 20 sessions
obvruleobv() > sma(obv(), 20)
On-balance volume above its 20-day average
median_volruleV > median(V, 20)
Volume above its 20-day median
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
mostly_up
Up on at least six of the last ten days
0.0615false
sign_sum
At least 5 more up days than down days in 20 sessions
0.109false
obv
On-balance volume above its 20-day average
0.2873false
median_vol
Volume above its 20-day median
0.9395true
rally5
A 5% rally within a month
0.44645% · close to even

What it means

For AAPL on the session of 2026-10-30: True now: Volume above its 20-day median. Not true: Up on at least six of the last ten days; At least 5 more up days than down days in 20 sessions; On-balance volume above its 20-day average. Forecasts: A 5% rally within a month 45%.

Up days outnumbering down days with OBV rising describes accumulation; a trend built on one spike day reads differently.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "mostly_up": {
      "type": "yes_no",
      "ask": "sum(C > C[-1], 10) >= 6"
    },
    "sign_sum": {
      "type": "yes_no",
      "ask": "sum(sign(C - C[-1]), 20) > 4"
    },
    "obv": {
      "type": "yes_no",
      "ask": "obv() > sma(obv(), 20)"
    },
    "median_vol": {
      "type": "yes_no",
      "ask": "V > median(V, 20)"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  }
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "mostly_up": {
      "yes_no": 0.0615,
      "rule": "sum(C > C[-1], 10) >= 6",
      "basis": "rule"
    },
    "sign_sum": {
      "yes_no": 0.109,
      "rule": "sum(sign(C - C[-1]), 20) > 4",
      "basis": "rule"
    },
    "obv": {
      "yes_no": 0.2873,
      "rule": "obv() > sma(obv(), 20)",
      "basis": "rule"
    },
    "median_vol": {
      "yes_no": 0.9395,
      "rule": "V > median(V, 20)",
      "basis": "rule"
    },
    "rally5": {
      "yes_no": 0.446
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  }
}

median obv offset sign sma 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, Quant researcher, 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.