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 · Sell side

Equity research analyst: 21 ways to use Ora

Covers a sector: earnings previews and reviews, estimate beats, dividends and the tape. 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 (69)

sma 13days_to_earnings 5beat_eps_last 4last_earnings_gap 4last_eps 4abs 3last_earnings_move 3eps_surprise_pct 3raised_last 3max 3beat_streak 2pre_earnings_close 2ema 2div_yield_ttm 2years_of_growth 2days_since_earnings 2eps_year_ago 2offset 2adx 2diminus 2diplus 2days_to_split 2beats_last4 1beat_revenue_last 1eps_growth_yoy 1roc 1cut_last 1macd 1macdsignal 1revenue_growth_yoy 1revenue_surprise_pct 1linreg 1log 1ref 1sqrt 1std 1days_since_split 1last_split_ratio 1reverse_split_last 1splits_5y 1atr 1cci 1willr 1next_report_amc 1next_report_bmo 1miss_eps_last 1misses_last4 1swinghigh 1swinglow 1hlc3 1median 1obv 1percentrank 1sum 1harami_bull 1morning_star 1piercing_line 1tweezer_bottom 1rsi 1wma 1barssince 1highest 1highestbars 1last_div_amount 1last_eps_est 1last_revenue 1next_split_ratio 1prev_div_amount 1revenue_year_ago 1

Examples 11–20 of 21 · page 2 of 3

Equity research analyst · example 11

JNJ and ABBV: dividend growth and earnings record

For a healthcare income piece, compare the payout record and the last quarter for two dividend payers.

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

State

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

Questions

grow10ruleyears_of_growth >= 10
Ten years of dividend growth
grow25English → ruleHas the stock grown its dividend for 25 years in a row?
raisedEnglish → ruleDid the stock raise its dividend last time?
beatEnglish → ruleDid the stock beat EPS estimates last quarter?
eps_posEnglish → ruleWas EPS positive last quarter?

Answers

Symbolgrow10rulegrow25ruleraisedrulebeatruleeps_posrule
JNJ0.94630.94630.14090.85910.9463
ABBV0.85910.05370.14090.85910.9463

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: Ten years of dividend growth: true for JNJ, ABBV of 2. Has the stock grown its dividend for 25 years in a row: true for JNJ of 2. Did the stock raise its dividend last time: true for none of 2. Did the stock beat EPS estimates last quarter: true for JNJ, ABBV of 2.

Facts per name sit side by side in the piece; a missing streak or a miss is stated as is.

Request JSON (JNJ; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JNJ"
  },
  "questions": {
    "grow10": {
      "type": "yes_no",
      "ask": "years_of_growth >= 10"
    },
    "grow25": {
      "type": "yes_no",
      "instructions": "Has the stock grown its dividend for 25 years in a row?"
    },
    "raised": {
      "type": "yes_no",
      "instructions": "Did the stock raise its dividend last time?"
    },
    "beat": {
      "type": "yes_no",
      "instructions": "Did the stock beat EPS estimates last quarter?"
    },
    "eps_pos": {
      "type": "yes_no",
      "instructions": "Was EPS positive last quarter?"
    }
  }
}
Response JSON (JNJ, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "grow10": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 10",
      "basis": "rule"
    },
    "grow25": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 25",
      "basis": "pattern"
    },
    "raised": {
      "yes_no": 0.1409,
      "rule": "raised_last > 0.5",
      "basis": "pattern"
    },
    "beat": {
      "yes_no": 0.8591,
      "rule": "beat_eps_last > 0.5",
      "basis": "pattern"
    },
    "eps_pos": {
      "yes_no": 0.9463,
      "rule": "last_eps > 0",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "JNJ",
    "as_of": "2026-10-30"
  }
}

beat_eps_last last_eps raised_last years_of_growth

Equity research analyst · example 12

COST: is the stock extended enough to revisit the target?

Check stretch measures before a price-target review: distance from averages, CCI and Williams %R.

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

State

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

Questions

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

Answers

QuestionAnswerReading
ext
Is the stock more than 10% above its 200-day moving average
compiled to C > sma(C, 200) * 1.1
0.0813false
cci
CCI above 100
0.5137on the line (true)
willr
Williams %R above −20
0.6319true
stretch
Stretched: more than 2 ATR above the 20-day
0.5662on the line (true)
drop5
A 5% drawdown within a month
0.31932% · unlikely

