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 11–20 of 20 · page 2 of 2

Portfolio manager (long-only) · example 11

Can the fund build a position in CMG without moving the price?

Before building a new position, check average dollar volume and how wide the daily ranges are.

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

State

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

Questions

liquidruleavg(C * V, 20) > 100000000
Trades more than $100 million a day
liquid_50mEnglish → ruleDoes the stock trade more than $50 million a day on average?
atr_lowEnglish → ruleIs the 14-day ATR less than 2% of the price?
wide_dayruletr() > 1.5 * ref(atr(14), -1)
True range 1.5× yesterday's ATR
vol_upforecastWill volatility be higher over the next month?
Higher volatility next month

Answers

QuestionAnswerReading
liquid
Trades more than $100 million a day
0.9463true
liquid_50m
Does the stock trade more than $50 million a day on average
compiled to avg(C * V, 20) > 50000000
0.9463true
atr_low
Is the 14-day ATR less than 2% of the price
compiled to atr(14) / C < 0.02
0.0537false
wide_day
True range 1.5× yesterday's ATR
0.1121false
vol_up
Higher volatility next month
0.15816% · unlikely

What it means

For CMG on the session of 2026-10-30: True now: Trades more than $100 million a day; Does the stock trade more than $50 million a day on average. Not true: Is the 14-day ATR less than 2% of the price; True range 1.5× yesterday's ATR. Forecasts: Higher volatility next month 16%.

Ample dollar volume and moderate ranges mean the order can be worked over a few days; wide ranges argue for a slower build.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "CMG"
  },
  "questions": {
    "liquid": {
      "type": "yes_no",
      "ask": "avg(C * V, 20) > 100000000"
    },
    "liquid_50m": {
      "type": "yes_no",
      "instructions": "Does the stock trade more than $50 million a day on average?"
    },
    "atr_low": {
      "type": "yes_no",
      "instructions": "Is the 14-day ATR less than 2% of the price?"
    },
    "wide_day": {
      "type": "yes_no",
      "ask": "tr() > 1.5 * ref(atr(14), -1)"
    },
    "vol_up": {
      "type": "yes_no",
      "instructions": "Will volatility be higher over the next month?"
    }
  }
}
Response JSON (CMG, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "liquid": {
      "yes_no": 0.9463,
      "rule": "avg(C * V, 20) > 100000000",
      "basis": "rule"
    },
    "liquid_50m": {
      "yes_no": 0.9463,
      "rule": "avg(C * V, 20) > 50000000",
      "basis": "pattern"
    },
    "atr_low": {
      "yes_no": 0.0537,
      "rule": "atr(14) / C < 0.02",
      "basis": "pattern"
    },
    "wide_day": {
      "yes_no": 0.1121,
      "rule": "tr() > 1.5 * ref(atr(14), -1)",
      "basis": "rule"
    },
    "vol_up": {
      "yes_no": 0.158
    }
  },
  "context": {
    "symbol": "CMG",
    "as_of": "2026-10-30"
  }
}

atr avg ref tr

Portfolio manager (long-only) · example 12

Underweight NVDA: is the trend still running away?

Being underweight the largest benchmark name hurts; check whether its trend is strengthening or tiring before closing the gap.

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

State

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

Questions

adxruleadx(14) > 25
Trending (ADX above 25)
dirulediplus(14) > diminus(14)
+DI above -DI (buyers in control)
new_highrulehighestbars(H, 20) <= 3
Set its 20-day high in the last four sessions
macd_histrulemacdhist(C) > ref(macdhist(C), -1)
MACD histogram rising
dojiruledoji() and roc(C, 20) > 10
Doji after a 10% month
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

QuestionAnswerReading
adx
Trending (ADX above 25)
0.0578false
di
+DI above -DI (buyers in control)
0.0637false
new_high
Set its 20-day high in the last four sessions
0.0566false
macd_hist
MACD histogram rising
0.1232false
doji
Doji after a 10% month
0.0537false
beat_spy
Beating SPY over a month
0.49950% · close to even

Actions

