Ora
All use cases All industries

Individuals

Retail investorActive day traderSwing traderOptions traderDividend investorLong-term passive investorCrypto traderFX traderCommodities traderSocial trading communityStudents and universities

Buy side

Financial advisor / RIAWealth managerFamily officeHedge fund PMQuant researcherPortfolio manager (long-only)Risk managerPrivate equityVC / growth investorFund-of-funds allocator

Sell side

Equity research analystSell-side sales traderExecution trader / deskMarket makerProp trading firmCompliance officer

Corporates

Investor relations teamCorporate treasuryCFO officeBank credit analystFinancial journalist / media

Builders

Quant developerFintech app builderRobo-advisorBroker appAlgo / bot developerData vendor / platformTrading educator / newsletter

Institutions

ETF issuerIndex providerInsurance investment officePension fundEndowmentSovereign wealth fund

Use cases · Sell side

Sell-side sales trader: 20 ways to use Ora

Turns the morning tape into client color: movers, levels, volume and events. Each example is a complete, runnable request with the real answers it returned (45 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 (40)

sma 11offset 10ref 8avg 6atr 4max 4swinghigh 3lowest 3rsi 3abs 2roc 2log 2days_to_earnings 2swinglow 2outside_bar 1last_earnings_gap 1median 1dragonfly_doji 1engulfing_bull 1highest 1cut_last 1days_to_ex_div 1div_yield_ttm 1sqrt 1std 1obv 1sign 1sum 1last_earnings_move 1next_report_amc 1tr 1beat_eps_last 1macdhist 1zscore 1crossup 1min 1atr_pct 1hl2 1ohlc4 1linreg 1

Examples 1–10 of 20 · page 1 of 2

Sell-side sales trader · example 1

Morning color on SPY, QQQ, IWM and DIA for clients

Before the open, a quick read on the index ETFs: trend, yesterday's candle, volume and next-week odds, posted to the sales channel.

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

State

{"symbol":"SPY"} then QQQ, IWM, DIA, one request each. The server fills in the latest completed session.

Questions

trendEnglish → ruleIs the stock above its 50-day moving average?
up_closeruleC > C[-1]
Closed higher than yesterday
volruleV > avg(V, 20)
Volume above its 20-day average
outsideruleoutside_bar()
outside bar candle: Today's high above yesterday's and low below it.
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

Symboltrendruleup_closerulevolruleoutsideruleup_weekforecastFired
SPY0.11280.05520.94630.06140.598color
QQQ0.06530.05370.94630.05370.561color
IWM0.21760.07070.45770.11470.526color
DIA0.28490.07840.89610.25870.567color

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.

trend >= 0→Slacksales-desk
SPY 1 of 1 fired · dry run, nothing sent
colorwould send (dry run)Slack → sales-desk
{
  "text": "SPY (2026-10-30): above 50-day 11%, closed up 6%, volume above average 95%, outside bar 6%. Higher in a week: 60%."
}
QQQ 1 of 1 fired · dry run, nothing sent
colorwould send (dry run)Slack → sales-desk
{
  "text": "QQQ (2026-10-30): above 50-day 7%, closed up 5%, volume above average 95%, outside bar 5%. Higher in a week: 56%."
}
IWM 1 of 1 fired · dry run, nothing sent
colorwould send (dry run)Slack → sales-desk
{
  "text": "IWM (2026-10-30): above 50-day 22%, closed up 7%, volume above average 46%, outside bar 11%. Higher in a week: 53%."
}
DIA 1 of 1 fired · dry run, nothing sent
colorwould send (dry run)Slack → sales-desk
{
  "text": "DIA (2026-10-30): above 50-day 28%, closed up 8%, volume above average 90%, outside bar 26%. Higher in a week: 57%."
}

What it means

Session of 2026-10-30, 4 symbols: Is the stock above its 50-day moving average: true for none of 4. Closed higher than yesterday: true for none of 4. Volume above its 20-day average: true for SPY, QQQ, DIA of 4. outside bar candle: Today's high above yesterday's and low below it.: true for none of 4. Highest odds for “Higher in a week”: SPY at 60%. color fired for SPY, QQQ, IWM, DIA.

Every index posts one line of color; sales traders lift the lines that fit each client's book.

As a scheduled workflow (Mon–Fri at 07:45 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 color on SPY, QQQ, IWM and DIA for clients",
  "symbols": "SPY QQQ IWM DIA",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "07:45",
  "model": "ora-fin-0.1.1",
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 50-day moving average?"
    },
    "up_close": {
      "type": "yes_no",
      "ask": "C > C[-1]"
    },
    "vol": {
      "type": "yes_no",
      "ask": "V > avg(V, 20)"
    },
    "outside": {
      "type": "yes_no",
      "ask": "outside_bar()"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  },
  "actions": [
    {
      "id": "color",
      "when": "trend >= 0",
      "do": "slack",
      "connection": "sales-desk",
      "message": "{{symbol}} ({{as_of}}): above 50-day {{trend|pct}}, closed up {{up_close|pct}}, volume above average {{vol|pct}}, outside bar {{outside|pct}}. Higher in a week: {{up_week|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 50-day moving average?"
    },
    "up_close": {
      "type": "yes_no",
      "ask": "C > C[-1]"
    },
    "vol": {
      "type": "yes_no",
      "ask": "V > avg(V, 20)"
    },
    "outside": {
      "type": "yes_no",
      "ask": "outside_bar()"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  },
  "actions": [
    {
      "id": "color",
      "when": "trend >= 0",
      "do": "slack",
      "connection": "sales-desk",
      "message": "{{symbol}} ({{as_of}}): above 50-day {{trend|pct}}, closed up {{up_close|pct}}, volume above average {{vol|pct}}, outside bar {{outside|pct}}. Higher in a week: {{up_week|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.1128,
      "rule": "C > sma(C, 50)",
      "basis": "comparison"
    },
    "up_close": {
      "yes_no": 0.0552,
      "rule": "C > C[-1]",
      "basis": "rule"
    },
    "vol": {
      "yes_no": 0.9463,
      "rule": "V > avg(V, 20)",
      "basis": "rule"
    },
    "outside": {
      "yes_no": 0.0614,
      "rule": "outside_bar()",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.598
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "color",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "sales-desk",
      "preview": {
        "text": "SPY (2026-10-30): above 50-day 11%, closed up 6%, volume above average 95%, outside bar 6%. Higher in a week: 60%."
      }
    }
  ]
}

avg offset outside_bar sma

Sell-side sales trader · example 2

TSLA moved on volume: talking points for clients

When a crowded name moves, give the desk exact talking points: size of move versus ATR, volume and where it closed in the range.

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

State

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

Questions

bigruleabs(C - C[-1]) > 1.5 * atr(14)
Today's move was bigger than 1.5 ATR
vol2xEnglish → ruleWas today's volume twice its 20-day average?
top_qrule(C - L) / (H - L) > 0.75
Closed in the top quarter of the day's range
bottom_qrule(C - L) / (H - L) < 0.25
Closed in the bottom quarter of the day's range
big5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

QuestionAnswerReading
big
Today's move was bigger than 1.5 ATR
0.054false
vol2x
Was today's volume twice its 20-day average
compiled to V > 2 * ref(avg(V, 20), -1)
0.0589false
top_q
Closed in the top quarter of the day's range
0.4656on the line (false)
bottom_q
Closed in the bottom quarter of the day's range
0.0788false
big5
A big move either way in 5 days
0.24825% · unlikely

Actions

Rules on the answers decide what to send.

big >= 0.6 and vol2x >= 0.6→Slacksales-desk
What each action would send 0 of 1 fired · dry run, nothing sent
call_clientsrule false: skipped

What it means

For TSLA on the session of 2026-10-30: Not true: Today's move was bigger than 1.5 ATR; Was today's volume twice its 20-day average; Closed in the bottom quarter of the day's range. On the line: Closed in the top quarter of the day's range. Forecasts: A big move either way in 5 days 25%. No action fired: every rule was false.

Only a big move on heavy volume asks the desk to call; the close-in-range answers say whether buyers or sellers finished the day.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "TSLA"
  },
  "questions": {
    "big": {
      "type": "yes_no",
      "ask": "abs(C - C[-1]) > 1.5 * atr(14)"
    },
    "vol2x": {
      "type": "yes_no",
      "instructions": "Was today's volume twice its 20-day average?"
    },
    "top_q": {
      "type": "yes_no",
      "ask": "(C - L) / (H - L) > 0.75"
    },
    "bottom_q": {
      "type": "yes_no",
      "ask": "(C - L) / (H - L) < 0.25"
    },
    "big5": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "call_clients",
      "when": "big >= 0.6 and vol2x >= 0.6",
      "do": "slack",
      "connection": "sales-desk",
      "message": "{{symbol}} ({{as_of}}): move over 1.5 ATR on twice normal volume. Closed top quarter {{top_q|pct}} / bottom quarter {{bottom_q|pct}}. Call the holders."
    }
  ],
  "dry_run": true
}
Response JSON (TSLA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "big": {
      "yes_no": 0.054,
      "rule": "abs(C - C[-1]) > 1.5 * atr(14)",
      "basis": "rule"
    },
    "vol2x": {
      "yes_no": 0.0589,
      "rule": "V > 2 * ref(avg(V, 20), -1)",
      "basis": "pattern"
    },
    "top_q": {
      "yes_no": 0.4656,
      "rule": "(C - L) / (H - L) > 0.75",
      "basis": "rule"
    },
    "bottom_q": {
      "yes_no": 0.0788,
      "rule": "(C - L) / (H - L) < 0.25",
      "basis": "rule"
    },
    "big5": {
      "yes_no": 0.248
    }
  },
  "context": {
    "symbol": "TSLA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "call_clients",
      "fired": false,
      "status": "skipped"
    }
  ]
}