What it means

For COST on the session of 2026-10-30: True now: Williams %R above −20. Not true: Is the stock more than 10% above its 200-day moving average. On the line: CCI above 100; Stretched: more than 2 ATR above the 20-day. Forecasts: A 5% drawdown within a month 32%.

Several stretch rules true supports a valuation discussion; the drawdown odds are context, not a call.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "COST"
  },
  "questions": {
    "ext": {
      "type": "yes_no",
      "instructions": "Is the stock more than 10% above its 200-day moving average?"
    },
    "cci": {
      "type": "yes_no",
      "ask": "cci(20) > 100"
    },
    "willr": {
      "type": "yes_no",
      "ask": "willr(14) > -20"
    },
    "stretch": {
      "type": "yes_no",
      "ask": "C > sma(C, 20) + 2 * atr(14)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (COST, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "ext": {
      "yes_no": 0.0813,
      "rule": "C > sma(C, 200) * 1.1",
      "basis": "comparison"
    },
    "cci": {
      "yes_no": 0.5137,
      "rule": "cci(20) > 100",
      "basis": "rule"
    },
    "willr": {
      "yes_no": 0.6319,
      "rule": "willr(14) > -20",
      "basis": "rule"
    },
    "stretch": {
      "yes_no": 0.5662,
      "rule": "C > sma(C, 20) + 2 * atr(14)",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.319
    }
  },
  "context": {
    "symbol": "COST",
    "as_of": "2026-10-30"
  }
}

atr cci sma willr

Equity research analyst · example 13

Who reports next: AAPL, MSFT, AMZN, NVDA, TSLA

A Sunday-evening workflow that tells the team which mega caps report within two weeks and whether before the open or after the close.

ora-fin-0.1.15 symbols, one request each4 questions1 actionworkflow · Mon at 07:00 ET
  1. ScheduleMon at 07:00 ET
  2. State5 symbols
  3. Questions4 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

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

Questions

soonEnglish → ruleIs earnings in the next 14 days?
bmoEnglish → ruleDoes the stock report before the market opens next time?
amcEnglish → ruleDoes the stock report after the close next time?
streakrulebeat_streak >= 4
Beat four quarters in a row

Answers

SymbolsoonrulebmoruleamcrulestreakruleFired
AAPL0.94630.14090.85910.9463calendar
MSFT0.05370.14090.85910.9463none
AMZN0.05370.14090.85910.0537none
NVDA0.10330.14090.85910.9463none
TSLA0.05370.14090.85910.0537none

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.

soon >= 0.6→Slackresearch-desk
AAPL 1 of 1 fired · dry run, nothing sent
calendarwould send (dry run)Slack → research-desk
{
  "text": "AAPL reports within 14 days. Before the open 14%, after the close 86%. Four-quarter beat streak 95%."
}
MSFT 0 of 1 fired · dry run, nothing sent
AMZN 0 of 1 fired · dry run, nothing sent
NVDA 0 of 1 fired · dry run, nothing sent
TSLA 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 5 symbols: Is earnings in the next 14 days: true for AAPL of 5. Does the stock report before the market opens next time: true for none of 5. Does the stock report after the close next time: true for AAPL, MSFT, AMZN, NVDA, TSLA of 5. Beat four quarters in a row: true for AAPL, MSFT, NVDA of 5. calendar fired for AAPL.

Only names with a report inside two weeks post; the timing flags tell the team who covers the morning or the evening.