Rules on the answers decide what to send.

adx >= 0.6 and di >= 0.6 and beat_spy >= 0.55→Webhookoms
else→Slackpm-desk
What each action would send 1 of 2 fired · dry run, nothing sent
close_gaprule false: skipped
waitwould send (dry run)Slack → pm-desk
{
  "text": "NVDA (2026-10-30): trend strength 6%, buyers in control 6%, beat SPY 50%. Keeping the underweight for now."
}

What it means

For NVDA on the session of 2026-10-30: Not true: Trending (ADX above 25); +DI above -DI (buyers in control); Set its 20-day high in the last four sessions; MACD histogram rising; Doji after a 10% month. Forecasts: Beating SPY over a month 50%. Fired: wait (Slack → pm-desk).

A strong, buyer-led trend with decent odds against SPY sends an order intent to the OMS; otherwise the desk gets a note that the underweight stays.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "adx": {
      "type": "yes_no",
      "ask": "adx(14) > 25"
    },
    "di": {
      "type": "yes_no",
      "ask": "diplus(14) > diminus(14)"
    },
    "new_high": {
      "type": "yes_no",
      "ask": "highestbars(H, 20) <= 3"
    },
    "macd_hist": {
      "type": "yes_no",
      "ask": "macdhist(C) > ref(macdhist(C), -1)"
    },
    "doji": {
      "type": "yes_no",
      "ask": "doji() and roc(C, 20) > 10"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  },
  "actions": [
    {
      "id": "close_gap",
      "when": "adx >= 0.6 and di >= 0.6 and beat_spy >= 0.55",
      "do": "webhook",
      "connection": "oms",
      "body": {
        "symbol": "{{symbol}}",
        "intent": "raise_toward_benchmark_weight",
        "p_adx": "{{adx}}",
        "p_beat_spy": "{{beat_spy}}",
        "as_of": "{{as_of}}"
      }
    },
    {
      "id": "wait",
      "when": "else",
      "do": "slack",
      "connection": "pm-desk",
      "message": "{{symbol}} ({{as_of}}): trend strength {{adx|pct}}, buyers in control {{di|pct}}, beat SPY {{beat_spy|pct}}. Keeping the underweight for now."
    }
  ],
  "dry_run": true
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "adx": {
      "yes_no": 0.0578,
      "rule": "adx(14) > 25",
      "basis": "rule"
    },
    "di": {
      "yes_no": 0.0637,
      "rule": "diplus(14) > diminus(14)",
      "basis": "rule"
    },
    "new_high": {
      "yes_no": 0.0566,
      "rule": "highestbars(H, 20) <= 3",
      "basis": "rule"
    },
    "macd_hist": {
      "yes_no": 0.1232,
      "rule": "macdhist(C) > ref(macdhist(C), -1)",
      "basis": "rule"
    },
    "doji": {
      "yes_no": 0.0537,
      "rule": "doji() and roc(C, 20) > 10",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.499
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "close_gap",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "wait",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "pm-desk",
      "preview": {
        "text": "NVDA (2026-10-30): trend strength 6%, buyers in control 6%, beat SPY 50%. Keeping the underweight for now."
      }
    }
  ]
}

adx diminus diplus doji highestbars macdhist ref roc

Portfolio manager (long-only) · example 13

Topping candles on COST at the highs?

A long-held winner near its highs: check for an evening star, bearish engulfing or dark cloud cover.

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

eveningruleevening_star()
evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.
engulfruleengulfing_bear()
engulfing bear candle: A red body that engulfs yesterday's green body.
cloudruledark_cloud()
dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).
near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
evening
evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.
0.0678false
engulf
engulfing bear candle: A red body that engulfs yesterday's green body.
0.0912false
cloud
dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).
0.0812false
near_high
Within 2% of the 52-week high
0.0786false
drop5
A 5% drawdown within a month
0.31932% · unlikely

What it means

For COST on the session of 2026-10-30: Not true: evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.; engulfing bear candle: A red body that engulfs yesterday's green body.; dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).; Within 2% of the 52-week high. Forecasts: A 5% drawdown within a month 32%.

