Use cases · Buy side
Hedge fund PM: 20 ways to use Ora
Long/short books: catalysts, crowding, stops and gross/net decisions every morning. Each example is a complete, runnable request with the real answers it returned (43 requests, captured 2026-10-31), what they mean and, where it fits, the action it would send.
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 (58)
sma 9offset 8ref 5atr 4avg 3lowest 3swinglow 3days_to_earnings 3roc 3log 2sqrt 2std 2macd 2swinghigh 2abs 2last_earnings_move 2ema 2rsi 2highest 2beat_eps_last 2beat_revenue_last 2percentrank 2days_to_ex_div 2tr 2macdsignal 1three_black_crows 1beat_streak 1eps_surprise_pct 1linreg 1engulfing_bear 1evening_star 1shooting_star 1days_since_earnings 1last_earnings_gap 1pre_earnings_close 1revenue_surprise_pct 1max 1dark_cloud 1next_report_bmo 1atr_pct 1three_white_soldiers 1adx 1highestbars 1div_yield_ttm 1next_div_amount 1hammer 1piercing_line 1stochk 1willr 1obv 1sign 1sum 1crossdown 1zscore 1days_since_split 1days_to_split 1last_split_ratio 1splits_5y 1
Examples 1–10 of 20 · page 1 of 2
Hedge fund PM · example 1
Morning gross/net read from SPY and QQQ
Before the open, decide whether to run the book with more or less net exposure from trend, volatility and drawdown odds.
- ScheduleMon–Fri at 08:15 ET
- State2 symbols
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"SPY"} then QQQ, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
above_50d | rule | C > sma(C, 50)Above the 50-day average |
hv | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
vol5 | English → rule | Is 5-day volatility higher than 20-day volatility? |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
vol_up | forecast | Will volatility be higher over the next month? Higher volatility next month |
Answers
| Symbol | trendrule | above_50drule | hvrule | vol5rule | drop5forecast | vol_upforecast | Fired |
|---|---|---|---|---|---|---|---|
SPY | 0.9451 | 0.1128 | 0.0537 | 0.8872 | 0.203 | 0.69 | cut_net |
QQQ | 0.7987 | 0.0653 | 0.0537 | 0.9069 | 0.443 | 0.523 | cut_net |
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.
drop5 >= 0.5 or (above_50d < 0.4 and vol5 >= 0.6)→Slackpm-deskelse→Slackpm-desk{
"text": "SPY (2026-10-30): cut net. Under the 50-day 11%, short-term vol rising 89%, 5% drawdown odds 20%."
}{
"text": "QQQ (2026-10-30): cut net. Under the 50-day 7%, short-term vol rising 91%, 5% drawdown odds 44%."
}What it means
Session of 2026-10-30, 2 symbols: Is the stock above its 200-day moving average: true for SPY, QQQ of 2. Above the 50-day average: true for none of 2. Annualized 20-day volatility above 40%: true for none of 2. Is 5-day volatility higher than 20-day volatility: true for SPY, QQQ of 2. Highest odds for “A 5% drawdown within a month”: QQQ at 44%. cut_net fired for SPY, QQQ. hold_net fired for none.
The desk gets a cut or keep line per index each morning; the PM still sizes the change, the rule only frames it.
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": "Morning gross/net read from SPY and QQQ",
"symbols": "SPY QQQ",
"days": [
1,
2,
3,
4,
5
],
"at_time": "08:15",
"model": "ora-fin-0.1.1",
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"above_50d": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"vol5": {
"type": "yes_no",
"instructions": "Is 5-day volatility higher than 20-day volatility?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
}
},
"actions": [
{
"id": "cut_net",
"when": "drop5 >= 0.5 or (above_50d < 0.4 and vol5 >= 0.6)",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} ({{as_of}}): cut net. Under the 50-day {{above_50d|pct}}, short-term vol rising {{vol5|pct}}, 5% drawdown odds {{drop5|pct}}."
},
{
"id": "hold_net",
"when": "else",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} ({{as_of}}): keep net. Above the 200-day {{trend|pct}}; higher vol next month {{vol_up|pct}}."
}
]
}Request JSON (SPY; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"above_50d": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"hv": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
},
"vol5": {
"type": "yes_no",
"instructions": "Is 5-day volatility higher than 20-day volatility?"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
},
"vol_up": {
"type": "yes_no",
"instructions": "Will volatility be higher over the next month?"
}
},
"actions": [
{
"id": "cut_net",
"when": "drop5 >= 0.5 or (above_50d < 0.4 and vol5 >= 0.6)",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} ({{as_of}}): cut net. Under the 50-day {{above_50d|pct}}, short-term vol rising {{vol5|pct}}, 5% drawdown odds {{drop5|pct}}."
},
{
"id": "hold_net",
"when": "else",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} ({{as_of}}): keep net. Above the 200-day {{trend|pct}}; higher vol next month {{vol_up|pct}}."
}
],
"dry_run": true
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.9451,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"above_50d": {
"yes_no": 0.1128,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"hv": {
"yes_no": 0.0537,
"rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
"basis": "rule"
},
"vol5": {
"yes_no": 0.8872,
"rule": "std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19)",
"basis": "pattern"
},
"drop5": {
"yes_no": 0.203
},
"vol_up": {
"yes_no": 0.69
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "cut_net",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "pm-desk",
"preview": {
"text": "SPY (2026-10-30): cut net. Under the 50-day 11%, short-term vol rising 89%, 5% drawdown odds 20%."
}
},
{
"id": "hold_net",
"fired": false,
"status": "skipped"
}
]
}Hedge fund PM · example 2
Short candidate: is INTC breaking down on volume?
Confirm a short thesis with structure: lower swing highs and lows, a breakdown on volume and weak momentum.
- StateINTC
- Questions6 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"INTC"} The server fills in the latest completed session.
Questions
lh_ll | English → rule | Is the stock making lower swing highs and lower swing lows? |
breakdown | rule | C < lowest(L, 20)Closed under the 20-day low |
down_vol | rule | C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)Down on heavy volume |
macd_dn | rule | macd(C) < macdsignal(C)MACD under its signal line |
crows | rule | three_black_crows()three black crows candle: Three red bars, each closing lower and opening inside the previous body. |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
lh_llIs 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.1552 | false |
breakdownClosed under the 20-day low | 0.9122 | true |
down_volDown on heavy volume | 0.9463 | true |
macd_dnMACD under its signal line | 0.8659 | true |
crowsthree black crows candle: Three red bars, each closing lower and opening inside the previous body. | 0.0537 | false |
drop10A 10% drawdown within a month | 0.836 | 84% · likely |
Actions
Rules on the answers decide what to send.
breakdown >= 0.6 and down_vol >= 0.6→Webhookoms{
"side": "sell_short",
"symbol": "INTC",
"size_bps_nav": 25,
"stop": "above_last_swing_high",
"thesis": "breakdown_on_volume",
"p_breakdown": 0.9122,
"p_drop10": 0.836,
"as_of": "2026-10-30"
}What it means
For INTC on the session of 2026-10-30: True now: Closed under the 20-day low; Down on heavy volume; MACD under its signal line. Not true: Is the stock making lower swing highs and lower swing lows; three black crows candle: Three red bars, each closing lower and opening inside the previous body.. Forecasts: A 10% drawdown within a month 84%. Fired: short_ticket (Webhook → oms).
A staged short ticket goes to the OMS only when the breakdown and the volume both confirm; structure and momentum support the thesis but do not trigger it.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "INTC"
},
"questions": {
"lh_ll": {
"type": "yes_no",
"instructions": "Is the stock making lower swing highs and lower swing lows?"
},
"breakdown": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"down_vol": {
"type": "yes_no",
"ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
},
"macd_dn": {
"type": "yes_no",
"ask": "macd(C) < macdsignal(C)"
},
"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?"
}
},
"actions": [
{
"id": "short_ticket",
"when": "breakdown >= 0.6 and down_vol >= 0.6",
"do": "webhook",
"connection": "oms",
"body": {
"side": "sell_short",
"symbol": "{{symbol}}",
"size_bps_nav": 25,
"stop": "above_last_swing_high",
"thesis": "breakdown_on_volume",
"p_breakdown": "{{breakdown}}",
"p_drop10": "{{drop10}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (INTC, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"lh_ll": {
"yes_no": 0.1552,
"rule": "(swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))",
"basis": "pattern"
},
"breakdown": {
"yes_no": 0.9122,
"rule": "C < lowest(L, 20)",
"basis": "rule"
},
"down_vol": {
"yes_no": 0.9463,
"rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
"basis": "rule"
},
"macd_dn": {
"yes_no": 0.8659,
"rule": "macd(C) < macdsignal(C)",
"basis": "rule"
},
"crows": {
"yes_no": 0.0537,
"rule": "three_black_crows()",
"basis": "rule"
},
"drop10": {
"yes_no": 0.836
}
},
"context": {
"symbol": "INTC",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "short_ticket",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "oms",
"preview": {
"body": {
"side": "sell_short",
"symbol": "INTC",
"size_bps_nav": 25,
"stop": "above_last_swing_high",
"thesis": "breakdown_on_volume",
"p_breakdown": 0.9122,
"p_drop10": 0.836,
"as_of": "2026-10-30"
}
}
}
]
}avg lowest macd macdsignal offset ref swinghigh swinglow three_black_crows
Hedge fund PM · example 3
Earnings catalyst: size NFLX into the print or not?
Decide whether to hold full size through the report using the beat record, the last reaction and the forecast.
- StateNFLX
- Questions6 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"NFLX"} The server fills in the latest completed session.
Questions
soon | rule | days_to_earnings <= 10Reports earnings within 10 days |
streak | rule | beat_streak >= 4Beat four quarters in a row |
big_move | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
surprise | rule | eps_surprise_pct > 5EPS beat by more than 5% |
beat_next | forecast | Will the stock beat earnings next quarter? Beating earnings next quarter |
big5 | forecast | Will there be a big move in either direction in the next 5 days? A big move either way in 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
soonReports earnings within 10 days | 0.0537 | false |
streakBeat four quarters in a row | 0.55 | on the line (true) |
big_moveLast earnings move bigger than 5% | 0.9463 | true |
surpriseEPS beat by more than 5% | 0.6333 | true |
beat_nextBeating earnings next quarter | 0.498 | 50% · close to even |
big5A big move either way in 5 days | 0.325 | 33% · unlikely |
Actions
Rules on the answers decide what to send.
soon >= 0.6 and big_move >= 0.6→Slackpm-deskWhat it means
For NFLX on the session of 2026-10-30: True now: Last earnings move bigger than 5%; EPS beat by more than 5%. Not true: Reports earnings within 10 days. On the line: Beat four quarters in a row. Forecasts: Beating earnings next quarter 50%; A big move either way in 5 days 33%. No action fired: every rule was false.
A history of big reactions makes the event a coin flip with fat tails; the beat forecast is odds, so sizing down is a risk choice, not a call.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NFLX"
},
"questions": {
"soon": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"streak": {
"type": "yes_no",
"ask": "beat_streak >= 4"
},
"big_move": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
},
"surprise": {
"type": "yes_no",
"ask": "eps_surprise_pct > 5"
},
"beat_next": {
"type": "yes_no",
"instructions": "Will the stock beat earnings next quarter?"
},
"big5": {
"type": "yes_no",
"instructions": "Will there be a big move in either direction in the next 5 days?"
}
},
"actions": [
{
"id": "size_down",
"when": "soon >= 0.6 and big_move >= 0.6",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} reports within 10 days and the last reaction was over 5%. Halve size into the print unless the thesis is the print. Beat next {{beat_next|pct}}."
}
],
"dry_run": true
}Response JSON (NFLX, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"soon": {
"yes_no": 0.0537,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"streak": {
"yes_no": 0.55,
"rule": "beat_streak >= 4",
"basis": "rule"
},
"big_move": {
"yes_no": 0.9463,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
},
"surprise": {
"yes_no": 0.6333,
"rule": "eps_surprise_pct > 5",
"basis": "rule"
},
"beat_next": {
"yes_no": 0.498
},
"big5": {
"yes_no": 0.325
}
},
"context": {
"symbol": "NFLX",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "size_down",
"fired": false,
"status": "skipped"
}
]
}abs beat_streak days_to_earnings eps_surprise_pct last_earnings_move
Hedge fund PM · example 4
Pair trade check: XOM vs CVX momentum
Same questions on both legs of an energy pair to see which side has the stronger trend and momentum.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XOM"} then CVX, one request each. The server fills in the latest completed session.
Questions
roc | rule | roc(C, 20) > 0Positive 20-day rate of change |
rsi50 | rule | rsi(C, 14) > 50RSI above 50 |
stacked | rule | C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)Stacked averages: close > 20 EMA > 50 > 200 |
linreg | rule | linreg(C, 50) > ref(linreg(C, 50), -10)50-day regression line higher than 10 sessions ago |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | rocrule | rsi50rule | stackedrule | linregrule | beat_spyforecast |
|---|---|---|---|---|---|
XOM | 0.9463 | 0.944 | 0.9436 | 0.9329 | 0.554 |
CVX | 0.9451 | 0.9438 | 0.9402 | 0.9276 | 0.564 |
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: Positive 20-day rate of change: true for XOM, CVX of 2. RSI above 50: true for XOM, CVX of 2. Stacked averages: close > 20 EMA > 50 > 200: true for XOM, CVX of 2. 50-day regression line higher than 10 sessions ago: true for XOM, CVX of 2. Highest odds for “Beating SPY over a month”: CVX at 56%.
Long the leg with more trend rules true and short the other; if both legs read the same, the pair has no edge today.
Request JSON (XOM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XOM"
},
"questions": {
"roc": {
"type": "yes_no",
"ask": "roc(C, 20) > 0"
},
"rsi50": {
"type": "yes_no",
"ask": "rsi(C, 14) > 50"
},
"stacked": {
"type": "yes_no",
"ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
},
"linreg": {
"type": "yes_no",
"ask": "linreg(C, 50) > ref(linreg(C, 50), -10)"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (XOM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"roc": {
"yes_no": 0.9463,
"rule": "roc(C, 20) > 0",
"basis": "rule"
},
"rsi50": {
"yes_no": 0.944,
"rule": "rsi(C, 14) > 50",
"basis": "rule"
},
"stacked": {
"yes_no": 0.9436,
"rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
"basis": "rule"
},
"linreg": {
"yes_no": 0.9329,
"rule": "linreg(C, 50) > ref(linreg(C, 50), -10)",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.554
}
},
"context": {
"symbol": "XOM",
"as_of": "2026-10-30"
}
}Hedge fund PM · example 5
Crowded long unwind risk in NVDA, AMD and SMH
When everyone owns the same semis, check for stretch and topping candles that often come before an unwind.
- State3 symbols
- Questions6 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"NVDA"} then AMD, SMH, one request each. The server fills in the latest completed session.
Questions
stretched | rule | C > sma(C, 20) + 2 * atr(14)Stretched: more than 2 ATR above the 20-day |
ext_200d | rule | C > sma(C, 200) * 1.10More than 10% above the 200-day |
evening | rule | evening_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. |
engulf_bear | rule | engulfing_bear()engulfing bear candle: A red body that engulfs yesterday's green body. |
shoot | rule | shooting_star() and H > highest(H, 20)Shooting star at a 20-day high |
drop10 | forecast | Will it drop at least 10% at some point in the next month? A 10% drawdown within a month |
Answers
| Symbol | stretchedrule | ext_200drule | eveningrule | engulf_bearrule | shootrule | drop10forecast | Fired |
|---|---|---|---|---|---|---|---|
NVDA | 0.0537 | 0.06 | 0.0975 | 0.0932 | 0.0537 | 0.523 | none |
AMD | 0.061 | 0.8701 | 0.1247 | 0.0537 | 0.0537 | 0.763 | none |
SMH | 0.0547 | 0.0985 | 0.18 | 0.0553 | 0.0537 | 0.641 | none |
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.
stretched >= 0.6 and (engulf_bear >= 0.6 or evening >= 0.6 or shoot >= 0.6)→Slackrisk-pmWhat it means
Session of 2026-10-30, 3 symbols: Stretched: more than 2 ATR above the 20-day: true for none of 3. More than 10% above the 200-day: true for AMD of 3. 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.: true for none of 3. engulfing bear candle: A red body that engulfs yesterday's green body.: true for none of 3. Highest odds for “A 10% drawdown within a month”: AMD at 76%. unwind_watch fired for none.
Stretch alone is common in a bull run; stretch plus a topping candle is the combination that gets the desk's attention.
Request JSON (NVDA; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"stretched": {
"type": "yes_no",
"ask": "C > sma(C, 20) + 2 * atr(14)"
},
"ext_200d": {
"type": "yes_no",
"ask": "C > sma(C, 200) * 1.10"
},
"evening": {
"type": "yes_no",
"ask": "evening_star()"
},
"engulf_bear": {
"type": "yes_no",
"ask": "engulfing_bear()"
},
"shoot": {
"type": "yes_no",
"ask": "shooting_star() and H > highest(H, 20)"
},
"drop10": {
"type": "yes_no",
"instructions": "Will it drop at least 10% at some point in the next month?"
}
},
"actions": [
{
"id": "unwind_watch",
"when": "stretched >= 0.6 and (engulf_bear >= 0.6 or evening >= 0.6 or shoot >= 0.6)",
"do": "slack",
"connection": "risk-pm",
"message": "{{symbol}} ({{as_of}}): stretched with a topping candle. 10% drawdown odds {{drop10|pct}}. Review crowded long exposure."
}
],
"dry_run": true
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"stretched": {
"yes_no": 0.0537,
"rule": "C > sma(C, 20) + 2 * atr(14)",
"basis": "rule"
},
"ext_200d": {
"yes_no": 0.06,
"rule": "C > sma(C, 200) * 1.10",
"basis": "rule"
},
"evening": {
"yes_no": 0.0975,
"rule": "evening_star()",
"basis": "rule"
},
"engulf_bear": {
"yes_no": 0.0932,
"rule": "engulfing_bear()",
"basis": "rule"
},
"shoot": {
"yes_no": 0.0537,
"rule": "shooting_star() and H > highest(H, 20)",
"basis": "rule"
},
"drop10": {
"yes_no": 0.523
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "unwind_watch",
"fired": false,
"status": "skipped"
}
]
}Hedge fund PM · example 6
Stop discipline across the long book
After the close, check every long against a chandelier stop and send exits to the OMS for the trader to work.
- ScheduleMon–Fri at 16:20 ET
- State6 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then MSFT, AMZN, LLY, COST, JPM, one request each. The server fills in the latest completed session.
Questions
chandelier | rule | C < highest(H, 22) - 3 * atr(22)Chandelier exit: 3 ATR under the 22-day high |
swing2 | rule | C < swinglow(5, 2)Closed below the second-to-last swing low |
low_break | rule | C < lowest(L, 20)Closed under the 20-day low |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Symbol | chandelierrule | swing2rule | low_breakrule | drop5forecast | Fired |
|---|---|---|---|---|---|
AAPL | 0.1292 | 0.1183 | 0.0744 | 0.365 | none |
MSFT | 0.2332 | 0.1213 | 0.365 | 0.422 | none |
AMZN | 0.7594 | 0.6774 | 0.5418 | 0.462 | exit |
LLY | 0.0644 | 0.0537 | 0.0537 | 0.583 | none |
COST | 0.0881 | 0.0632 | 0.0553 | 0.319 | none |
JPM | 0.121 | 0.1992 | 0.1005 | 0.30 | none |
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.
chandelier >= 0.6 or swing2 >= 0.6→Webhookoms{
"side": "sell",
"symbol": "AMZN",
"qty": "all",
"reason": "stop",
"p_chandelier": 0.7594,
"p_swing2": 0.6774,
"as_of": "2026-10-30"
}What it means
Session of 2026-10-30, 6 symbols: Chandelier exit: 3 ATR under the 22-day high: true for AMZN of 6. Closed below the second-to-last swing low: true for AMZN of 6. Closed under the 20-day low: true for none of 6. Highest odds for “A 5% drawdown within a month”: LLY at 58%. exit fired for AMZN.
Stops are exact rules on the close, so exits are mechanical; the drawdown forecast is attached for the trader's context.
As a scheduled workflow (Mon–Fri at 16:20 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": "Stop discipline across the long book",
"symbols": "AAPL MSFT AMZN LLY COST JPM",
"days": [
1,
2,
3,
4,
5
],
"at_time": "16:20",
"model": "ora-fin-0.1.1",
"questions": {
"chandelier": {
"type": "yes_no",
"ask": "C < highest(H, 22) - 3 * atr(22)"
},
"swing2": {
"type": "yes_no",
"ask": "C < swinglow(5, 2)"
},
"low_break": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "exit",
"when": "chandelier >= 0.6 or swing2 >= 0.6",
"do": "webhook",
"connection": "oms",
"body": {
"side": "sell",
"symbol": "{{symbol}}",
"qty": "all",
"reason": "stop",
"p_chandelier": "{{chandelier}}",
"p_swing2": "{{swing2}}",
"as_of": "{{as_of}}"
}
}
]
}Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"chandelier": {
"type": "yes_no",
"ask": "C < highest(H, 22) - 3 * atr(22)"
},
"swing2": {
"type": "yes_no",
"ask": "C < swinglow(5, 2)"
},
"low_break": {
"type": "yes_no",
"ask": "C < lowest(L, 20)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "exit",
"when": "chandelier >= 0.6 or swing2 >= 0.6",
"do": "webhook",
"connection": "oms",
"body": {
"side": "sell",
"symbol": "{{symbol}}",
"qty": "all",
"reason": "stop",
"p_chandelier": "{{chandelier}}",
"p_swing2": "{{swing2}}",
"as_of": "{{as_of}}"
}
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"chandelier": {
"yes_no": 0.1292,
"rule": "C < highest(H, 22) - 3 * atr(22)",
"basis": "rule"
},
"swing2": {
"yes_no": 0.1183,
"rule": "C < swinglow(5, 2)",
"basis": "rule"
},
"low_break": {
"yes_no": 0.0744,
"rule": "C < lowest(L, 20)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.365
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "exit",
"fired": false,
"status": "skipped"
}
]
}Hedge fund PM · example 7
Post-earnings drift long: did LLY beat, gap and hold?
Look for the drift setup after a report: beat on both lines, gap up, and still above the pre-report price.
- StateLLY
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"LLY"} The server fills in the latest completed session.
Questions
drift | rule | beat_eps_last > 0.5 and last_earnings_gap > 0 and C > pre_earnings_closePost-earnings drift: beat, gapped up, still above the pre-earnings close |
beat_both | rule | beat_eps_last > 0.5 and beat_revenue_last > 0.5Beat on EPS and revenue last quarter |
rev_surprise | rule | revenue_surprise_pct > 2Revenue beat estimates by more than 2% |
recent | rule | days_since_earnings <= 5Reported in the last 5 days |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
driftPost-earnings drift: beat, gapped up, still above the pre-earnings close | 0.8591 | true |
beat_bothBeat on EPS and revenue last quarter | 0.8591 | true |
rev_surpriseRevenue beat estimates by more than 2% | 0.9463 | true |
recentReported in the last 5 days | 0.8967 | true |
up_weekHigher in a week | 0.542 | 54% · close to even |
What it means
For LLY on the session of 2026-10-30: True now: Post-earnings drift: beat, gapped up, still above the pre-earnings close; Beat on EPS and revenue last quarter; Revenue beat estimates by more than 2%; Reported in the last 5 days. Forecasts: Higher in a week 54%.
The drift rule needs every leg at once; a beat without the hold above the pre-report close is not the setup.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "LLY"
},
"questions": {
"drift": {
"type": "yes_no",
"ask": "beat_eps_last > 0.5 and last_earnings_gap > 0 and C > pre_earnings_close"
},
"beat_both": {
"type": "yes_no",
"ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
},
"rev_surprise": {
"type": "yes_no",
"ask": "revenue_surprise_pct > 2"
},
"recent": {
"type": "yes_no",
"ask": "days_since_earnings <= 5"
},
"up_week": {
"type": "yes_no",
"instructions": "Will the stock be higher in a week?"
}
}
}Response JSON (LLY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"drift": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5 and last_earnings_gap > 0 and C > pre_earnings_close",
"basis": "rule"
},
"beat_both": {
"yes_no": 0.8591,
"rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
"basis": "rule"
},
"rev_surprise": {
"yes_no": 0.9463,
"rule": "revenue_surprise_pct > 2",
"basis": "rule"
},
"recent": {
"yes_no": 0.8967,
"rule": "days_since_earnings <= 5",
"basis": "rule"
},
"up_week": {
"yes_no": 0.542
}
},
"context": {
"symbol": "LLY",
"as_of": "2026-10-30"
}
}beat_eps_last beat_revenue_last days_since_earnings last_earnings_gap pre_earnings_close revenue_surprise_pct
Hedge fund PM · example 8
Factor tilt check: MTUM, QUAL, VLUE and USMV
See which factor ETFs are trending to understand what the market is paying for before adjusting book tilts.
- State4 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MTUM"} then QUAL, VLUE, USMV, one request each. The server fills in the latest completed session.
Questions
trend | English → rule | Is the stock above its 200-day moving average? |
roc | rule | roc(C, 20) > 5Up more than 5% in 20 sessions |
near_high | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
pctrank | rule | percentrank(C, 252) > 80Close in the top 20% of the past year |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | rocrule | near_highrule | pctrankrule | beat_spyforecast |
|---|---|---|---|---|---|
MTUM | 0.2691 | 0.0537 | 0.0537 | 0.0604 | 0.486 |
QUAL | 0.9463 | 0.0554 | 0.2605 | 0.6861 | 0.495 |
VLUE | 0.9291 | 0.058 | 0.0581 | 0.1087 | 0.512 |
USMV | 0.9463 | 0.4568 | 0.8261 | 0.9459 | 0.427 |
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: Is the stock above its 200-day moving average: true for QUAL, VLUE, USMV of 4. Up more than 5% in 20 sessions: true for none of 4. Within 2% of the 52-week high: true for USMV of 4. Close in the top 20% of the past year: true for QUAL, USMV of 4. Highest odds for “Beating SPY over a month”: VLUE at 51%.
The factors near their highs with momentum are what the market rewards now; the book's tilts can be checked against that.
Request JSON (MTUM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MTUM"
},
"questions": {
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"roc": {
"type": "yes_no",
"ask": "roc(C, 20) > 5"
},
"near_high": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
},
"pctrank": {
"type": "yes_no",
"ask": "percentrank(C, 252) > 80"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (MTUM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.2691,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"roc": {
"yes_no": 0.0537,
"rule": "roc(C, 20) > 5",
"basis": "rule"
},
"near_high": {
"yes_no": 0.0537,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"pctrank": {
"yes_no": 0.0604,
"rule": "percentrank(C, 252) > 80",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.486
}
},
"context": {
"symbol": "MTUM",
"as_of": "2026-10-30"
}
}Hedge fund PM · example 9
Gap fade: did TSLA gap up and fail?
Spot a failed gap that traps late buyers, a short-term short setup.
- StateTSLA
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"TSLA"} The server fills in the latest completed session.
Questions
faded | rule | O > C[-1] and C < C[-1]Gapped up but closed under yesterday's close |
gap_fill | English → rule | Did today's gap up fill? |
dark | rule | dark_cloud()dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open). |
close_low | rule | (C - L) / (H - L) < 0.25Closed in the bottom quarter of the day's range |
gap_down | forecast | Will it gap down tomorrow? A gap down tomorrow |
down_week | forecast | Will the stock be lower in a week? Lower in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
fadedGapped up but closed under yesterday's close | 0.0708 | false |
gap_fillDid today's gap up fill compiled to (O > C[-1] * 1) and (L <= C[-1]) | 0.0708 | false |
darkdark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open). | 0.0708 | false |
close_lowClosed in the bottom quarter of the day's range | 0.0788 | false |
gap_downA gap down tomorrow | 0.157 | 16% · unlikely |
down_weekLower in a week | 0.455 | 46% · close to even |
Actions
Rules on the answers decide what to send.
faded >= 0.6 and close_low >= 0.6→Webhookomselse→Slackpm-desk{
"text": "TSLA (2026-10-30): no failed gap today (faded 7%)."
}What it means
For TSLA on the session of 2026-10-30: Not true: Gapped up but closed under yesterday's close; Did today's gap up fill; dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).; Closed in the bottom quarter of the day's range. Forecasts: A gap down tomorrow 16%; Lower in a week 46%. Fired: no_fade (Slack → pm-desk).
A gap that fades and closes near the low is the trap; the order only stages when both rules are true.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "TSLA"
},
"questions": {
"faded": {
"type": "yes_no",
"ask": "O > C[-1] and C < C[-1]"
},
"gap_fill": {
"type": "yes_no",
"instructions": "Did today's gap up fill?"
},
"dark": {
"type": "yes_no",
"ask": "dark_cloud()"
},
"close_low": {
"type": "yes_no",
"ask": "(C - L) / (H - L) < 0.25"
},
"gap_down": {
"type": "yes_no",
"instructions": "Will it gap down tomorrow?"
},
"down_week": {
"type": "yes_no",
"instructions": "Will the stock be lower in a week?"
}
},
"actions": [
{
"id": "fade",
"when": "faded >= 0.6 and close_low >= 0.6",
"do": "webhook",
"connection": "oms",
"body": {
"side": "sell_short",
"symbol": "{{symbol}}",
"size_bps_nav": 10,
"horizon": "1-3d",
"p_faded": "{{faded}}",
"p_close_low": "{{close_low}}",
"as_of": "{{as_of}}"
}
},
{
"id": "no_fade",
"when": "else",
"do": "slack",
"connection": "pm-desk",
"message": "{{symbol}} ({{as_of}}): no failed gap today (faded {{faded|pct}})."
}
],
"dry_run": true
}Response JSON (TSLA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"faded": {
"yes_no": 0.0708,
"rule": "O > C[-1] and C < C[-1]",
"basis": "rule"
},
"gap_fill": {
"yes_no": 0.0708,
"rule": "(O > C[-1] * 1) and (L <= C[-1])",
"basis": "pattern"
},
"dark": {
"yes_no": 0.0708,
"rule": "dark_cloud()",
"basis": "rule"
},
"close_low": {
"yes_no": 0.0788,
"rule": "(C - L) / (H - L) < 0.25",
"basis": "rule"
},
"gap_down": {
"yes_no": 0.157
},
"down_week": {
"yes_no": 0.455
}
},
"context": {
"symbol": "TSLA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "fade",
"fired": false,
"status": "skipped"
},
{
"id": "no_fade",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "pm-desk",
"preview": {
"text": "TSLA (2026-10-30): no failed gap today (faded 7%)."
}
}
]
}Hedge fund PM · example 10
Event calendar for the book: who reports or goes ex soon?
List the names with earnings or ex-dividend dates in the next two weeks so position sizes can be checked in advance.
- State5 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"AAPL"} then JNJ, PG, NKE, ORCL, one request each. The server fills in the latest completed session.
Questions
earn14 | English → rule | Is earnings in the next 14 days? |
ex30 | English → rule | Is the ex-dividend date within 30 days? |
bmo | English → rule | Does the stock report before the market opens next time? |
big_move | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
Answers
| Symbol | earn14rule | ex30rule | bmorule | big_moverule | Fired |
|---|---|---|---|---|---|
AAPL | 0.9463 | 0.0537 | 0.1409 | 0.9463 | calendar |
JNJ | 0.0537 | 0.9187 | 0.8591 | 0.9463 | calendar |
PG | 0.0537 | 0.0537 | 0.8591 | 0.9463 | none |
NKE | 0.0537 | 0.0537 | 0.1409 | 0.2018 | none |
ORCL | 0.0537 | 0.0537 | 0.1409 | 0.0537 | none |
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.
earn14 >= 0.6 or ex30 >= 0.6→Emailpm-team{
"subject": "Event soon: AAPL",
"text": "AAPL (2026-10-30): earnings within 14 days 95% (before the open 14%), ex-dividend within 30 days 5%. Last reaction over 5%: 95%."
}{
"subject": "Event soon: JNJ",
"text": "JNJ (2026-10-30): earnings within 14 days 5% (before the open 86%), ex-dividend within 30 days 92%. Last reaction over 5%: 95%."
}What it means
Session of 2026-10-30, 5 symbols: Is earnings in the next 14 days: true for AAPL of 5. Is the ex-dividend date within 30 days: true for JNJ of 5. Does the stock report before the market opens next time: true for JNJ, PG of 5. Last earnings move bigger than 5%: true for AAPL, JNJ, PG of 5. calendar fired for AAPL, JNJ.
Only names with an event soon produce an email; the others need no sizing change this cycle.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"earn14": {
"type": "yes_no",
"instructions": "Is earnings in the next 14 days?"
},
"ex30": {
"type": "yes_no",
"instructions": "Is the ex-dividend date within 30 days?"
},
"bmo": {
"type": "yes_no",
"instructions": "Does the stock report before the market opens next time?"
},
"big_move": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
}
},
"actions": [
{
"id": "calendar",
"when": "earn14 >= 0.6 or ex30 >= 0.6",
"do": "email",
"connection": "pm-team",
"subject": "Event soon: {{symbol}}",
"message": "{{symbol}} ({{as_of}}): earnings within 14 days {{earn14|pct}} (before the open {{bmo|pct}}), ex-dividend within 30 days {{ex30|pct}}. Last reaction over 5%: {{big_move|pct}}."
}
],
"dry_run": true
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"earn14": {
"yes_no": 0.9463,
"rule": "days_to_earnings <= 14",
"basis": "pattern"
},
"ex30": {
"yes_no": 0.0537,
"rule": "days_to_ex_div <= 30",
"basis": "pattern"
},
"bmo": {
"yes_no": 0.1409,
"rule": "next_report_bmo > 0.5",
"basis": "pattern"
},
"big_move": {
"yes_no": 0.9463,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "calendar",
"fired": true,
"status": "dry_run",
"do": "email",
"connection": "pm-team",
"preview": {
"subject": "Event soon: AAPL",
"text": "AAPL (2026-10-30): earnings within 14 days 95% (before the open 14%), ex-dividend within 30 days 5%. Last reaction over 5%: 95%."
}
}
]
}abs days_to_earnings days_to_ex_div last_earnings_move next_report_bmo
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, Quant researcher, Portfolio manager (long-only), Risk manager, Private equity, VC / growth investor, Fund-of-funds allocator.