abs atr avg offset ref

Sell-side sales trader · example 3

NFLX after earnings: gap, follow-through and the next levels

The morning after a report, tell clients whether the gap held, how the stock closed and where resistance sits.

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

State

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

Questions

gaprulelast_earnings_gap > 0
Gapped up after the last report
fadedruleO > C[-1] and C < C[-1]
Gapped up but closed under yesterday's close
near_resruleC <= swinghigh(5) and C >= 0.97 * swinghigh(5)
Within 3% under the last swing high
above_swruleC > swinghigh(5)
Above its last confirmed swing high
fillEnglish → ruleDid today's gap up fill?

Answers

QuestionAnswerReading
gap
Gapped up after the last report
0.0537false
faded
Gapped up but closed under yesterday's close
0.4872on the line (false)
near_res
Within 3% under the last swing high
0.0967false
above_sw
Above its last confirmed swing high
0.0771false
fill
Did today's gap up fill
compiled to (O > C[-1] * 1) and (L <= C[-1])
0.6813true

What it means

For NFLX on the session of 2026-10-30: True now: Did today's gap up fill. Not true: Gapped up after the last report; Within 3% under the last swing high; Above its last confirmed swing high. On the line: Gapped up but closed under yesterday's close.

A gap that held and cleared the swing high is a strong-color day; a faded gap is a different conversation.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NFLX"
  },
  "questions": {
    "gap": {
      "type": "yes_no",
      "ask": "last_earnings_gap > 0"
    },
    "faded": {
      "type": "yes_no",
      "ask": "O > C[-1] and C < C[-1]"
    },
    "near_res": {
      "type": "yes_no",
      "ask": "C <= swinghigh(5) and C >= 0.97 * swinghigh(5)"
    },
    "above_sw": {
      "type": "yes_no",
      "ask": "C > swinghigh(5)"
    },
    "fill": {
      "type": "yes_no",
      "instructions": "Did today's gap up fill?"
    }
  }
}
Response JSON (NFLX, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "gap": {
      "yes_no": 0.0537,
      "rule": "last_earnings_gap > 0",
      "basis": "rule"
    },
    "faded": {
      "yes_no": 0.4872,
      "rule": "O > C[-1] and C < C[-1]",
      "basis": "rule"
    },
    "near_res": {
      "yes_no": 0.0967,
      "rule": "C <= swinghigh(5) and C >= 0.97 * swinghigh(5)",
      "basis": "rule"
    },
    "above_sw": {
      "yes_no": 0.0771,
      "rule": "C > swinghigh(5)",
      "basis": "rule"
    },
    "fill": {
      "yes_no": 0.6813,
      "rule": "(O > C[-1] * 1) and (L <= C[-1])",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "NFLX",
    "as_of": "2026-10-30"
  }
}