A bearish candle at the high is a prompt to check the thesis and the weight, not an exit signal on its own.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "COST"
  },
  "questions": {
    "evening": {
      "type": "yes_no",
      "ask": "evening_star()"
    },
    "engulf": {
      "type": "yes_no",
      "ask": "engulfing_bear()"
    },
    "cloud": {
      "type": "yes_no",
      "ask": "dark_cloud()"
    },
    "near_high": {
      "type": "yes_no",
      "ask": "C >= 0.98 * max(H, 252)"
    },
    "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": {
    "evening": {
      "yes_no": 0.0678,
      "rule": "evening_star()",
      "basis": "rule"
    },
    "engulf": {
      "yes_no": 0.0912,
      "rule": "engulfing_bear()",
      "basis": "rule"
    },
    "cloud": {
      "yes_no": 0.0812,
      "rule": "dark_cloud()",
      "basis": "rule"
    },
    "near_high": {
      "yes_no": 0.0786,
      "rule": "C >= 0.98 * max(H, 252)",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.319
    }
  },
  "context": {
    "symbol": "COST",
    "as_of": "2026-10-30"
  }
}

dark_cloud engulfing_bear evening_star max

Portfolio manager (long-only) · example 14

Pre-open earnings season digest for the PM

Each morning in season, list holdings that reported in the last day and whether they beat.

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

State

{"symbol":"JPM"} then BAC, WFC, GS, C, one request each. The server fills in the latest completed session.

Questions

reportedEnglish → ruleDid the stock report earnings in the last 1 days?
beatEnglish → ruleDid the stock beat EPS estimates last quarter?
gapEnglish → ruleDid the stock gap up after its last earnings?
bigruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%

Answers

SymbolreportedrulebeatrulegaprulebigruleFired
JPM0.05370.14090.94630.0664none
BAC0.05370.14090.05370.4222none
WFC0.05370.85910.05370.0537none
GS0.05370.85910.94630.0599none
C0.05370.85910.05370.9463none

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.

reported >= 0.6→Emailme
JPM 0 of 1 fired · dry run, nothing sent
BAC 0 of 1 fired · dry run, nothing sent
WFC 0 of 1 fired · dry run, nothing sent
GS 0 of 1 fired · dry run, nothing sent
C 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 5 symbols: Did the stock report earnings in the last 1 days: true for none of 5. Did the stock beat EPS estimates last quarter: true for WFC, GS, C of 5. Did the stock gap up after its last earnings: true for JPM, GS of 5. Last earnings move bigger than 5%: true for C of 5. reported_note fired for none.

Only names that just reported produce mail, so the inbox mirrors the earnings calendar of the book.

As a scheduled workflow (Mon–Fri at 08: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": "Pre-open earnings season digest for the PM",
  "symbols": "JPM BAC WFC GS C",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "08:00",
  "model": "ora-fin-0.1.1",
  "questions": {
    "reported": {
      "type": "yes_no",
      "instructions": "Did the stock report earnings in the last 1 days?"
    },
    "beat": {
      "type": "yes_no",
      "instructions": "Did the stock beat EPS estimates last quarter?"
    },
    "gap": {
      "type": "yes_no",
      "instructions": "Did the stock gap up after its last earnings?"
    },
    "big": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    }
  },
  "actions": [
    {
      "id": "reported_note",
      "when": "reported >= 0.6",
      "do": "email",
      "connection": "me",
      "subject": "{{symbol}} reported ({{as_of}})",
      "message": "{{symbol}} reported. Beat EPS {{beat|pct}}, gapped up {{gap|pct}}, reaction over 5% {{big|pct}}."
    }
  ]
}
Request JSON (JPM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JPM"
  },
  "questions": {
    "reported": {
      "type": "yes_no",
      "instructions": "Did the stock report earnings in the last 1 days?"
    },
    "beat": {
      "type": "yes_no",
      "instructions": "Did the stock beat EPS estimates last quarter?"
    },
    "gap": {
      "type": "yes_no",
      "instructions": "Did the stock gap up after its last earnings?"
    },
    "big": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    }
  },
  "actions": [
    {
      "id": "reported_note",
      "when": "reported >= 0.6",
      "do": "email",
      "connection": "me",
      "subject": "{{symbol}} reported ({{as_of}})",
      "message": "{{symbol}} reported. Beat EPS {{beat|pct}}, gapped up {{gap|pct}}, reaction over 5% {{big|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (JPM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "reported": {
      "yes_no": 0.0537,
      "rule": "days_since_earnings <= 1",
      "basis": "pattern"
    },
    "beat": {
      "yes_no": 0.1409,
      "rule": "beat_eps_last > 0.5",
      "basis": "pattern"
    },
    "gap": {
      "yes_no": 0.9463,
      "rule": "last_earnings_gap > 0",
      "basis": "pattern"
    },
    "big": {
      "yes_no": 0.0664,
      "rule": "abs(last_earnings_move) > 5",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "JPM",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "reported_note",
      "fired": false,
      "status": "skipped"
    }
  ]
}