As a scheduled workflow (Mon at 07:00 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": "Who reports next: AAPL, MSFT, AMZN, NVDA, TSLA",
  "symbols": "AAPL MSFT AMZN NVDA TSLA",
  "days": [
    1
  ],
  "at_time": "07:00",
  "model": "ora-fin-0.1.1",
  "questions": {
    "soon": {
      "type": "yes_no",
      "instructions": "Is earnings in the next 14 days?"
    },
    "bmo": {
      "type": "yes_no",
      "instructions": "Does the stock report before the market opens next time?"
    },
    "amc": {
      "type": "yes_no",
      "instructions": "Does the stock report after the close next time?"
    },
    "streak": {
      "type": "yes_no",
      "ask": "beat_streak >= 4"
    }
  },
  "actions": [
    {
      "id": "calendar",
      "when": "soon >= 0.6",
      "do": "slack",
      "connection": "research-desk",
      "message": "{{symbol}} reports within 14 days. Before the open {{bmo|pct}}, after the close {{amc|pct}}. Four-quarter beat streak {{streak|pct}}."
    }
  ]
}
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?"
    },
    "bmo": {
      "type": "yes_no",
      "instructions": "Does the stock report before the market opens next time?"
    },
    "amc": {
      "type": "yes_no",
      "instructions": "Does the stock report after the close next time?"
    },
    "streak": {
      "type": "yes_no",
      "ask": "beat_streak >= 4"
    }
  },
  "actions": [
    {
      "id": "calendar",
      "when": "soon >= 0.6",
      "do": "slack",
      "connection": "research-desk",
      "message": "{{symbol}} reports within 14 days. Before the open {{bmo|pct}}, after the close {{amc|pct}}. Four-quarter beat streak {{streak|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "soon": {
      "yes_no": 0.9463,
      "rule": "days_to_earnings <= 14",
      "basis": "pattern"
    },
    "bmo": {
      "yes_no": 0.1409,
      "rule": "next_report_bmo > 0.5",
      "basis": "pattern"
    },
    "amc": {
      "yes_no": 0.8591,
      "rule": "next_report_amc > 0.5",
      "basis": "pattern"
    },
    "streak": {
      "yes_no": 0.9463,
      "rule": "beat_streak >= 4",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "calendar",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "research-desk",
      "preview": {
        "text": "AAPL reports within 14 days. Before the open 14%, after the close 86%. Four-quarter beat streak 95%."
      }
    }
  ]
}

beat_streak days_to_earnings next_report_amc next_report_bmo

Equity research analyst · example 14

INTC: recent misses and the trend under them

Document the earnings record for a name with mixed results: any miss in four quarters, growth and price trend.

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

State

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

Questions

any_missEnglish → ruleHas the stock missed EPS estimates in any of the last 4 quarters?
miss_lastEnglish → ruleDid the stock miss EPS estimates last quarter?
eps_downrulelast_eps < eps_year_ago
EPS down year over year
below_200English → ruleIs the stock below its 200-day moving average?
lh_llEnglish → ruleIs the stock making lower swing highs and lower swing lows?

Answers

QuestionAnswerReading
any_miss
Has the stock missed EPS estimates in any of the last 4 quarters
compiled to misses_last4 >= 1
0.1409false
miss_last
Did the stock miss EPS estimates last quarter
compiled to miss_eps_last > 0.5
0.1409false
eps_down
EPS down year over year
0.0537false
below_200
Is the stock below its 200-day moving average
compiled to C < sma(C, 200)
0.9139true
lh_ll
Is the stock making lower swing highs and lower swing lows
compiled to (swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))
0.1552false

What it means

For INTC on the session of 2026-10-30: True now: Is the stock below its 200-day moving average. Not true: Has the stock missed EPS estimates in any of the last 4 quarters; Did the stock miss EPS estimates last quarter; EPS down year over year; Is the stock making lower swing highs and lower swing lows.

Facts on misses and growth come first; the price structure rules describe how the market has taken them.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "INTC"
  },
  "questions": {
    "any_miss": {
      "type": "yes_no",
      "instructions": "Has the stock missed EPS estimates in any of the last 4 quarters?"
    },
    "miss_last": {
      "type": "yes_no",
      "instructions": "Did the stock miss EPS estimates last quarter?"
    },
    "eps_down": {
      "type": "yes_no",
      "ask": "last_eps < eps_year_ago"
    },
    "below_200": {
      "type": "yes_no",
      "instructions": "Is the stock below its 200-day moving average?"
    },
    "lh_ll": {
      "type": "yes_no",
      "instructions": "Is the stock making lower swing highs and lower swing lows?"
    }
  }
}
Response JSON (INTC, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "any_miss": {
      "yes_no": 0.1409,
      "rule": "misses_last4 >= 1",
      "basis": "pattern"
    },
    "miss_last": {
      "yes_no": 0.1409,
      "rule": "miss_eps_last > 0.5",
      "basis": "pattern"
    },
    "eps_down": {
      "yes_no": 0.0537,
      "rule": "last_eps < eps_year_ago",
      "basis": "rule"
    },
    "below_200": {
      "yes_no": 0.9139,
      "rule": "C < sma(C, 200)",
      "basis": "comparison"
    },
    "lh_ll": {
      "yes_no": 0.1552,
      "rule": "(swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "INTC",
    "as_of": "2026-10-30"
  }
}