last_earnings_gap offset swinghigh

Sell-side sales trader · example 4

Sector rotation color: XLK, XLF, XLE, XLV, XLU, XLP

Which sector funds lead over a quarter and which are breaking down, for the weekly client call.

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

State

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

Questions

quarterruleroc(C, 63) > 10 and C >= 0.95 * max(H, 63)
Up more than 10% in a quarter, near the high
three_mruleC > C[-63]
Higher than three months ago
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

Symbolquarterrulethree_mrulebreakdownrulebeat_spyforecast
XLK0.06240.61050.67060.498
XLF0.07850.35140.05550.448
XLE0.93360.94630.05370.55
XLV0.83220.94630.05370.534
XLU0.05490.26050.0540.445
XLP0.08120.93050.05370.498

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: Up more than 10% in a quarter, near the high: true for XLE, XLV of 6. Higher than three months ago: true for XLK, XLE, XLV, XLP of 6. Closed under the 20-day low: true for XLK of 6. Highest odds for “Beating SPY over a month”: XLE at 55%.

Leaders and laggards fall out of the same four questions; the forecast column is shown as odds next to the facts.

Request JSON (XLK; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLK"
  },
  "questions": {
    "quarter": {
      "type": "yes_no",
      "ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
    },
    "three_m": {
      "type": "yes_no",
      "ask": "C > C[-63]"
    },
    "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": {
    "quarter": {
      "yes_no": 0.0624,
      "rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
      "basis": "rule"
    },
    "three_m": {
      "yes_no": 0.6105,
      "rule": "C > C[-63]",
      "basis": "rule"
    },
    "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 max offset roc

Sell-side sales trader · example 5

JPM block interest: is liquidity there today?

Before pitching a block, check average dollar volume, today's volume versus the median and the day's range.

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

State

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

Questions

liquidruleavg(C * V, 20) > 100000000
Trades more than $100 million a day
dryruleV < 0.6 * avg(V, 20)
Volume under 60% of normal
medianruleV > median(V, 20)
Volume above its 20-day median
widerule(H - L) > 2 * avg(H - L, 20)
Range more than twice the 20-day average range
spikeforecastWill volume spike tomorrow?
A volume spike tomorrow

Answers

QuestionAnswerReading
liquid
Trades more than $100 million a day
0.9463true
dry
Volume under 60% of normal
0.0949false
median
Volume above its 20-day median
0.8074true
wide
Range more than twice the 20-day average range
0.2888false
spike
A volume spike tomorrow
0.022% · unlikely

What it means

For JPM on the session of 2026-10-30: True now: Trades more than $100 million a day; Volume above its 20-day median. Not true: Volume under 60% of normal; Range more than twice the 20-day average range. Forecasts: A volume spike tomorrow 2%.

Ample dollar volume and normal participation support working a block today; a dry-up day argues for patience.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JPM"
  },
  "questions": {
    "liquid": {
      "type": "yes_no",
      "ask": "avg(C * V, 20) > 100000000"
    },
    "dry": {
      "type": "yes_no",
      "ask": "V < 0.6 * avg(V, 20)"
    },
    "median": {
      "type": "yes_no",
      "ask": "V > median(V, 20)"
    },
    "wide": {
      "type": "yes_no",
      "ask": "(H - L) > 2 * avg(H - L, 20)"
    },
    "spike": {
      "type": "yes_no",
      "instructions": "Will volume spike tomorrow?"
    }
  }
}
Response JSON (JPM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "liquid": {
      "yes_no": 0.9463,
      "rule": "avg(C * V, 20) > 100000000",
      "basis": "rule"
    },
    "dry": {
      "yes_no": 0.0949,
      "rule": "V < 0.6 * avg(V, 20)",
      "basis": "rule"
    },
    "median": {
      "yes_no": 0.8074,
      "rule": "V > median(V, 20)",
      "basis": "rule"
    },
    "wide": {
      "yes_no": 0.2888,
      "rule": "(H - L) > 2 * avg(H - L, 20)",
      "basis": "rule"
    },
    "spike": {
      "yes_no": 0.02
    }
  },
  "context": {
    "symbol": "JPM",
    "as_of": "2026-10-30"
  }
}