abs beat_eps_last days_since_earnings last_earnings_gap last_earnings_move

Portfolio manager (long-only) · example 15

DIS: deep drawdown or still in a range?

A value holding: measure how far it sits from its 52-week high and whether the decline is slowing.

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

State

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

Questions

dd20ruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
lowbarsrulelowestbars(L, 60) >= 20
The 60-day low is at least 20 sessions old
zlowrulezscore(C, 20) < -2
Two deviations under the 20-day mean
higher_lowsrulemin(L, 5) > ref(min(L, 5), -5)
This week's low is above last week's
rally10forecastWill it rally at least 10% at some point in the next month?
A 10% rally within a month

Answers

QuestionAnswerReading
dd20
More than 20% off the 52-week high
0.0537false
lowbars
The 60-day low is at least 20 sessions old
0.5435on the line (true)
zlow
Two deviations under the 20-day mean
0.0621false
higher_lows
This week's low is above last week's
0.4398on the line (false)
rally10
A 10% rally within a month
0.3636% · unlikely

What it means

For DIS on the session of 2026-10-30: Not true: More than 20% off the 52-week high; Two deviations under the 20-day mean. On the line: The 60-day low is at least 20 sessions old; This week's low is above last week's. Forecasts: A 10% rally within a month 36%.

An old low with higher weekly lows says selling has slowed; a fresh low means patience before adding.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "DIS"
  },
  "questions": {
    "dd20": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "lowbars": {
      "type": "yes_no",
      "ask": "lowestbars(L, 60) >= 20"
    },
    "zlow": {
      "type": "yes_no",
      "ask": "zscore(C, 20) < -2"
    },
    "higher_lows": {
      "type": "yes_no",
      "ask": "min(L, 5) > ref(min(L, 5), -5)"
    },
    "rally10": {
      "type": "yes_no",
      "instructions": "Will it rally at least 10% at some point in the next month?"
    }
  }
}
Response JSON (DIS, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "dd20": {
      "yes_no": 0.0537,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "lowbars": {
      "yes_no": 0.5435,
      "rule": "lowestbars(L, 60) >= 20",
      "basis": "rule"
    },
    "zlow": {
      "yes_no": 0.0621,
      "rule": "zscore(C, 20) < -2",
      "basis": "rule"
    },
    "higher_lows": {
      "yes_no": 0.4398,
      "rule": "min(L, 5) > ref(min(L, 5), -5)",
      "basis": "rule"
    },
    "rally10": {
      "yes_no": 0.36
    }
  },
  "context": {
    "symbol": "DIS",
    "as_of": "2026-10-30"
  }
}

lowestbars max min ref zscore

Portfolio manager (long-only) · example 16

Quarterly rebalance: which sector ETFs ran furthest?

Rank the sector sleeves by how stretched they are versus their 200-day before the quarterly rebalance.

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

State

{"symbol":"XLF"} then XLE, XLI, XLY, XLP, XLU, one request each. The server fills in the latest completed session.

