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

ETF issuer: 20 ways to use Ora

Watches its funds and their holdings: flows proxies, trend, volatility and distribution dates. Each example is a complete, runnable request with the real answers it returned (36 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 (61)

sma 13offset 5ref 5atr 4div_yield_ttm 3abs 3ema 3adx 2log 2sqrt 2std 2max 2cut_last 2div_count_ttm 2raised_last 2rsi 2lowest 1avg 1percentrank 1diminus 1diplus 1linreg 1roc 1wma 1days_to_ex_div 1pays_dividend 1beat_eps_last 1beat_revenue_last 1days_to_earnings 1last_earnings_move 1harami_bull 1min 1piercing_line 1tweezer_bottom 1cci 1hanging_man 1shooting_star 1gap_down 1gap_up 1crossdown 1crossup 1three_black_crows 1willr 1barssince 1highest 1zscore 1macd 1macdsignal 1obv 1doji 1spinning_top 1days_since_split 1days_to_split 1last_split_ratio 1reverse_split_last 1engulfing_bear 1morning_star 1dark_cloud 1bblower 1bbmid 1bbupper 1

Examples 1–10 of 20 · page 1 of 2

ETF issuer · example 1

Sector ETF trend board: XLK, XLF, XLE, XLV

A product team checks which sector funds are in an uptrend and which are breaking down, to plan marketing and capital-markets outreach for the week.

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

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
longEnglish → ruleIs the stock above its 200-day moving average?
breakdownruleC < lowest(L, 20)
Closed under the 20-day low
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulelongrulebreakdownrulebeat_spyforecast
XLK0.07760.920.67060.498
XLF0.66920.9190.05550.448
XLE0.94320.94630.05370.55
XLV0.94470.94630.05370.534

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: Above the 50-day average: true for XLF, XLE, XLV of 4. Is the stock above its 200-day moving average: true for XLK, XLF, XLE, XLV of 4. Closed under the 20-day low: true for XLK of 4. Highest odds for “Beating SPY over a month”: XLE at 55%.

Funds with both trend rules true are the ones advisors are asking about; a breakdown flags a fund where outflows and questions are likely.

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 > sma(C, 50)"
    },
    "long": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "breakdown": {
      "type": "yes_no",
      "ask": "C < lowest(L, 20)"
    },
    "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.0776,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "long": {
      "yes_no": 0.92,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "breakdown": {
      "yes_no": 0.6706,
      "rule": "C < lowest(L, 20)",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.498
    }
  },
  "context": {
    "symbol": "XLK",
    "as_of": "2026-10-30"
  }
}

lowest sma

ETF issuer · example 2

XLK: is heavy volume a creation/redemption signal?

Volume far above normal in an ETF often comes with creations or redemptions. Flag days when XLK trades heavy and whether price went up or down with it.

ora-fin-0.1.1XLK5 questions3 actions
  1. StateXLK
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions3 rules · dry run

State

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

Questions

spikeruleV > 2 * ref(avg(V, 20), -1)
Volume more than twice the previous 20-day average
up_volruleC > C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Up on heavy volume
down_volruleC < C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Down on heavy volume
rankrulepercentrank(V, 50) > 90
Volume in the top tenth of 50 sessions
spike_nextforecastWill volume spike tomorrow?
A volume spike tomorrow

Answers

QuestionAnswerReading
spike
Volume more than twice the previous 20-day average
0.7826true
up_vol
Up on heavy volume
0.0537false
down_vol
Down on heavy volume
0.936true
rank
Volume in the top tenth of 50 sessions
0.6754true
spike_next
A volume spike tomorrow
0.11712% · unlikely

Actions

Rules on the answers decide what to send.

spike >= 0.6 and up_vol >= 0.6→Slackcapital-markets
spike >= 0.6 and down_vol >= 0.6→Slackcapital-markets
else→Slackcapital-markets
What each action would send 1 of 3 fired · dry run, nothing sent
flow_uprule false: skipped
flow_downwould send (dry run)Slack → capital-markets
{
  "text": "XLK (2026-10-30): heavy volume on a down day (94%). Expect redemption requests."
}
quietrule false: skipped

What it means

For XLK on the session of 2026-10-30: True now: Volume more than twice the previous 20-day average; Down on heavy volume; Volume in the top tenth of 50 sessions. Not true: Up on heavy volume. Forecasts: A volume spike tomorrow 12%. Fired: flow_down (Slack → capital-markets).