avg median

Sell-side sales trader · example 6

AAPL reversal color: key reversal or engulfing at the lows

Give clients a crisp reversal story only when the candle evidence is there.

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

State

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

Questions

key_revruleL < lowest(L, 10) and C > C[-1]
New 10-day low, but closed up on the day
engulfruleengulfing_bull()
engulfing bull candle: A green body that engulfs yesterday's red body.
dragonflyruledragonfly_doji()
dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.
failed_bdruleL < lowest(L, 20) and C > lowest(L, 20)
Undercut the 20-day low and closed back above it
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
key_rev
New 10-day low, but closed up on the day
0.127false
engulf
engulfing bull candle: A green body that engulfs yesterday's red body.
0.2066false
dragonfly
dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.
0.1795false
failed_bd
Undercut the 20-day low and closed back above it
0.2556false
up_week
Higher in a week
0.5959% · close to even

Actions

Rules on the answers decide what to send.

key_rev >= 0.6 or engulf >= 0.6 or failed_bd >= 0.6→Slacksales-desk
else→Slacksales-desk
What each action would send 1 of 2 fired · dry run, nothing sent
reversalrule false: skipped
nonewould send (dry run)Slack → sales-desk
{
  "text": "AAPL (2026-10-30): no reversal candle today; do not pitch a bounce yet."
}