Questions

extruleC > sma(C, 200) * 1.10
More than 10% above the 200-day
near_200ruleabs(C / sma(C, 200) - 1) < 0.03
Within 3% of the 200-day
momruleroc(C, 63) > 10 and C >= 0.95 * max(H, 63)
Up more than 10% in a quarter, near the high

Answers

Symbolextrulenear_200rulemomrule
XLF0.10180.1850.0785
XLE0.94630.05370.9336
XLI0.05480.45220.0537
XLY0.05370.91130.0537
XLP0.10530.07360.0812
XLU0.05370.74770.0549

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

What it means

Session of 2026-10-30, 6 symbols: More than 10% above the 200-day: true for XLE of 6. Within 3% of the 200-day: true for XLY, XLU of 6. Up more than 10% in a quarter, near the high: true for XLE of 6.

Sleeves far above their 200-day are trimmed back to target first; sleeves near it are where new money goes.

Request JSON (XLF; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLF"
  },
  "questions": {
    "ext": {
      "type": "yes_no",
      "ask": "C > sma(C, 200) * 1.10"
    },
    "near_200": {
      "type": "yes_no",
      "ask": "abs(C / sma(C, 200) - 1) < 0.03"
    },
    "mom": {
      "type": "yes_no",
      "ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
    }
  }
}
Response JSON (XLF, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "ext": {
      "yes_no": 0.1018,
      "rule": "C > sma(C, 200) * 1.10",
      "basis": "rule"
    },
    "near_200": {
      "yes_no": 0.185,
      "rule": "abs(C / sma(C, 200) - 1) < 0.03",
      "basis": "rule"
    },
    "mom": {
      "yes_no": 0.0785,
      "rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "XLF",
    "as_of": "2026-10-30"
  }
}

abs max roc sma

Portfolio manager (long-only) · example 17

A holding gapped down: PYPL triage

When a holding opens sharply lower, decide quickly whether the gap is being bought or extending.

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

State

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

Questions

gap_downrulegap_down()
gap down candle: Today's whole range is below yesterday's low.
reclaimedruleO < L[-1] and C > C[-1]
Opened under yesterday's low, closed up on the day
close_lowrule(C - L) / (H - L) < 0.25
Closed in the bottom quarter of the day's range
down_volruleC < C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Down on heavy volume
fillforecastWill the gap fill within 5 sessions?

Answers

QuestionAnswerReading
gap_down
gap down candle: Today's whole range is below yesterday's low.
0.1328false
reclaimed
Opened under yesterday's low, closed up on the day
0.2205false
close_low
Closed in the bottom quarter of the day's range
0.1933false
down_vol
Down on heavy volume
0.3255false
fill
Will the gap fill within 5 sessions
0.33634% · unlikely

Actions

Rules on the answers decide what to send.

gap_down >= 0.6 and down_vol >= 0.6→Slackpm-desk
What each action would send 0 of 1 fired · dry run, nothing sent
escalaterule false: skipped

What it means

For PYPL on the session of 2026-10-30: Not true: gap down candle: Today's whole range is below yesterday's low.; Opened under yesterday's low, closed up on the day; Closed in the bottom quarter of the day's range; Down on heavy volume. Forecasts: Will the gap fill within 5 sessions 34%. No action fired: every rule was false.