Volume rules are exact on the daily bar; they are a proxy for primary-market activity, not the flow figures themselves, so the desk confirms with the authorized participants.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLK"
  },
  "questions": {
    "spike": {
      "type": "yes_no",
      "ask": "V > 2 * ref(avg(V, 20), -1)"
    },
    "up_vol": {
      "type": "yes_no",
      "ask": "C > C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "down_vol": {
      "type": "yes_no",
      "ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "rank": {
      "type": "yes_no",
      "ask": "percentrank(V, 50) > 90"
    },
    "spike_next": {
      "type": "yes_no",
      "instructions": "Will volume spike tomorrow?"
    }
  },
  "actions": [
    {
      "id": "flow_up",
      "when": "spike >= 0.6 and up_vol >= 0.6",
      "do": "slack",
      "connection": "capital-markets",
      "message": "{{symbol}} ({{as_of}}): volume over twice its 20-day average on an up day ({{up_vol|pct}}). Check the creation basket with the AP desk."
    },
    {
      "id": "flow_down",
      "when": "spike >= 0.6 and down_vol >= 0.6",
      "do": "slack",
      "connection": "capital-markets",
      "message": "{{symbol}} ({{as_of}}): heavy volume on a down day ({{down_vol|pct}}). Expect redemption requests."
    },
    {
      "id": "quiet",
      "when": "else",
      "do": "slack",
      "connection": "capital-markets",
      "message": "{{symbol}} ({{as_of}}): normal volume (spike rule {{spike|pct}})."
    }
  ],
  "dry_run": true
}
Response JSON (XLK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "spike": {
      "yes_no": 0.7826,
      "rule": "V > 2 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "up_vol": {
      "yes_no": 0.0537,
      "rule": "C > C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "down_vol": {
      "yes_no": 0.936,
      "rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "rank": {
      "yes_no": 0.6754,
      "rule": "percentrank(V, 50) > 90",
      "basis": "rule"
    },
    "spike_next": {
      "yes_no": 0.117
    }
  },
  "context": {
    "symbol": "XLK",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "flow_up",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "flow_down",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "capital-markets",
      "preview": {
        "text": "XLK (2026-10-30): heavy volume on a down day (94%). Expect redemption requests."
      }
    },
    {
      "id": "quiet",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg offset percentrank ref

ETF issuer · example 3

SPLV: is the low-volatility factor doing its job?

Check that the minimum-volatility fund is actually calmer than usual and holding its trend, for the monthly factor commentary.

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

State

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

Questions

atr_lowEnglish → ruleIs the 14-day ATR less than 2% of the price?
hv_lowEnglish → ruleIs 20-day historical volatility below 20%?
trendEnglish → ruleIs the stock above its 200-day moving average?
adxruleadx(14) > 20 and diplus(14) > diminus(14)
ADX above 20 with +DI over -DI (a directional uptrend)
vol_upforecastWill volatility be higher over the next month?
Higher volatility next month

Answers

QuestionAnswerReading
atr_low
Is the 14-day ATR less than 2% of the price
compiled to atr(14) / C < 0.02
0.9463true
hv_low
Is 20-day historical volatility below 20%
compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2
0.9463true
trend
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.9123true
adx
ADX above 20 with +DI over -DI (a directional uptrend)
0.9216true
vol_up
Higher volatility next month
0.48749% · close to even

What it means

For SPLV on the session of 2026-10-30: True now: Is the 14-day ATR less than 2% of the price; Is 20-day historical volatility below 20%; Is the stock above its 200-day moving average; ADX above 20 with +DI over -DI (a directional uptrend). Forecasts: Higher volatility next month 49%.

If the volatility rules are true the fund is behaving as marketed; a higher-volatility forecast is a talking point for the next commentary, not a change to the methodology.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPLV"
  },
  "questions": {
    "atr_low": {
      "type": "yes_no",
      "instructions": "Is the 14-day ATR less than 2% of the price?"
    },
    "hv_low": {
      "type": "yes_no",
      "instructions": "Is 20-day historical volatility below 20%?"
    },
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "adx": {
      "type": "yes_no",
      "ask": "adx(14) > 20 and diplus(14) > diminus(14)"
    },
    "vol_up": {
      "type": "yes_no",
      "instructions": "Will volatility be higher over the next month?"
    }
  }
}
Response JSON (SPLV, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "atr_low": {
      "yes_no": 0.9463,
      "rule": "atr(14) / C < 0.02",
      "basis": "pattern"
    },
    "hv_low": {
      "yes_no": 0.9463,
      "rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2",
      "basis": "pattern"
    },
    "trend": {
      "yes_no": 0.9123,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "adx": {
      "yes_no": 0.9216,
      "rule": "adx(14) > 20 and diplus(14) > diminus(14)",
      "basis": "rule"
    },
    "vol_up": {
      "yes_no": 0.487
    }
  },
  "context": {
    "symbol": "SPLV",
    "as_of": "2026-10-30"
  }
}