eps_year_ago last_eps miss_eps_last misses_last4 sma swinghigh swinglow

Equity research analyst · example 15

IBM: is the move after results backed by volume?

Check on-balance volume, volume rank and the rolling VWAP to judge whether institutions are behind the move.

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

State

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

Questions

obvruleobv() > sma(obv(), 20)
On-balance volume above its 20-day average
rankrulepercentrank(V, 50) > 90
Volume in the top tenth of 50 sessions
vwapruleC > sum(hlc3() * V, 20) / sum(V, 20)
Above its 20-day volume-weighted price
med_volruleV > 2 * median(V, 20)
Volume over twice its 20-day median
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
obv
On-balance volume above its 20-day average
0.8841true
rank
Volume in the top tenth of 50 sessions
0.1791false
vwap
Above its 20-day volume-weighted price
0.9238true
med_vol
Volume over twice its 20-day median
0.1084false
up_week
Higher in a week
0.55956% · close to even

What it means

For IBM on the session of 2026-10-30: True now: On-balance volume above its 20-day average; Above its 20-day volume-weighted price. Not true: Volume in the top tenth of 50 sessions; Volume over twice its 20-day median. Forecasts: Higher in a week 56%.

Volume rules true lend weight to a move in the note; quiet volume means the price change is thinner than it looks.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "IBM"
  },
  "questions": {
    "obv": {
      "type": "yes_no",
      "ask": "obv() > sma(obv(), 20)"
    },
    "rank": {
      "type": "yes_no",
      "ask": "percentrank(V, 50) > 90"
    },
    "vwap": {
      "type": "yes_no",
      "ask": "C > sum(hlc3() * V, 20) / sum(V, 20)"
    },
    "med_vol": {
      "type": "yes_no",
      "ask": "V > 2 * median(V, 20)"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  }
}
Response JSON (IBM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "obv": {
      "yes_no": 0.8841,
      "rule": "obv() > sma(obv(), 20)",
      "basis": "rule"
    },
    "rank": {
      "yes_no": 0.1791,
      "rule": "percentrank(V, 50) > 90",
      "basis": "rule"
    },
    "vwap": {
      "yes_no": 0.9238,
      "rule": "C > sum(hlc3() * V, 20) / sum(V, 20)",
      "basis": "rule"
    },
    "med_vol": {
      "yes_no": 0.1084,
      "rule": "V > 2 * median(V, 20)",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.559
    }
  },
  "context": {
    "symbol": "IBM",
    "as_of": "2026-10-30"
  }
}

hlc3 median obv percentrank sma sum

Equity research analyst · example 16

Energy coverage: XOM, CVX, COP, OXY morning facts

A pre-open workflow posting trend, dividend and earnings facts for the oil majors to the team channel.

ora-fin-0.1.14 symbols, one request each5 questions1 actionworkflow · Mon–Fri at 08:15 ET
  1. ScheduleMon–Fri at 08:15 ET
  2. State4 symbols
  3. Questions5 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

{"symbol":"XOM"} then CVX, COP, OXY, one request each. The server fills in the latest completed session.

Questions

trendruleC > sma(C, 50)
Above the 50-day average
yield3English → ruleIs the dividend yield above 3%?
raisedruleraised_last > 0.5
Raised its last dividend
earn_soonruledays_to_earnings <= 10
Reports earnings within 10 days
big_move5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

Symboltrendruleyield3ruleraisedruleearn_soonrulebig_move5forecastFired
XOM0.94630.05370.14090.05370.394none
CVX0.94630.49060.14090.05370.423none
COP0.94460.05370.14090.89670.362morning
OXY0.91730.05550.85910.550.381none

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.