A gap down on heavy volume that closes near the low is an escalation; a reclaimed gap is usually noise for a long-only holder.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "PYPL"
  },
  "questions": {
    "gap_down": {
      "type": "yes_no",
      "ask": "gap_down()"
    },
    "reclaimed": {
      "type": "yes_no",
      "ask": "O < L[-1] and C > C[-1]"
    },
    "close_low": {
      "type": "yes_no",
      "ask": "(C - L) / (H - L) < 0.25"
    },
    "down_vol": {
      "type": "yes_no",
      "ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "fill": {
      "type": "yes_no",
      "instructions": "Will the gap fill within 5 sessions?"
    }
  },
  "actions": [
    {
      "id": "escalate",
      "when": "gap_down >= 0.6 and down_vol >= 0.6",
      "do": "slack",
      "connection": "pm-desk",
      "message": "{{symbol}} ({{as_of}}): unfilled gap down on heavy volume. Gap fill within 5 sessions: {{fill|pct}}. Call with the analyst at 14:00."
    }
  ],
  "dry_run": true
}
Response JSON (PYPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "gap_down": {
      "yes_no": 0.1328,
      "rule": "gap_down()",
      "basis": "rule"
    },
    "reclaimed": {
      "yes_no": 0.2205,
      "rule": "O < L[-1] and C > C[-1]",
      "basis": "rule"
    },
    "close_low": {
      "yes_no": 0.1933,
      "rule": "(C - L) / (H - L) < 0.25",
      "basis": "rule"
    },
    "down_vol": {
      "yes_no": 0.3255,
      "rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "fill": {
      "yes_no": 0.336
    }
  },
  "context": {
    "symbol": "PYPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "escalate",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg gap_down offset ref

Portfolio manager (long-only) · example 18

HD trend with a smoothed filter

Use a slower, smoothed trend line to avoid reacting to every wiggle in a core holding.

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

State

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

Questions

rec_trendruleC > rec(C, self + 0.05 * (C - self))
Above a smoothed recursive trend line
rmaruleC > rma(C, 50)
Above the 50-day Wilder average
mean100ruleC > mean(C, 100)
Above the 100-day average
hlc3_trendrulehlc3() > sma(hlc3(), 20)
Typical price above its 20-day average
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
rec_trend
Above a smoothed recursive trend line
0.8929true
rma
Above the 50-day Wilder average
0.8048true
mean100
Above the 100-day average
0.699true
hlc3_trend
Typical price above its 20-day average
0.9195true
drop5
A 5% drawdown within a month
0.45746% · close to even

What it means

For HD on the session of 2026-10-30: True now: Above a smoothed recursive trend line; Above the 50-day Wilder average; Above the 100-day average; Typical price above its 20-day average. Forecasts: A 5% drawdown within a month 46%.

When the slow filters agree the holding stays untouched; disagreement between them is a cue to look more closely.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "HD"
  },
  "questions": {
    "rec_trend": {
      "type": "yes_no",
      "ask": "C > rec(C, self + 0.05 * (C - self))"
    },
    "rma": {
      "type": "yes_no",
      "ask": "C > rma(C, 50)"
    },
    "mean100": {
      "type": "yes_no",
      "ask": "C > mean(C, 100)"
    },
    "hlc3_trend": {
      "type": "yes_no",
      "ask": "hlc3() > sma(hlc3(), 20)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (HD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "rec_trend": {
      "yes_no": 0.8929,
      "rule": "C > rec(C, self + 0.05 * (C - self))",
      "basis": "rule"
    },
    "rma": {
      "yes_no": 0.8048,
      "rule": "C > rma(C, 50)",
      "basis": "rule"
    },
    "mean100": {
      "yes_no": 0.699,
      "rule": "C > mean(C, 100)",
      "basis": "rule"
    },
    "hlc3_trend": {
      "yes_no": 0.9195,
      "rule": "hlc3() > sma(hlc3(), 20)",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.457
    }
  },
  "context": {
    "symbol": "HD",
    "as_of": "2026-10-30"
  }
}

hlc3 mean rec rma sma

Portfolio manager (long-only) · example 19

Corporate-action housekeeping on WMT and NVDA

Before reconciling share counts and income, check recent splits and dividend changes.

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

State

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

Questions

split_3yruledays_since_split <= 1095
Split in the last three years
ratiorulelast_split_ratio >= 4
Last split at least 4-for-1
raisedruleraised_last > 0.5
Raised its last dividend
ex_soonruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
split_nextruledays_to_split <= 365
A split is announced

Answers

Symbolsplit_3yruleratioruleraisedruleex_soonrulesplit_nextrule
WMT0.94630.06830.14090.05370.0537
NVDA0.94630.94630.14090.05370.0537

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: Split in the last three years: true for WMT, NVDA of 2. Last split at least 4-for-1: true for NVDA of 2. Raised its last dividend: true for none of 2. Goes ex-dividend within 30 days: true for none of 2.