adx atr diminus diplus log offset sma sqrt std

ETF issuer · example 4

MTUM vs QUAL vs VLUE: which factor fund is leading?

Rank the three factor funds on the same questions for a factor-rotation note to distribution partners.

ora-fin-0.1.13 symbols, one request each5 questions2 actions
  1. State3 symbols
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

{"symbol":"MTUM"} then QUAL, VLUE, one request each. The server fills in the latest completed session.

Questions

rocruleroc(C, 20) > 5
Up more than 5% in 20 sessions
linregrulelinreg(C, 20) > ref(linreg(C, 20), -5)
20-day regression line rising over the last week
near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
wmarulewma(C, 10) > wma(C, 30)
10-day weighted average above the 30-day
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symbolrocrulelinregrulenear_highrulewmarulebeat_spyforecastFired
MTUM0.05370.21690.05370.08880.486lagging
QUAL0.05540.1370.26050.22280.495lagging
VLUE0.0580.69390.05810.30950.512lagging

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.

roc >= 0.6 and wma >= 0.6→Slacketf-sales
else→Slacketf-sales
MTUM 1 of 2 fired · dry run, nothing sent
leaderrule false: skipped
laggingwould send (dry run)Slack → etf-sales
{
  "text": "MTUM (2026-10-30) is not leading (20-day momentum 5%)."
}
QUAL 1 of 2 fired · dry run, nothing sent
leaderrule false: skipped
laggingwould send (dry run)Slack → etf-sales
{
  "text": "QUAL (2026-10-30) is not leading (20-day momentum 6%)."
}
VLUE 1 of 2 fired · dry run, nothing sent
leaderrule false: skipped
laggingwould send (dry run)Slack → etf-sales
{
  "text": "VLUE (2026-10-30) is not leading (20-day momentum 6%)."
}

What it means

Session of 2026-10-30, 3 symbols: Up more than 5% in 20 sessions: true for none of 3. 20-day regression line rising over the last week: true for VLUE of 3. Within 2% of the 52-week high: true for none of 3. 10-day weighted average above the 30-day: true for none of 3. Highest odds for “Beating SPY over a month”: VLUE at 51%. leader fired for none. lagging fired for MTUM, QUAL, VLUE.

The fund with the most rules true and the best odds against SPY leads the note; the forecast is a probability, so the note says so.

Request JSON (MTUM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MTUM"
  },
  "questions": {
    "roc": {
      "type": "yes_no",
      "ask": "roc(C, 20) > 5"
    },
    "linreg": {
      "type": "yes_no",
      "ask": "linreg(C, 20) > ref(linreg(C, 20), -5)"
    },
    "near_high": {
      "type": "yes_no",
      "ask": "C >= 0.98 * max(H, 252)"
    },
    "wma": {
      "type": "yes_no",
      "ask": "wma(C, 10) > wma(C, 30)"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  },
  "actions": [
    {
      "id": "leader",
      "when": "roc >= 0.6 and wma >= 0.6",
      "do": "slack",
      "connection": "etf-sales",
      "message": "{{symbol}} ({{as_of}}) leads on momentum: up 5% in 20 days ({{roc|pct}}), weighted trend {{wma|pct}}. Odds of beating SPY over a month: {{beat_spy|pct}}."
    },
    {
      "id": "lagging",
      "when": "else",
      "do": "slack",
      "connection": "etf-sales",
      "message": "{{symbol}} ({{as_of}}) is not leading (20-day momentum {{roc|pct}})."
    }
  ],
  "dry_run": true
}
Response JSON (MTUM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "roc": {
      "yes_no": 0.0537,
      "rule": "roc(C, 20) > 5",
      "basis": "rule"
    },
    "linreg": {
      "yes_no": 0.2169,
      "rule": "linreg(C, 20) > ref(linreg(C, 20), -5)",
      "basis": "rule"
    },
    "near_high": {
      "yes_no": 0.0537,
      "rule": "C >= 0.98 * max(H, 252)",
      "basis": "rule"
    },
    "wma": {
      "yes_no": 0.0888,
      "rule": "wma(C, 10) > wma(C, 30)",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.486
    }
  },
  "context": {
    "symbol": "MTUM",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "leader",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "lagging",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "etf-sales",
      "preview": {
        "text": "MTUM (2026-10-30) is not leading (20-day momentum 5%)."
      }
    }
  ]
}