earn_soon >= 0.6 or trend < 0.4→Slackenergy-team
XOM 0 of 1 fired · dry run, nothing sent
CVX 0 of 1 fired · dry run, nothing sent
COP 1 of 1 fired · dry run, nothing sent
morningwould send (dry run)Slack → energy-team
{
  "text": "COP (2026-10-30): above the 50-day 94%, reports within 10 days 90%, yield over 3% 5%. Big move in 5 days 36%."
}
OXY 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 4 symbols: Above the 50-day average: true for XOM, CVX, COP, OXY of 4. Is the dividend yield above 3%: true for none of 4. Raised its last dividend: true for OXY of 4. Reports earnings within 10 days: true for COP of 4. Highest odds for “A big move either way in 5 days”: CVX at 42%. morning fired for COP.

Names post only when an event is near or the trend has broken, so the channel stays readable.

As a scheduled workflow (Mon–Fri at 08:15 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": "Energy coverage: XOM, CVX, COP, OXY morning facts",
  "symbols": "XOM CVX COP OXY",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "08:15",
  "model": "ora-fin-0.1.1",
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "yield3": {
      "type": "yes_no",
      "instructions": "Is the dividend yield above 3%?"
    },
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "earn_soon": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10"
    },
    "big_move5": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "morning",
      "when": "earn_soon >= 0.6 or trend < 0.4",
      "do": "slack",
      "connection": "energy-team",
      "message": "{{symbol}} ({{as_of}}): above the 50-day {{trend|pct}}, reports within 10 days {{earn_soon|pct}}, yield over 3% {{yield3|pct}}. Big move in 5 days {{big_move5|pct}}."
    }
  ]
}
Request JSON (XOM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XOM"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "yield3": {
      "type": "yes_no",
      "instructions": "Is the dividend yield above 3%?"
    },
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "earn_soon": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10"
    },
    "big_move5": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "morning",
      "when": "earn_soon >= 0.6 or trend < 0.4",
      "do": "slack",
      "connection": "energy-team",
      "message": "{{symbol}} ({{as_of}}): above the 50-day {{trend|pct}}, reports within 10 days {{earn_soon|pct}}, yield over 3% {{yield3|pct}}. Big move in 5 days {{big_move5|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (XOM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.9463,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "yield3": {
      "yes_no": 0.0537,
      "rule": "div_yield_ttm > 3",
      "basis": "pattern"
    },
    "raised": {
      "yes_no": 0.1409,
      "rule": "raised_last > 0.5",
      "basis": "rule"
    },
    "earn_soon": {
      "yes_no": 0.0537,
      "rule": "days_to_earnings <= 10",
      "basis": "rule"
    },
    "big_move5": {
      "yes_no": 0.394
    }
  },
  "context": {
    "symbol": "XOM",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "morning",
      "fired": false,
      "status": "skipped"
    }
  ]
}

days_to_earnings div_yield_ttm raised_last sma

Equity research analyst · example 17

PFE: reversal candles after the decline

For a coverage name in a downtrend, record whether recent candles show a reversal pattern before the rating discussion.

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

State

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

Questions

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.
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.
tweezerruletweezer_bottom()
tweezer bottom candle: Red then green, with lows within 0.1% of each other.
below200English → ruleIs the stock below its 200-day moving average?
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
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.0742false
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.0562false
harami
harami bull candle: A small green body inside yesterday's red body.
0.1147false
tweezer
tweezer bottom candle: Red then green, with lows within 0.1% of each other.
0.0591false
below200
Is the stock below its 200-day moving average
compiled to C < sma(C, 200)
0.0537false
up_week
Higher in a week
0.55556% · close to even

What it means

For PFE 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.; tweezer bottom candle: Red then green, with lows within 0.1% of each other.; Is the stock below its 200-day moving average. Forecasts: Higher in a week 56%.