What it means

For AAPL on the session of 2026-10-30: Not true: New 10-day low, but closed up on the day; engulfing bull candle: A green body that engulfs yesterday's red body.; dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.; Undercut the 20-day low and closed back above it. Forecasts: Higher in a week 59%. Fired: none (Slack → sales-desk).

The desk pitches a bounce only when a rule is true; the else branch keeps everyone from overselling a quiet tape.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "key_rev": {
      "type": "yes_no",
      "ask": "L < lowest(L, 10) and C > C[-1]"
    },
    "engulf": {
      "type": "yes_no",
      "ask": "engulfing_bull()"
    },
    "dragonfly": {
      "type": "yes_no",
      "ask": "dragonfly_doji()"
    },
    "failed_bd": {
      "type": "yes_no",
      "ask": "L < lowest(L, 20) and C > lowest(L, 20)"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  },
  "actions": [
    {
      "id": "reversal",
      "when": "key_rev >= 0.6 or engulf >= 0.6 or failed_bd >= 0.6",
      "do": "slack",
      "connection": "sales-desk",
      "message": "{{symbol}} ({{as_of}}): reversal evidence at the lows (key reversal {{key_rev|pct}}, engulfing {{engulf|pct}}, failed breakdown {{failed_bd|pct}}). Higher in a week {{up_week|pct}}."
    },
    {
      "id": "none",
      "when": "else",
      "do": "slack",
      "connection": "sales-desk",
      "message": "{{symbol}} ({{as_of}}): no reversal candle today; do not pitch a bounce yet."
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "key_rev": {
      "yes_no": 0.127,
      "rule": "L < lowest(L, 10) and C > C[-1]",
      "basis": "rule"
    },
    "engulf": {
      "yes_no": 0.2066,
      "rule": "engulfing_bull()",
      "basis": "rule"
    },
    "dragonfly": {
      "yes_no": 0.1795,
      "rule": "dragonfly_doji()",
      "basis": "rule"
    },
    "failed_bd": {
      "yes_no": 0.2556,
      "rule": "L < lowest(L, 20) and C > lowest(L, 20)",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.59
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "reversal",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "none",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "sales-desk",
      "preview": {
        "text": "AAPL (2026-10-30): no reversal candle today; do not pitch a bounce yet."
      }
    }
  ]
}