linreg max ref roc wma

ETF issuer · example 5

SCHD: distribution calendar and yield check

Before the quarterly distribution, confirm the fund's ex-date, trailing yield and payout record for the investor-communications calendar.

ora-fin-0.1.1SCHD6 questions1 action
  1. StateSCHD
  2. Questions6 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

paysrulepays_dividend > 0.5
Pays a dividend
ex_soonruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
yield3English → ruleIs the dividend yield above 3%?
quarterlyrulediv_count_ttm >= 4
Pays at least quarterly
raisedruleraised_last > 0.5
Raised its last dividend
no_cutrulecut_last < 0.5
Did not cut its last dividend

Answers

QuestionAnswerReading
pays
Pays a dividend
0.8591true
ex_soon
Goes ex-dividend within 30 days
0.0537false
yield3
Is the dividend yield above 3%
compiled to div_yield_ttm > 3
0.4287on the line (false)
quarterly
Pays at least quarterly
0.55on the line (true)
raised
Raised its last dividend
0.8591true
no_cut
Did not cut its last dividend
0.8591true

Actions

Rules on the answers decide what to send.

ex_soon >= 0.6→Emailinvestor-communications
What each action would send 0 of 1 fired · dry run, nothing sent
ex_noticerule false: skipped

What it means

For SCHD on the session of 2026-10-30: True now: Pays a dividend; Raised its last dividend; Did not cut its last dividend. Not true: Goes ex-dividend within 30 days. On the line: Is the dividend yield above 3%; Pays at least quarterly. No action fired: every rule was false.

Ex-dates count only once declared; if nothing is declared the email waits, and the team checks the board calendar instead.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SCHD"
  },
  "questions": {
    "pays": {
      "type": "yes_no",
      "ask": "pays_dividend > 0.5"
    },
    "ex_soon": {
      "type": "yes_no",
      "ask": "days_to_ex_div <= 30"
    },
    "yield3": {
      "type": "yes_no",
      "instructions": "Is the dividend yield above 3%?"
    },
    "quarterly": {
      "type": "yes_no",
      "ask": "div_count_ttm >= 4"
    },
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "no_cut": {
      "type": "yes_no",
      "ask": "cut_last < 0.5"
    }
  },
  "actions": [
    {
      "id": "ex_notice",
      "when": "ex_soon >= 0.6",
      "do": "email",
      "connection": "investor-communications",
      "subject": "{{symbol}} ex-date within 30 days ({{as_of}})",
      "message": "{{symbol}} goes ex-distribution within 30 days. Trailing yield above 3%: {{yield3|pct}}. Last payment raised: {{raised|pct}}. Schedule the distribution notice."
    }
  ],
  "dry_run": true
}
Response JSON (SCHD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "pays": {
      "yes_no": 0.8591,
      "rule": "pays_dividend > 0.5",
      "basis": "rule"
    },
    "ex_soon": {
      "yes_no": 0.0537,
      "rule": "days_to_ex_div <= 30",
      "basis": "rule"
    },
    "yield3": {
      "yes_no": 0.4287,
      "rule": "div_yield_ttm > 3",
      "basis": "pattern"
    },
    "quarterly": {
      "yes_no": 0.55,
      "rule": "div_count_ttm >= 4",
      "basis": "rule"
    },
    "raised": {
      "yes_no": 0.8591,
      "rule": "raised_last > 0.5",
      "basis": "rule"
    },
    "no_cut": {
      "yes_no": 0.8591,
      "rule": "cut_last < 0.5",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "SCHD",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "ex_notice",
      "fired": false,
      "status": "skipped"
    }
  ]
}

cut_last days_to_ex_div div_count_ttm div_yield_ttm pays_dividend raised_last