A pattern is a description of the last bars, not a thesis; it is mentioned only if one is true.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "PFE"
  },
  "questions": {
    "morning": {
      "type": "yes_no",
      "ask": "morning_star()"
    },
    "piercing": {
      "type": "yes_no",
      "ask": "piercing_line()"
    },
    "harami": {
      "type": "yes_no",
      "ask": "harami_bull()"
    },
    "tweezer": {
      "type": "yes_no",
      "ask": "tweezer_bottom()"
    },
    "below200": {
      "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 (PFE, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "morning": {
      "yes_no": 0.0742,
      "rule": "morning_star()",
      "basis": "rule"
    },
    "piercing": {
      "yes_no": 0.0562,
      "rule": "piercing_line()",
      "basis": "rule"
    },
    "harami": {
      "yes_no": 0.1147,
      "rule": "harami_bull()",
      "basis": "rule"
    },
    "tweezer": {
      "yes_no": 0.0591,
      "rule": "tweezer_bottom()",
      "basis": "rule"
    },
    "below200": {
      "yes_no": 0.0537,
      "rule": "C < sma(C, 200)",
      "basis": "comparison"
    },
    "up_week": {
      "yes_no": 0.555
    }
  },
  "context": {
    "symbol": "PFE",
    "as_of": "2026-10-30"
  }
}

harami_bull morning_star piercing_line sma tweezer_bottom

Equity research analyst · example 18

Send AAPL chart facts to the research publishing system

Push verified chart facts to the publishing tool so the report template fills its technical box automatically.

ora-fin-0.1.1AAPL5 questions1 action
  1. StateAAPL
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
goldenrulesma(C, 50) > sma(C, 200)
50-day above the 200-day
rsi50rulersi(C, 14) > 50
RSI above 50
near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
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
golden
50-day above the 200-day
0.9463true
rsi50
RSI above 50
0.8179true
near_high
Within 2% of the 52-week high
0.4962on the line (false)
up_week
Higher in a week
0.5959% · close to even

Actions

Rules on the answers decide what to send.

trend >= 0→Webhookresearch-cms
What each action would send 1 of 1 fired · dry run, nothing sent
publishwould send (dry run)Webhook → research-cms
{
  "ticker": "AAPL",
  "as_of": "2026-10-30",
  "box": "technicals",
  "above_200d": 0.9463,
  "golden_alignment": 0.9463,
  "rsi_above_50": 0.8179,
  "near_52w_high": 0.4962,
  "model_up_week": 0.59
}

What it means

For AAPL on the session of 2026-10-30: True now: Is the stock above its 200-day moving average; 50-day above the 200-day; RSI above 50. On the line: Within 2% of the 52-week high. Forecasts: Higher in a week 59%. Fired: publish (Webhook → research-cms).

The webhook always fires; the CMS writes yes or no from each probability and labels the forecast as model odds.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "golden": {
      "type": "yes_no",
      "ask": "sma(C, 50) > sma(C, 200)"
    },
    "rsi50": {
      "type": "yes_no",
      "ask": "rsi(C, 14) > 50"
    },
    "near_high": {
      "type": "yes_no",
      "ask": "C >= 0.98 * max(H, 252)"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  },
  "actions": [
    {
      "id": "publish",
      "when": "trend >= 0",
      "do": "webhook",
      "connection": "research-cms",
      "body": {
        "ticker": "{{symbol}}",
        "as_of": "{{as_of}}",
        "box": "technicals",
        "above_200d": "{{trend}}",
        "golden_alignment": "{{golden}}",
        "rsi_above_50": "{{rsi50}}",
        "near_52w_high": "{{near_high}}",
        "model_up_week": "{{up_week}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.9463,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "golden": {
      "yes_no": 0.9463,
      "rule": "sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "rsi50": {
      "yes_no": 0.8179,
      "rule": "rsi(C, 14) > 50",
      "basis": "rule"
    },
    "near_high": {
      "yes_no": 0.4962,
      "rule": "C >= 0.98 * max(H, 252)",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.59
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "publish",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "research-cms",
      "preview": {
        "body": {
          "ticker": "AAPL",
          "as_of": "2026-10-30",
          "box": "technicals",
          "above_200d": 0.9463,
          "golden_alignment": 0.9463,
          "rsi_above_50": 0.8179,
          "near_52w_high": 0.4962,
          "model_up_week": 0.59
        }
      }
    }
  ]
}

max rsi sma

Equity research analyst · example 19

ORCL: momentum quality with ADX and directional lines

Describe whether the trend is strong and directional before writing that momentum supports the thesis.

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

State

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

Questions

adx25ruleadx(14) > 25
Trending (ADX above 25)
dirulediplus(14) > diminus(14)
+DI above -DI
wmarulewma(C, 10) > wma(C, 30)
10-day weighted average above the 30-day
ema21ruleC > ema(C, 21)
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
adx25
Trending (ADX above 25)
0.0616false
di
+DI above -DI
0.8014true
wma
10-day weighted average above the 30-day
0.33false
ema21
C > ema(C, 21)
0.2272false
rally5
A 5% rally within a month
0.68769% · likely