dragonfly_doji engulfing_bull lowest offset

Sell-side sales trader · example 7

Semis client email: NVDA, AMD, MU, SMH breakout check

Send a semiconductor client list a short email per name breaking out on volume.

ora-fin-0.1.14 symbols, one request each4 questions1 action
  1. State4 symbols
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

boruleC > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)
20-day breakout on 1.5× volume
donchianruleC > highest(C, 55)
55-day closing breakout
near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

Symbolboruledonchianrulenear_highrulerally5forecastFired
NVDA0.05370.05370.05370.616none
AMD0.05370.05370.05370.836none
MU0.05430.06850.05370.855none
SMH0.05370.05670.05370.728none

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.

bo >= 0.6→Emailsemis-clients
NVDA 0 of 1 fired · dry run, nothing sent
AMD 0 of 1 fired · dry run, nothing sent
MU 0 of 1 fired · dry run, nothing sent
SMH 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 4 symbols: 20-day breakout on 1.5× volume: true for none of 4. 55-day closing breakout: true for none of 4. Within 2% of the 52-week high: true for none of 4. Highest odds for “A 5% rally within a month”: MU at 86%. client_email fired for none.

Only breakouts generate client mail; everything else stays off the client's inbox.

Request JSON (NVDA; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "bo": {
      "type": "yes_no",
      "ask": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "donchian": {
      "type": "yes_no",
      "ask": "C > highest(C, 55)"
    },
    "near_high": {
      "type": "yes_no",
      "ask": "C >= 0.98 * max(H, 252)"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "client_email",
      "when": "bo >= 0.6",
      "do": "email",
      "connection": "semis-clients",
      "subject": "{{symbol}} breaking out on volume ({{as_of}})",
      "message": "{{symbol}} closed at a 20-day high on 1.5x volume. 55-day breakout {{donchian|pct}}, near the 52-week high {{near_high|pct}}. 5% rally odds within a month: {{rally5|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "bo": {
      "yes_no": 0.0537,
      "rule": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "donchian": {
      "yes_no": 0.0537,
      "rule": "C > highest(C, 55)",
      "basis": "rule"
    },
    "near_high": {
      "yes_no": 0.0537,
      "rule": "C >= 0.98 * max(H, 252)",
      "basis": "rule"
    },
    "rally5": {
      "yes_no": 0.616
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "client_email",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg highest max ref

Sell-side sales trader · example 8

T and VZ: ex-dates and yield for income clients

Tell income-focused accounts which telecoms go ex soon and whether the payout is intact.

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

State

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

Questions

ex_soonruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
yield3rulediv_yield_ttm > 3
Yield above 3%
no_cutrulecut_last < 0.5
Did not cut its last dividend
trendrulediv_yield_ttm > 2 and C > sma(C, 200)
Yield above 2% and above the 200-day
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symbolex_soonruleyield3ruleno_cutruletrendruledrop5forecast
T0.05370.94630.85910.06740.463
VZ0.05370.94630.85910.34480.421

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: Goes ex-dividend within 30 days: true for none of 2. Yield above 3%: true for T, VZ of 2. Did not cut its last dividend: true for T, VZ of 2. Yield above 2% and above the 200-day: true for none of 2. Highest odds for “A 5% drawdown within a month”: T at 46%.

Ex-date and yield facts form the pitch; the drawdown odds are the risk line clients ask for.

Request JSON (T; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "T"
  },
  "questions": {
    "ex_soon": {
      "type": "yes_no",
      "ask": "days_to_ex_div <= 30"
    },
    "yield3": {
      "type": "yes_no",
      "ask": "div_yield_ttm > 3"
    },
    "no_cut": {
      "type": "yes_no",
      "ask": "cut_last < 0.5"
    },
    "trend": {
      "type": "yes_no",
      "ask": "div_yield_ttm > 2 and C > sma(C, 200)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (T, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "ex_soon": {
      "yes_no": 0.0537,
      "rule": "days_to_ex_div <= 30",
      "basis": "rule"
    },
    "yield3": {
      "yes_no": 0.9463,
      "rule": "div_yield_ttm > 3",
      "basis": "rule"
    },
    "no_cut": {
      "yes_no": 0.8591,
      "rule": "cut_last < 0.5",
      "basis": "rule"
    },
    "trend": {
      "yes_no": 0.0674,
      "rule": "div_yield_ttm > 2 and C > sma(C, 200)",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.463
    }
  },
  "context": {
    "symbol": "T",
    "as_of": "2026-10-30"
  }
}

cut_last days_to_ex_div div_yield_ttm sma

Sell-side sales trader · example 9

Oil color to Microsoft Teams: USO, XLE, XOP

Post a one-line oil color to the macro sales channel in Teams via an incoming webhook.

ora-fin-0.1.13 symbols, one request each5 questions1 action
  1. State3 symbols
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
hvrulestd(log(C / C[-1]), 20) * sqrt(252) > 0.4
Annualized 20-day volatility above 40%
gap_dnruleO < C[-1] * 0.99
Opened more than 1% below yesterday's close
rsi50rulersi(C, 14) > 50
RSI above 50
big5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

Symboltrendrulehvrulegap_dnrulersi50rulebig5forecastFired
USO0.94340.10750.12030.93680.403teams
XLE0.94320.05370.05870.93180.398teams
XOP0.92040.05370.07140.89990.347teams

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.

trend >= 0→Webhookteams-macro-sales
USO 1 of 1 fired · dry run, nothing sent
teamswould send (dry run)Webhook → teams-macro-sales
{
  "text": "USO (2026-10-30): above 50-day 94%, 20-day vol over 40% 11%, gapped down 1% 12%, RSI over 50 94%. Big move in 5 days: 40%."
}
XLE 1 of 1 fired · dry run, nothing sent
teamswould send (dry run)Webhook → teams-macro-sales
{
  "text": "XLE (2026-10-30): above 50-day 94%, 20-day vol over 40% 5%, gapped down 1% 6%, RSI over 50 93%. Big move in 5 days: 40%."
}
XOP 1 of 1 fired · dry run, nothing sent
teamswould send (dry run)Webhook → teams-macro-sales
{
  "text": "XOP (2026-10-30): above 50-day 92%, 20-day vol over 40% 5%, gapped down 1% 7%, RSI over 50 90%. Big move in 5 days: 35%."
}

What it means

Session of 2026-10-30, 3 symbols: Above the 50-day average: true for USO, XLE, XOP of 3. Annualized 20-day volatility above 40%: true for none of 3. Opened more than 1% below yesterday's close: true for none of 3. RSI above 50: true for USO, XLE, XOP of 3. Highest odds for “A big move either way in 5 days”: USO at 40%. teams fired for USO, XLE, XOP.

Teams expects a text field, so the body is just the color line; every symbol posts.

Request JSON (USO; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "USO"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "hv": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
    },
    "gap_dn": {
      "type": "yes_no",
      "ask": "O < C[-1] * 0.99"
    },
    "rsi50": {
      "type": "yes_no",
      "ask": "rsi(C, 14) > 50"
    },
    "big5": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "teams",
      "when": "trend >= 0",
      "do": "webhook",
      "connection": "teams-macro-sales",
      "body": {
        "text": "{{symbol}} ({{as_of}}): above 50-day {{trend|pct}}, 20-day vol over 40% {{hv|pct}}, gapped down 1% {{gap_dn|pct}}, RSI over 50 {{rsi50|pct}}. Big move in 5 days: {{big5|pct}}."
      }
    }
  ],
  "dry_run": true
}
Response JSON (USO, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.9434,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "hv": {
      "yes_no": 0.1075,
      "rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
      "basis": "rule"
    },
    "gap_dn": {
      "yes_no": 0.1203,
      "rule": "O < C[-1] * 0.99",
      "basis": "rule"
    },
    "rsi50": {
      "yes_no": 0.9368,
      "rule": "rsi(C, 14) > 50",
      "basis": "rule"
    },
    "big5": {
      "yes_no": 0.403
    }
  },
  "context": {
    "symbol": "USO",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "teams",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "teams-macro-sales",
      "preview": {
        "body": {
          "text": "USO (2026-10-30): above 50-day 94%, 20-day vol over 40% 11%, gapped down 1% 12%, RSI over 50 94%. Big move in 5 days: 40%."
        }
      }
    }
  ]
}