ETF issuer · example 6

JEPI: a monthly payer holding up under the market?

Covered-call income fund: confirm the monthly payout record and see whether the price is eroding under the distribution.

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

State

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

Questions

monthlyEnglish → ruleDoes the stock pay a monthly dividend?
cutEnglish → ruleDid the stock cut its dividend last time?
below_200dEnglish → ruleIs the stock below its 200-day moving average?
down_monthEnglish → ruleIs the stock down more than 5% over the last month?
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
monthly
Does the stock pay a monthly dividend
compiled to div_count_ttm >= 11
0.8591true
cut
Did the stock cut its dividend last time
compiled to cut_last > 0.5
0.8591true
below_200d
Is the stock below its 200-day moving average
compiled to C < sma(C, 200)
0.0537false
down_month
Is the stock down more than 5% over the last month
compiled to C / C[-21] - 1 < -0.05
0.0537false
drop5
A 5% drawdown within a month
0.0717% · unlikely

What it means

For JEPI on the session of 2026-10-30: True now: Does the stock pay a monthly dividend; Did the stock cut its dividend last time. Not true: Is the stock below its 200-day moving average; Is the stock down more than 5% over the last month. Forecasts: A 5% drawdown within a month 7%.

Monthly payers show eleven or more ex-dates a year; a cut plus a price below the 200-day is the combination investors will ask about first.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JEPI"
  },
  "questions": {
    "monthly": {
      "type": "yes_no",
      "instructions": "Does the stock pay a monthly dividend?"
    },
    "cut": {
      "type": "yes_no",
      "instructions": "Did the stock cut its dividend last time?"
    },
    "below_200d": {
      "type": "yes_no",
      "instructions": "Is the stock below its 200-day moving average?"
    },
    "down_month": {
      "type": "yes_no",
      "instructions": "Is the stock down more than 5% over the last month?"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (JEPI, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "monthly": {
      "yes_no": 0.8591,
      "rule": "div_count_ttm >= 11",
      "basis": "pattern"
    },
    "cut": {
      "yes_no": 0.8591,
      "rule": "cut_last > 0.5",
      "basis": "pattern"
    },
    "below_200d": {
      "yes_no": 0.0537,
      "rule": "C < sma(C, 200)",
      "basis": "comparison"
    },
    "down_month": {
      "yes_no": 0.0537,
      "rule": "C / C[-21] - 1 < -0.05",
      "basis": "pattern"
    },
    "drop5": {
      "yes_no": 0.071
    }
  },
  "context": {
    "symbol": "JEPI",
    "as_of": "2026-10-30"
  }
}

cut_last div_count_ttm offset sma

ETF issuer · example 7

XLK's top holdings: AAPL, MSFT, NVDA earnings and trend

The largest weights drive the fund. Check each one for an upcoming report, last-quarter beat and trend before the fund's monthly review.

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

State

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

Questions

earn_soonruledays_to_earnings <= 10
Reports earnings within 10 days
beatrulebeat_eps_last > 0.5 and beat_revenue_last > 0.5
Beat on EPS and revenue last quarter
trendruleC > sma(C, 50)
Above the 50-day average
big_reactruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symbolearn_soonrulebeatruletrendrulebig_reactruledrop5forecast
AAPL0.93920.85910.91190.94630.365
MSFT0.05370.85910.70880.05370.422
NVDA0.05630.85910.07460.94630.523

true false not known for rules; forecasts are odds. Hover a column for its question.

What it means

Session of 2026-10-30, 3 symbols: Reports earnings within 10 days: true for AAPL of 3. Beat on EPS and revenue last quarter: true for AAPL, MSFT, NVDA of 3. Above the 50-day average: true for AAPL, MSFT of 3. Last earnings move bigger than 5%: true for AAPL, NVDA of 3. Highest odds for “A 5% drawdown within a month”: NVDA at 52%.

A heavy holding that reports soon and moved a lot last time is the fund-level event risk to mention in the review.

Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "earn_soon": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10"
    },
    "beat": {
      "type": "yes_no",
      "ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
    },
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "big_react": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "earn_soon": {
      "yes_no": 0.9392,
      "rule": "days_to_earnings <= 10",
      "basis": "rule"
    },
    "beat": {
      "yes_no": 0.8591,
      "rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
      "basis": "rule"
    },
    "trend": {
      "yes_no": 0.9119,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "big_react": {
      "yes_no": 0.9463,
      "rule": "abs(last_earnings_move) > 5",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.365
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  }
}