What it means

For ORCL on the session of 2026-10-30: True now: +DI above -DI. Not true: Trending (ADX above 25); 10-day weighted average above the 30-day; C > ema(C, 21). Forecasts: A 5% rally within a month 69%.

A strong ADX with +DI on top describes a real trend; the note says trend-supported only when both are true.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "ORCL"
  },
  "questions": {
    "adx25": {
      "type": "yes_no",
      "ask": "adx(14) > 25"
    },
    "di": {
      "type": "yes_no",
      "ask": "diplus(14) > diminus(14)"
    },
    "wma": {
      "type": "yes_no",
      "ask": "wma(C, 10) > wma(C, 30)"
    },
    "ema21": {
      "type": "yes_no",
      "ask": "C > ema(C, 21)"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  }
}
Response JSON (ORCL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "adx25": {
      "yes_no": 0.0616,
      "rule": "adx(14) > 25",
      "basis": "rule"
    },
    "di": {
      "yes_no": 0.8014,
      "rule": "diplus(14) > diminus(14)",
      "basis": "rule"
    },
    "wma": {
      "yes_no": 0.33,
      "rule": "wma(C, 10) > wma(C, 30)",
      "basis": "rule"
    },
    "ema21": {
      "yes_no": 0.2272,
      "rule": "C > ema(C, 21)",
      "basis": "rule"
    },
    "rally5": {
      "yes_no": 0.687
    }
  },
  "context": {
    "symbol": "ORCL",
    "as_of": "2026-10-30"
  }
}

adx diminus diplus ema wma

Equity research analyst · example 20

BA: drawdown and recovery context for the downgrade debate

Measure how far the stock sits from its highs and how long since its last breakout before the rating committee.

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

State

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

Questions

drawdownruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
since_borulebarssince(C > highest(C, 20)) > 30
No 20-day breakout for 30 sessions
bars_highrulehighestbars(H, 60) >= 40
The 60-day high is at least 40 sessions old
near200ruleabs(C / sma(C, 200) - 1) < 0.03
Within 3% of the 200-day
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

QuestionAnswerReading
drawdown
More than 20% off the 52-week high
0.9296true
since_bo
No 20-day breakout for 30 sessions
0.9237true
bars_high
The 60-day high is at least 40 sessions old
0.8581true
near200
Within 3% of the 200-day
0.0537false
drop10
A 10% drawdown within a month
0.42643% · close to even

What it means

For BA on the session of 2026-10-30: True now: More than 20% off the 52-week high; No 20-day breakout for 30 sessions; The 60-day high is at least 40 sessions old. Not true: Within 3% of the 200-day. Forecasts: A 10% drawdown within a month 43%.

These facts frame the debate; the committee decides, the answers just make the starting point exact.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "BA"
  },
  "questions": {
    "drawdown": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "since_bo": {
      "type": "yes_no",
      "ask": "barssince(C > highest(C, 20)) > 30"
    },
    "bars_high": {
      "type": "yes_no",
      "ask": "highestbars(H, 60) >= 40"
    },
    "near200": {
      "type": "yes_no",
      "ask": "abs(C / sma(C, 200) - 1) < 0.03"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    }
  }
}
Response JSON (BA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "drawdown": {
      "yes_no": 0.9296,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "since_bo": {
      "yes_no": 0.9237,
      "rule": "barssince(C > highest(C, 20)) > 30",
      "basis": "rule"
    },
    "bars_high": {
      "yes_no": 0.8581,
      "rule": "highestbars(H, 60) >= 40",
      "basis": "rule"
    },
    "near200": {
      "yes_no": 0.0537,
      "rule": "abs(C / sma(C, 200) - 1) < 0.03",
      "basis": "rule"
    },
    "drop10": {
      "yes_no": 0.426
    }
  },
  "context": {
    "symbol": "BA",
    "as_of": "2026-10-30"
  }
}

abs barssince highest highestbars max sma

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 Sell side: Sell-side sales trader, Execution trader / desk, Market maker, Prop trading firm, Compliance officer.

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