log offset rsi sma sqrt std

Sell-side sales trader · example 10

BA: selling pressure color from volume and closes

Without short-interest data, describe selling pressure from the tape: down days on volume, OBV and lower closes.

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

State

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

Questions

down_volruleC < C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Down on heavy volume
obv_downruleobv() < ref(obv(), -20)
On-balance volume lower than 20 sessions ago
lower3English → ruleHas the stock closed lower 3 days in a row?
sign_downrulesum(sign(C - C[-1]), 10) < -2
More down closes than up closes, by over two, in ten sessions
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
down_vol
Down on heavy volume
0.1406false
obv_down
On-balance volume lower than 20 sessions ago
0.9463true
lower3
Has the stock closed lower 3 days in a row
compiled to (C < C[-1]) and (C[-1] < C[-2]) and (C[-2] < C[-3])
0.107false
sign_down
More down closes than up closes, by over two, in ten sessions
0.45on the line (false)
drop5
A 5% drawdown within a month
0.42643% · close to even

What it means

For BA on the session of 2026-10-30: True now: On-balance volume lower than 20 sessions ago. Not true: Down on heavy volume; Has the stock closed lower 3 days in a row. On the line: More down closes than up closes, by over two, in ten sessions. Forecasts: A 5% drawdown within a month 43%.