abs beat_eps_last beat_revenue_last days_to_earnings last_earnings_move sma

ETF issuer · example 8

XLE: reversal candles at the lows for the energy update?

Energy has swung hard: look for reversal patterns in the sector fund before writing the sector update.

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

State

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

Questions

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.
near_lowEnglish → ruleIs the stock within 10% of its 52-week low?
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
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.1025false
harami
harami bull candle: A small green body inside yesterday's red body.
0.1565false
tweezer
tweezer bottom candle: Red then green, with lows within 0.1% of each other.
0.0537false
near_low
Is the stock within 10% of its 52-week low
compiled to abs(C / min(L, 252) - 1) <= 0.1
0.0537false
up_week
Higher in a week
0.59259% · close to even

What it means

For XLE on the session of 2026-10-30: Not true: 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 within 10% of its 52-week low. Forecasts: Higher in a week 59%.

Candles are one-day facts; a reversal pattern near the lows is a story for the update only when the trend rules agree.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLE"
  },
  "questions": {
    "piercing": {
      "type": "yes_no",
      "ask": "piercing_line()"
    },
    "harami": {
      "type": "yes_no",
      "ask": "harami_bull()"
    },
    "tweezer": {
      "type": "yes_no",
      "ask": "tweezer_bottom()"
    },
    "near_low": {
      "type": "yes_no",
      "instructions": "Is the stock within 10% of its 52-week low?"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  }
}
Response JSON (XLE, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "piercing": {
      "yes_no": 0.1025,
      "rule": "piercing_line()",
      "basis": "rule"
    },
    "harami": {
      "yes_no": 0.1565,
      "rule": "harami_bull()",
      "basis": "rule"
    },
    "tweezer": {
      "yes_no": 0.0537,
      "rule": "tweezer_bottom()",
      "basis": "rule"
    },
    "near_low": {
      "yes_no": 0.0537,
      "rule": "abs(C / min(L, 252) - 1) <= 0.1",
      "basis": "comparison"
    },
    "up_week": {
      "yes_no": 0.592
    }
  },
  "context": {
    "symbol": "XLE",
    "as_of": "2026-10-30"
  }
}

abs harami_bull min piercing_line tweezer_bottom

ETF issuer · example 9

XLU: is the defensive bid real?

Utilities rallying while the market stalls is a common question. Check trend, momentum and an exhaustion candle on XLU.

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

State

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

Questions

stackedruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
ccirulecci(20) > 100
CCI above 100
hangingrulehanging_man()
hanging man candle: Hammer shape, closing above the close five bars back.
shootingruleshooting_star()
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
stacked
Stacked averages: close > 20 EMA > 50 > 200
0.0631false
cci
CCI above 100
0.7575true
hanging
hanging man candle: Hammer shape, closing above the close five bars back.
0.0698false
shooting
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
0.2993false
rally5
A 5% rally within a month
0.21522% · unlikely

What it means

For XLU on the session of 2026-10-30: True now: CCI above 100. Not true: Stacked averages: close > 20 EMA > 50 > 200; hanging man candle: Hammer shape, closing above the close five bars back.; shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.. Forecasts: A 5% rally within a month 22%.

A stacked trend with CCI above 100 is the real bid; a hanging man or shooting star after the run is the caution to add to the note.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLU"
  },
  "questions": {
    "stacked": {
      "type": "yes_no",
      "ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
    },
    "cci": {
      "type": "yes_no",
      "ask": "cci(20) > 100"
    },
    "hanging": {
      "type": "yes_no",
      "ask": "hanging_man()"
    },
    "shooting": {
      "type": "yes_no",
      "ask": "shooting_star()"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  }
}
Response JSON (XLU, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "stacked": {
      "yes_no": 0.0631,
      "rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "cci": {
      "yes_no": 0.7575,
      "rule": "cci(20) > 100",
      "basis": "rule"
    },
    "hanging": {
      "yes_no": 0.0698,
      "rule": "hanging_man()",
      "basis": "rule"
    },
    "shooting": {
      "yes_no": 0.2993,
      "rule": "shooting_star()",
      "basis": "rule"
    },
    "rally5": {
      "yes_no": 0.215
    }
  },
  "context": {
    "symbol": "XLU",
    "as_of": "2026-10-30"
  }
}