Split and dividend facts tell operations which positions need a share-count or accrual check this month.

Request JSON (WMT; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "WMT"
  },
  "questions": {
    "split_3y": {
      "type": "yes_no",
      "ask": "days_since_split <= 1095"
    },
    "ratio": {
      "type": "yes_no",
      "ask": "last_split_ratio >= 4"
    },
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "ex_soon": {
      "type": "yes_no",
      "ask": "days_to_ex_div <= 30"
    },
    "split_next": {
      "type": "yes_no",
      "ask": "days_to_split <= 365"
    }
  }
}
Response JSON (WMT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "split_3y": {
      "yes_no": 0.9463,
      "rule": "days_since_split <= 1095",
      "basis": "rule"
    },
    "ratio": {
      "yes_no": 0.0683,
      "rule": "last_split_ratio >= 4",
      "basis": "rule"
    },
    "raised": {
      "yes_no": 0.1409,
      "rule": "raised_last > 0.5",
      "basis": "rule"
    },
    "ex_soon": {
      "yes_no": 0.0537,
      "rule": "days_to_ex_div <= 30",
      "basis": "rule"
    },
    "split_next": {
      "yes_no": 0.0537,
      "rule": "days_to_split <= 365",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "WMT",
    "as_of": "2026-10-30"
  }
}

days_since_split days_to_ex_div days_to_split last_split_ratio raised_last

Portfolio manager (long-only) · example 20

Consumer holdings: is weakness spreading?

Check two consumer holdings for lower swing highs and lows and closes under their 50-day.

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

State

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

Questions

lh_llEnglish → ruleIs the stock making lower swing highs and lower swing lows?
below_50ruleC < sma(C, 50)
Below the 50-day average
lower_highruleswinghigh(5, 1) < swinghigh(5, 2)
Latest swing high below the one before
three_crowsrulethree_black_crows()
three black crows candle: Three red bars, each closing lower and opening inside the previous body.
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

Symbollh_llrulebelow_50rulelower_highrulethree_crowsruledrop10forecast
TGT0.55310.66410.55310.09310.489
LOW0.05370.09980.05370.05370.575

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: Is the stock making lower swing highs and lower swing lows: true for none of 2. Below the 50-day average: true for TGT of 2. Latest swing high below the one before: true for none of 2. three black crows candle: Three red bars, each closing lower and opening inside the previous body.: true for none of 2. Highest odds for “A 10% drawdown within a month”: LOW at 57%.

Lower highs and lows in both names point to a sector problem rather than a single-stock one.

Request JSON (TGT; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "TGT"
  },
  "questions": {
    "lh_ll": {
      "type": "yes_no",
      "instructions": "Is the stock making lower swing highs and lower swing lows?"
    },
    "below_50": {
      "type": "yes_no",
      "ask": "C < sma(C, 50)"
    },
    "lower_high": {
      "type": "yes_no",
      "ask": "swinghigh(5, 1) < swinghigh(5, 2)"
    },
    "three_crows": {
      "type": "yes_no",
      "ask": "three_black_crows()"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    }
  }
}
Response JSON (TGT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "lh_ll": {
      "yes_no": 0.5531,
      "rule": "(swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))",
      "basis": "pattern"
    },
    "below_50": {
      "yes_no": 0.6641,
      "rule": "C < sma(C, 50)",
      "basis": "rule"
    },
    "lower_high": {
      "yes_no": 0.5531,
      "rule": "swinghigh(5, 1) < swinghigh(5, 2)",
      "basis": "rule"
    },
    "three_crows": {
      "yes_no": 0.0931,
      "rule": "three_black_crows()",
      "basis": "rule"
    },
    "drop10": {
      "yes_no": 0.489
    }
  },
  "context": {
    "symbol": "TGT",
    "as_of": "2026-10-30"
  }
}

sma swinghigh swinglow three_black_crows

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.