Several pressure rules true is a fair description of persistent selling; the color never claims to know positioning.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "BA"
  },
  "questions": {
    "down_vol": {
      "type": "yes_no",
      "ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "obv_down": {
      "type": "yes_no",
      "ask": "obv() < ref(obv(), -20)"
    },
    "lower3": {
      "type": "yes_no",
      "instructions": "Has the stock closed lower 3 days in a row?"
    },
    "sign_down": {
      "type": "yes_no",
      "ask": "sum(sign(C - C[-1]), 10) < -2"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (BA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "down_vol": {
      "yes_no": 0.1406,
      "rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "obv_down": {
      "yes_no": 0.9463,
      "rule": "obv() < ref(obv(), -20)",
      "basis": "rule"
    },
    "lower3": {
      "yes_no": 0.107,
      "rule": "(C < C[-1]) and (C[-1] < C[-2]) and (C[-2] < C[-3])",
      "basis": "pattern"
    },
    "sign_down": {
      "yes_no": 0.45,
      "rule": "sum(sign(C - C[-1]), 10) < -2",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.426
    }
  },
  "context": {
    "symbol": "BA",
    "as_of": "2026-10-30"
  }
}

avg obv offset ref sign sum

Information, not investment advice. Rules answer from the latest completed daily session; forecasts are probabilities. Actions ran as dry runs: nothing was sent. More in Sell side: Equity research analyst, Execution trader / desk, Market maker, Prop trading firm, Compliance officer.

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