cci ema hanging_man shooting_star sma

ETF issuer · example 10

QQQ gap days: will market makers keep the spread tight?

Large opening gaps stress ETF spreads. Flag gap days in QQQ so the issuer's capital-markets team can check quotes with lead market makers.

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

State

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

Questions

gap_uprulegap_up()
gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.
gap_downrulegap_down()
gap down candle: Today's whole range is below yesterday's low.
gap_atrruleabs(O - C[-1]) > 0.5 * ref(atr(14), -1)
Gap bigger than half an ATR
gap_tomforecastWill it gap down tomorrow?
A gap down tomorrow
big_moveforecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

QuestionAnswerReading
gap_up
gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.
0.0537false
gap_down
gap down candle: Today's whole range is below yesterday's low.
0.9259true
gap_atr
Gap bigger than half an ATR
0.9463true
gap_tom
A gap down tomorrow
0.09810% · unlikely
big_move
A big move either way in 5 days
0.35536% · unlikely

Actions

Rules on the answers decide what to send.

gap_atr >= 0.6→Webhooklmm-quality-queue
else→Slackcapital-markets
What each action would send 1 of 2 fired · dry run, nothing sent
gap_checkwould send (dry run)Webhook → lmm-quality-queue
{
  "fund": "QQQ",
  "as_of": "2026-10-30",
  "check": "spread_quality",
  "reason": "open_gap_over_half_atr",
  "p_gap": 0.9463,
  "p_gap_down_tomorrow": 0.098
}
no_gaprule false: skipped

What it means

For QQQ on the session of 2026-10-30: True now: gap down candle: Today's whole range is below yesterday's low.; Gap bigger than half an ATR. Not true: gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.. Forecasts: A gap down tomorrow 10%; A big move either way in 5 days 36%. Fired: gap_check (Webhook → lmm-quality-queue).

A gap larger than half an ATR opens a ticket for the market-quality team; otherwise the channel gets a one-line all-clear.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "QQQ"
  },
  "questions": {
    "gap_up": {
      "type": "yes_no",
      "ask": "gap_up()"
    },
    "gap_down": {
      "type": "yes_no",
      "ask": "gap_down()"
    },
    "gap_atr": {
      "type": "yes_no",
      "ask": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)"
    },
    "gap_tom": {
      "type": "yes_no",
      "instructions": "Will it gap down tomorrow?"
    },
    "big_move": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "gap_check",
      "when": "gap_atr >= 0.6",
      "do": "webhook",
      "connection": "lmm-quality-queue",
      "body": {
        "fund": "{{symbol}}",
        "as_of": "{{as_of}}",
        "check": "spread_quality",
        "reason": "open_gap_over_half_atr",
        "p_gap": "{{gap_atr}}",
        "p_gap_down_tomorrow": "{{gap_tom}}"
      }
    },
    {
      "id": "no_gap",
      "when": "else",
      "do": "slack",
      "connection": "capital-markets",
      "message": "{{symbol}} ({{as_of}}): no large opening gap (rule {{gap_atr|pct}})."
    }
  ],
  "dry_run": true
}
Response JSON (QQQ, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "gap_up": {
      "yes_no": 0.0537,
      "rule": "gap_up()",
      "basis": "rule"
    },
    "gap_down": {
      "yes_no": 0.9259,
      "rule": "gap_down()",
      "basis": "rule"
    },
    "gap_atr": {
      "yes_no": 0.9463,
      "rule": "abs(O - C[-1]) > 0.5 * ref(atr(14), -1)",
      "basis": "rule"
    },
    "gap_tom": {
      "yes_no": 0.098
    },
    "big_move": {
      "yes_no": 0.355
    }
  },
  "context": {
    "symbol": "QQQ",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "gap_check",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "lmm-quality-queue",
      "preview": {
        "body": {
          "fund": "QQQ",
          "as_of": "2026-10-30",
          "check": "spread_quality",
          "reason": "open_gap_over_half_atr",
          "p_gap": 0.9463,
          "p_gap_down_tomorrow": 0.098
        }
      }
    },
    {
      "id": "no_gap",
      "fired": false,
      "status": "skipped"
    }
  ]
}

abs atr gap_down gap_up offset ref

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 Institutions: Index provider, Insurance investment office, Pension fund, Endowment, Sovereign wealth fund.

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