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

Broker app: 20 ways to use Ora

Pre-trade warnings, event badges and smart alerts for millions of self-directed accounts. Each example is a complete, runnable request with the real answers it returned (37 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 (36)

offset 8sma 7atr 5log 3sqrt 3std 3max 3ref 3days_to_earnings 2avg 2highest 2lowest 2days_since_split 2days_to_ex_div 2days_to_split 2rsi 2abs 1last_earnings_move 1next_report_amc 1atr_pct 1tr 1gap_down 1gap_up 1div_yield_ttm 1raised_last 1years_of_growth 1days_since_reverse_split 1reverse_split_last 1adx 1ema 1bbupper 1macd 1hanging_man 1shooting_star 1three_black_crows 1inside_bar 1

Examples 1–10 of 20 · page 1 of 2

Broker app · example 1

Pre-trade warning: 'NVDA reports soon' on the buy ticket

Show a warning on the order ticket when a customer buys a stock that reports within a few days and moves a lot on reports.

ora-fin-0.1.1NVDA4 questions1 action
  1. StateNVDA
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

soonruledays_to_earnings <= 10
Reports earnings within 10 days
bigruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%
amcEnglish → ruleDoes the stock report after the close next time?
move5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

QuestionAnswerReading
soon
Reports earnings within 10 days
0.0563false
big
Last earnings move bigger than 5%
0.9463true
amc
Does the stock report after the close next time
compiled to next_report_amc > 0.5
0.8591true
move5
A big move either way in 5 days
0.31832% · unlikely

Actions

Rules on the answers decide what to send.

soon >= 0.6→Webhookticket-banners
What each action would send 0 of 1 fired · dry run, nothing sent
ticket_warningrule false: skipped

What it means

For NVDA on the session of 2026-10-30: True now: Last earnings move bigger than 5%; Does the stock report after the close next time. Not true: Reports earnings within 10 days. Forecasts: A big move either way in 5 days 32%. No action fired: every rule was false.

The ticket shows an informational banner; it never blocks the order, and the wording comes from the fact rules, not the forecast.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "soon": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10"
    },
    "big": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    },
    "amc": {
      "type": "yes_no",
      "instructions": "Does the stock report after the close next time?"
    },
    "move5": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "ticket_warning",
      "when": "soon >= 0.6",
      "do": "webhook",
      "connection": "ticket-banners",
      "body": {
        "symbol": "{{symbol}}",
        "banner": "earnings_soon",
        "large_past_reaction": "{{big}}",
        "reports_after_close": "{{amc}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "soon": {
      "yes_no": 0.0563,
      "rule": "days_to_earnings <= 10",
      "basis": "rule"
    },
    "big": {
      "yes_no": 0.9463,
      "rule": "abs(last_earnings_move) > 5",
      "basis": "rule"
    },
    "amc": {
      "yes_no": 0.8591,
      "rule": "next_report_amc > 0.5",
      "basis": "pattern"
    },
    "move5": {
      "yes_no": 0.318
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "ticket_warning",
      "fired": false,
      "status": "skipped"
    }
  ]
}

abs days_to_earnings last_earnings_move next_report_amc

Broker app · example 2

Require an acknowledgement before buying a leveraged ETF in a volatile week (SQQQ)

Ask customers to confirm they understand daily-reset risk when a leveraged fund is in a high-volatility regime.

ora-fin-0.1.1SQQQ4 questions1 action
  1. StateSQQQ
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

atrEnglish → ruleIs the 14-day ATR more than 3% of the price?
hvEnglish → ruleIs 20-day historical volatility above 40%?
wideEnglish → ruleWas today's range more than 1.5 ATR?
vol_riseforecastWill volatility rise over the next 5 days?
Volatility rising over 5 days

Answers

QuestionAnswerReading
atr
Is the 14-day ATR more than 3% of the price
compiled to atr(14) / C > 0.03
0.934true
hv
Is 20-day historical volatility above 40%
compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4
0.9339true
wide
Was today's range more than 1.5 ATR
compiled to (H - L) > 1.5 * atr(14)
0.1926false
vol_rise
Volatility rising over 5 days
0.23223% · unlikely

Actions

Rules on the answers decide what to send.

atr >= 0.6 or hv >= 0.6→Webhookticket-banners
What each action would send 1 of 1 fired · dry run, nothing sent
ackwould send (dry run)Webhook → ticket-banners
{
  "symbol": "SQQQ",
  "banner": "leveraged_volatility_ack",
  "require_ack": true,
  "p_atr_over_3": 0.934,
  "p_hv_over_40": 0.9339,
  "as_of": "2026-10-30"
}

What it means

For SQQQ on the session of 2026-10-30: True now: Is the 14-day ATR more than 3% of the price; Is 20-day historical volatility above 40%. Not true: Was today's range more than 1.5 ATR. Forecasts: Volatility rising over 5 days 23%. Fired: ack (Webhook → ticket-banners).

The acknowledgement depends on exact volatility rules; it is the same for every customer on that day, which keeps it fair and auditable.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SQQQ"
  },
  "questions": {
    "atr": {
      "type": "yes_no",
      "instructions": "Is the 14-day ATR more than 3% of the price?"
    },
    "hv": {
      "type": "yes_no",
      "instructions": "Is 20-day historical volatility above 40%?"
    },
    "wide": {
      "type": "yes_no",
      "instructions": "Was today's range more than 1.5 ATR?"
    },
    "vol_rise": {
      "type": "yes_no",
      "instructions": "Will volatility rise over the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "ack",
      "when": "atr >= 0.6 or hv >= 0.6",
      "do": "webhook",
      "connection": "ticket-banners",
      "body": {
        "symbol": "{{symbol}}",
        "banner": "leveraged_volatility_ack",
        "require_ack": true,
        "p_atr_over_3": "{{atr}}",
        "p_hv_over_40": "{{hv}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (SQQQ, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "atr": {
      "yes_no": 0.934,
      "rule": "atr(14) / C > 0.03",
      "basis": "pattern"
    },
    "hv": {
      "yes_no": 0.9339,
      "rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4",
      "basis": "pattern"
    },
    "wide": {
      "yes_no": 0.1926,
      "rule": "(H - L) > 1.5 * atr(14)",
      "basis": "pattern"
    },
    "vol_rise": {
      "yes_no": 0.232
    }
  },
  "context": {
    "symbol": "SQQQ",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "ack",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "ticket-banners",
      "preview": {
        "body": {
          "symbol": "SQQQ",
          "banner": "leveraged_volatility_ack",
          "require_ack": true,
          "p_atr_over_3": 0.934,
          "p_hv_over_40": 0.9339,
          "as_of": "2026-10-30"
        }
      }
    }
  ]
}

atr log offset sqrt std

Broker app · example 3

Smart price alerts: 'MSFT made a new 52-week high'

Replace fixed price alerts with event alerts customers understand: new highs, new lows and breakouts.

ora-fin-0.1.1MSFT4 questions2 actions
  1. StateMSFT
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

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

Questions

highEnglish → ruleDid the stock make a new 52-week high today?
lowEnglish → ruleDid the stock make a new 20-day low today?
breakoutruleC > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)
20-day breakout on 1.5× volume
nearruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high

Answers

QuestionAnswerReading
high
Did the stock make a new 52-week high today
compiled to H > highest(H, 252)
0.0968false
low
Did the stock make a new 20-day low today
compiled to L < lowest(L, 20)
0.487on the line (false)
breakout
20-day breakout on 1.5× volume
0.0604false
near
Within 2% of the 52-week high
0.1327false

Actions

Rules on the answers decide what to send.

high >= 0.6→Webhookpush-gateway
low >= 0.6→Webhookpush-gateway
What each action would send 0 of 2 fired · dry run, nothing sent
high_pushrule false: skipped
low_pushrule false: skipped

What it means

For MSFT on the session of 2026-10-30: Not true: Did the stock make a new 52-week high today; 20-day breakout on 1.5× volume; Within 2% of the 52-week high. On the line: Did the stock make a new 20-day low today. No action fired: every rule was false.

Each event is a separate branch, so a customer subscribed to highs never gets a low alert by accident.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MSFT"
  },
  "questions": {
    "high": {
      "type": "yes_no",
      "instructions": "Did the stock make a new 52-week high today?"
    },
    "low": {
      "type": "yes_no",
      "instructions": "Did the stock make a new 20-day low today?"
    },
    "breakout": {
      "type": "yes_no",
      "ask": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "near": {
      "type": "yes_no",
      "ask": "C >= 0.98 * max(H, 252)"
    }
  },
  "actions": [
    {
      "id": "high_push",
      "when": "high >= 0.6",
      "do": "webhook",
      "connection": "push-gateway",
      "body": {
        "topic": "alerts_{{symbol}}",
        "event": "new_52w_high",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}"
      }
    },
    {
      "id": "low_push",
      "when": "low >= 0.6",
      "do": "webhook",
      "connection": "push-gateway",
      "body": {
        "topic": "alerts_{{symbol}}",
        "event": "new_20d_low",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (MSFT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "high": {
      "yes_no": 0.0968,
      "rule": "H > highest(H, 252)",
      "basis": "pattern"
    },
    "low": {
      "yes_no": 0.487,
      "rule": "L < lowest(L, 20)",
      "basis": "pattern"
    },
    "breakout": {
      "yes_no": 0.0604,
      "rule": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "near": {
      "yes_no": 0.1327,
      "rule": "C >= 0.98 * max(H, 252)",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "MSFT",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "high_push",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "low_push",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg highest lowest max ref

Broker app · example 4

Event badges on positions: earnings, ex-dividend and splits

Put small badges next to each position in the portfolio view for upcoming earnings, ex-dividend dates and recent splits.

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

State

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

Questions

earnEnglish → ruleIs earnings in the next 14 days?
exruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
splitruledays_since_split <= 1095
Split in the last three years
announcedruledays_to_split <= 365
A split is announced

Answers

Symbolearnruleexrulesplitruleannouncedrule
AAPL0.94630.05370.05370.0537
JNJ0.05370.91870.05370.0537
NVDA0.10330.05370.94630.0537
WMT0.06830.05370.94630.0537
KO0.500.20490.05370.0537
JPM0.05370.05370.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, 6 symbols: Is earnings in the next 14 days: true for AAPL of 6. Goes ex-dividend within 30 days: true for JNJ of 6. Split in the last three years: true for NVDA, WMT of 6. A split is announced: true for none of 6.

Badges come only from fact rules; an ETF or a stock with no scheduled report shows no earnings badge rather than a guess.

Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "earn": {
      "type": "yes_no",
      "instructions": "Is earnings in the next 14 days?"
    },
    "ex": {
      "type": "yes_no",
      "ask": "days_to_ex_div <= 30"
    },
    "split": {
      "type": "yes_no",
      "ask": "days_since_split <= 1095"
    },
    "announced": {
      "type": "yes_no",
      "ask": "days_to_split <= 365"
    }
  }
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "earn": {
      "yes_no": 0.9463,
      "rule": "days_to_earnings <= 14",
      "basis": "pattern"
    },
    "ex": {
      "yes_no": 0.0537,
      "rule": "days_to_ex_div <= 30",
      "basis": "rule"
    },
    "split": {
      "yes_no": 0.0537,
      "rule": "days_since_split <= 1095",
      "basis": "rule"
    },
    "announced": {
      "yes_no": 0.0537,
      "rule": "days_to_split <= 365",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  }
}

days_since_split days_to_earnings days_to_ex_div days_to_split

Broker app · example 5

Options-level education prompt when the underlying (TSLA) is wild

Show a short explainer about implied moves when customers open an option chain on a stock in a wide-range regime.

ora-fin-0.1.1TSLA4 questions
  1. StateTSLA
  2. Questions4 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

atrruleatr_pct(14) > 3
A typical day moves more than 3%
trruletr() > 1.5 * ref(atr(14), -1)
True range 1.5× yesterday's ATR
move2forecastWill the stock move more than 2% in either direction in 5 trading days?
A 2%+ move either way in 5 days
bigforecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

QuestionAnswerReading
atr
A typical day moves more than 3%
0.848true
tr
True range 1.5× yesterday's ATR
0.2396false
move2
A 2%+ move either way in 5 days
0.24825% · unlikely
big
A big move either way in 5 days
0.24825% · unlikely

What it means

For TSLA on the session of 2026-10-30: True now: A typical day moves more than 3%. Not true: True range 1.5× yesterday's ATR. Forecasts: A 2%+ move either way in 5 days 25%; A big move either way in 5 days 25%.

The explainer appears on wide-range days; the forecasts are shown as odds with a plain caveat that they are not guarantees.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "TSLA"
  },
  "questions": {
    "atr": {
      "type": "yes_no",
      "ask": "atr_pct(14) > 3"
    },
    "tr": {
      "type": "yes_no",
      "ask": "tr() > 1.5 * ref(atr(14), -1)"
    },
    "move2": {
      "type": "yes_no",
      "instructions": "Will the stock move more than 2% in either direction in 5 trading days?"
    },
    "big": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  }
}
Response JSON (TSLA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "atr": {
      "yes_no": 0.848,
      "rule": "atr_pct(14) > 3",
      "basis": "rule"
    },
    "tr": {
      "yes_no": 0.2396,
      "rule": "tr() > 1.5 * ref(atr(14), -1)",
      "basis": "rule"
    },
    "move2": {
      "yes_no": 0.248
    },
    "big": {
      "yes_no": 0.248
    }
  },
  "context": {
    "symbol": "TSLA",
    "as_of": "2026-10-30"
  }
}

atr atr_pct ref tr

Broker app · example 6

Margin early warning for concentrated accounts in ARKK

Warn margin customers concentrated in a volatile fund before a further drop could trigger a call.

ora-fin-0.1.1ARKK4 questions1 action
  1. StateARKK
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

downEnglish → ruleDid the stock fall more than 3% today?
breakdownruleC < lowest(L, 20)
Closed under the 20-day low
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month
hvrulestd(log(C / C[-1]), 20) * sqrt(252) > 0.4
Annualized 20-day volatility above 40%

Answers

QuestionAnswerReading
down
Did the stock fall more than 3% today
compiled to C / C[-1] - 1 < -0.03
0.8912true
breakdown
Closed under the 20-day low
0.4919on the line (false)
drop10
A 10% drawdown within a month
0.6161% · likely
hv
Annualized 20-day volatility above 40%
0.7844true

Actions

Rules on the answers decide what to send.

drop10 >= 0.4 and (down >= 0.6 or breakdown >= 0.6)→Emailmargin-desk
What each action would send 1 of 1 fired · dry run, nothing sent
margin_emailwould send (dry run)Email → margin-desk
{
  "subject": "Margin early warning: ARKK",
  "text": "ARKK (2026-10-30) fell sharply (89%) or broke its 20-day low (49%); odds of a further 10% drop within a month are 61%. Contact concentrated margin accounts."
}

What it means

For ARKK on the session of 2026-10-30: True now: Did the stock fall more than 3% today; Annualized 20-day volatility above 40%. On the line: Closed under the 20-day low. Forecasts: A 10% drawdown within a month 61%. Fired: margin_email (Email → margin-desk).

The margin desk gets a heads-up list, not an automatic liquidation; the actual call still follows the house margin rules.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "ARKK"
  },
  "questions": {
    "down": {
      "type": "yes_no",
      "instructions": "Did the stock fall more than 3% today?"
    },
    "breakdown": {
      "type": "yes_no",
      "ask": "C < lowest(L, 20)"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    },
    "hv": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
    }
  },
  "actions": [
    {
      "id": "margin_email",
      "when": "drop10 >= 0.4 and (down >= 0.6 or breakdown >= 0.6)",
      "do": "email",
      "connection": "margin-desk",
      "subject": "Margin early warning: {{symbol}}",
      "message": "{{symbol}} ({{as_of}}) fell sharply ({{down|pct}}) or broke its 20-day low ({{breakdown|pct}}); odds of a further 10% drop within a month are {{drop10|pct}}. Contact concentrated margin accounts."
    }
  ],
  "dry_run": true
}
Response JSON (ARKK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "down": {
      "yes_no": 0.8912,
      "rule": "C / C[-1] - 1 < -0.03",
      "basis": "pattern"
    },
    "breakdown": {
      "yes_no": 0.4919,
      "rule": "C < lowest(L, 20)",
      "basis": "rule"
    },
    "drop10": {
      "yes_no": 0.61
    },
    "hv": {
      "yes_no": 0.7844,
      "rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "ARKK",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "margin_email",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "margin-desk",
      "preview": {
        "subject": "Margin early warning: ARKK",
        "text": "ARKK (2026-10-30) fell sharply (89%) or broke its 20-day low (49%); odds of a further 10% drop within a month are 61%. Contact concentrated margin accounts."
      }
    }
  ]
}

log lowest offset sqrt std

Broker app · example 7

Opening-gap banner on the quote page (AMD)

Explain on the quote page that the stock gapped at the open and whether the gap filled during the session.

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

State

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

Questions

gap_uprulegap_up()
gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.
gap_downrulegap_down()
gap down candle: Today's whole range is below yesterday's low.
fadedruleO > C[-1] and C < C[-1]
Gapped up but closed under yesterday's close
filledEnglish → ruleDid today's gap up fill?
heldrule(O > C[-1]) and (L > C[-1])
gapped up and never traded back to yesterday's close

Answers

QuestionAnswerReading
gap_up
gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.
0.0537false
gap_down
gap down candle: Today's whole range is below yesterday's low.
0.9363true
faded
Gapped up but closed under yesterday's close
0.0537false
filled
Did today's gap up fill
compiled to (O > C[-1] * 1) and (L <= C[-1])
0.0537false
held
gapped up and never traded back to yesterday's close
0.0537false

What it means

For AMD on the session of 2026-10-30: True now: gap down candle: Today's whole range is below yesterday's low.. Not true: gap up candle: Today's whole range is above yesterday's high: an unfilled gap up.; Gapped up but closed under yesterday's close; Did today's gap up fill; gapped up and never traded back to yesterday's close.

Gap facts describe the last completed session; the banner says yesterday's session so customers do not read it as live.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AMD"
  },
  "questions": {
    "gap_up": {
      "type": "yes_no",
      "ask": "gap_up()"
    },
    "gap_down": {
      "type": "yes_no",
      "ask": "gap_down()"
    },
    "faded": {
      "type": "yes_no",
      "ask": "O > C[-1] and C < C[-1]"
    },
    "filled": {
      "type": "yes_no",
      "instructions": "Did today's gap up fill?"
    },
    "held": {
      "type": "yes_no",
      "ask": "(O > C[-1]) and (L > C[-1])"
    }
  }
}
Response JSON (AMD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "gap_up": {
      "yes_no": 0.0537,
      "rule": "gap_up()",
      "basis": "rule"
    },
    "gap_down": {
      "yes_no": 0.9363,
      "rule": "gap_down()",
      "basis": "rule"
    },
    "faded": {
      "yes_no": 0.0537,
      "rule": "O > C[-1] and C < C[-1]",
      "basis": "rule"
    },
    "filled": {
      "yes_no": 0.0537,
      "rule": "(O > C[-1] * 1) and (L <= C[-1])",
      "basis": "pattern"
    },
    "held": {
      "yes_no": 0.0537,
      "rule": "(O > C[-1]) and (L > C[-1])",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AMD",
    "as_of": "2026-10-30"
  }
}

gap_down gap_up offset

Broker app · example 8

Morning watchlist push for the most-held names

Each weekday morning, push one line per watchlist name with yesterday's move and today's odds.

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

State

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

Questions

upEnglish → ruleDid the stock close higher than yesterday?
up2English → ruleDid the stock rise more than 2% today?
down3English → ruleDid the stock fall more than 3% today?
up_todayforecastWill the stock be up tomorrow?
Up tomorrow

Answers

Symbolupruleup2ruledown3ruleup_todayforecastFired
AAPL0.1270.05590.09160.556line
TSLA0.29490.12410.16740.482line
AMZN0.18520.07110.15820.476line
NVDA0.07320.05520.76270.485line

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.

up >= 0→Webhookpush-gateway
AAPL 1 of 1 fired · dry run, nothing sent
linewould send (dry run)Webhook → push-gateway
{
  "topic": "watchlist_AAPL",
  "symbol": "AAPL",
  "closed_up": 0.127,
  "up_over_2": 0.0559,
  "down_over_3": 0.0916,
  "p_up_today": 0.556,
  "as_of": "2026-10-30"
}
TSLA 1 of 1 fired · dry run, nothing sent
linewould send (dry run)Webhook → push-gateway
{
  "topic": "watchlist_TSLA",
  "symbol": "TSLA",
  "closed_up": 0.2949,
  "up_over_2": 0.1241,
  "down_over_3": 0.1674,
  "p_up_today": 0.482,
  "as_of": "2026-10-30"
}
AMZN 1 of 1 fired · dry run, nothing sent
linewould send (dry run)Webhook → push-gateway
{
  "topic": "watchlist_AMZN",
  "symbol": "AMZN",
  "closed_up": 0.1852,
  "up_over_2": 0.0711,
  "down_over_3": 0.1582,
  "p_up_today": 0.476,
  "as_of": "2026-10-30"
}
NVDA 1 of 1 fired · dry run, nothing sent
linewould send (dry run)Webhook → push-gateway
{
  "topic": "watchlist_NVDA",
  "symbol": "NVDA",
  "closed_up": 0.0732,
  "up_over_2": 0.0552,
  "down_over_3": 0.7627,
  "p_up_today": 0.485,
  "as_of": "2026-10-30"
}

What it means

Session of 2026-10-30, 4 symbols: Did the stock close higher than yesterday: true for none of 4. Did the stock rise more than 2% today: true for none of 4. Did the stock fall more than 3% today: true for NVDA of 4. Highest odds for “Up tomorrow”: AAPL at 56%. line fired for AAPL, TSLA, AMZN, NVDA.

The push carries facts about yesterday and one forecast for today, each labeled, so the app can format them consistently.

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 watchlist push for the most-held names",
  "symbols": "AAPL TSLA AMZN NVDA",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "08:15",
  "model": "ora-fin-0.1.1",
  "questions": {
    "up": {
      "type": "yes_no",
      "instructions": "Did the stock close higher than yesterday?"
    },
    "up2": {
      "type": "yes_no",
      "instructions": "Did the stock rise more than 2% today?"
    },
    "down3": {
      "type": "yes_no",
      "instructions": "Did the stock fall more than 3% today?"
    },
    "up_today": {
      "type": "yes_no",
      "instructions": "Will the stock be up tomorrow?"
    }
  },
  "actions": [
    {
      "id": "line",
      "when": "up >= 0",
      "do": "webhook",
      "connection": "push-gateway",
      "body": {
        "topic": "watchlist_{{symbol}}",
        "symbol": "{{symbol}}",
        "closed_up": "{{up}}",
        "up_over_2": "{{up2}}",
        "down_over_3": "{{down3}}",
        "p_up_today": "{{up_today}}",
        "as_of": "{{as_of}}"
      }
    }
  ]
}
Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "up": {
      "type": "yes_no",
      "instructions": "Did the stock close higher than yesterday?"
    },
    "up2": {
      "type": "yes_no",
      "instructions": "Did the stock rise more than 2% today?"
    },
    "down3": {
      "type": "yes_no",
      "instructions": "Did the stock fall more than 3% today?"
    },
    "up_today": {
      "type": "yes_no",
      "instructions": "Will the stock be up tomorrow?"
    }
  },
  "actions": [
    {
      "id": "line",
      "when": "up >= 0",
      "do": "webhook",
      "connection": "push-gateway",
      "body": {
        "topic": "watchlist_{{symbol}}",
        "symbol": "{{symbol}}",
        "closed_up": "{{up}}",
        "up_over_2": "{{up2}}",
        "down_over_3": "{{down3}}",
        "p_up_today": "{{up_today}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "up": {
      "yes_no": 0.127,
      "rule": "C > C[-1]",
      "basis": "comparison"
    },
    "up2": {
      "yes_no": 0.0559,
      "rule": "C / C[-1] - 1 > 0.02",
      "basis": "pattern"
    },
    "down3": {
      "yes_no": 0.0916,
      "rule": "C / C[-1] - 1 < -0.03",
      "basis": "pattern"
    },
    "up_today": {
      "yes_no": 0.556
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "line",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "push-gateway",
      "preview": {
        "body": {
          "topic": "watchlist_AAPL",
          "symbol": "AAPL",
          "closed_up": 0.127,
          "up_over_2": 0.0559,
          "down_over_3": 0.0916,
          "p_up_today": 0.556,
          "as_of": "2026-10-30"
        }
      }
    }
  ]
}

offset

Broker app · example 9

Prompt to turn on dividend reinvestment for JNJ holders

When a holding goes ex-dividend soon, prompt holders without reinvestment switched on.

ora-fin-0.1.1JNJ4 questions1 action
  1. StateJNJ
  2. Questions4 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

exruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
growerEnglish → ruleHas the stock grown its dividend for 25 years in a row?
raisedruleraised_last > 0.5
Raised its last dividend
yieldEnglish → ruleIs the dividend yield above 3%?

Answers

QuestionAnswerReading
ex
Goes ex-dividend within 30 days
0.9187true
grower
Has the stock grown its dividend for 25 years in a row
compiled to years_of_growth >= 25
0.9463true
raised
Raised its last dividend
0.1409false
yield
Is the dividend yield above 3%
compiled to div_yield_ttm > 3
0.0648false

Actions

Rules on the answers decide what to send.

ex >= 0.6→Webhookin-app-messages
What each action would send 1 of 1 fired · dry run, nothing sent
drip_promptwould send (dry run)Webhook → in-app-messages
{
  "segment": "holders_no_drip_JNJ",
  "template": "drip_prompt",
  "symbol": "JNJ",
  "long_grower": 0.9463,
  "as_of": "2026-10-30"
}

What it means

For JNJ on the session of 2026-10-30: True now: Goes ex-dividend within 30 days; Has the stock grown its dividend for 25 years in a row. Not true: Raised its last dividend; Is the dividend yield above 3%. Fired: drip_prompt (Webhook → in-app-messages).

The prompt runs only on a declared ex-date; the long growth record is shown as context, never as a promise of future raises.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JNJ"
  },
  "questions": {
    "ex": {
      "type": "yes_no",
      "ask": "days_to_ex_div <= 30"
    },
    "grower": {
      "type": "yes_no",
      "instructions": "Has the stock grown its dividend for 25 years in a row?"
    },
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "yield": {
      "type": "yes_no",
      "instructions": "Is the dividend yield above 3%?"
    }
  },
  "actions": [
    {
      "id": "drip_prompt",
      "when": "ex >= 0.6",
      "do": "webhook",
      "connection": "in-app-messages",
      "body": {
        "segment": "holders_no_drip_{{symbol}}",
        "template": "drip_prompt",
        "symbol": "{{symbol}}",
        "long_grower": "{{grower}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (JNJ, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "ex": {
      "yes_no": 0.9187,
      "rule": "days_to_ex_div <= 30",
      "basis": "rule"
    },
    "grower": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 25",
      "basis": "pattern"
    },
    "raised": {
      "yes_no": 0.1409,
      "rule": "raised_last > 0.5",
      "basis": "rule"
    },
    "yield": {
      "yes_no": 0.0648,
      "rule": "div_yield_ttm > 3",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "JNJ",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "drip_prompt",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "in-app-messages",
      "preview": {
        "body": {
          "segment": "holders_no_drip_JNJ",
          "template": "drip_prompt",
          "symbol": "JNJ",
          "long_grower": 0.9463,
          "as_of": "2026-10-30"
        }
      }
    }
  ]
}

days_to_ex_div div_yield_ttm raised_last years_of_growth

Broker app · example 10

Corporate-action notice: reverse split check on a small-cap (MARA)

Show a corporate-action notice on positions that recently did a reverse split, so share counts do not confuse customers.

ora-fin-0.1.1MARA4 questions
  1. StateMARA
  2. Questions4 asked
  3. Answersreal, captured
  4. Actionsnone

State

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

Questions

revEnglish → ruleWas the last split a reverse split?
rev1yEnglish → ruleHas the stock done a reverse split in the past year?
split3yruledays_since_split <= 1095
Split in the last three years
comingEnglish → ruleIs a stock split coming up?

Answers

QuestionAnswerReading
rev
Was the last split a reverse split
compiled to reverse_split_last > 0.5
0.8591true
rev1y
Has the stock done a reverse split in the past year
compiled to days_since_reverse_split <= 365
0.0537false
split3y
Split in the last three years
0.0537false
coming
Is a stock split coming up
compiled to days_to_split <= 365
0.0537false

What it means

For MARA on the session of 2026-10-30: True now: Was the last split a reverse split. Not true: Has the stock done a reverse split in the past year; Split in the last three years; Is a stock split coming up.

Split facts are exact and only count real share splits; a stock that never split simply shows no notice.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MARA"
  },
  "questions": {
    "rev": {
      "type": "yes_no",
      "instructions": "Was the last split a reverse split?"
    },
    "rev1y": {
      "type": "yes_no",
      "instructions": "Has the stock done a reverse split in the past year?"
    },
    "split3y": {
      "type": "yes_no",
      "ask": "days_since_split <= 1095"
    },
    "coming": {
      "type": "yes_no",
      "instructions": "Is a stock split coming up?"
    }
  }
}
Response JSON (MARA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "rev": {
      "yes_no": 0.8591,
      "rule": "reverse_split_last > 0.5",
      "basis": "pattern"
    },
    "rev1y": {
      "yes_no": 0.0537,
      "rule": "days_since_reverse_split <= 365",
      "basis": "pattern"
    },
    "split3y": {
      "yes_no": 0.0537,
      "rule": "days_since_split <= 1095",
      "basis": "rule"
    },
    "coming": {
      "yes_no": 0.0537,
      "rule": "days_to_split <= 365",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "MARA",
    "as_of": "2026-10-30"
  }
}

days_since_reverse_split days_since_split days_to_split reverse_split_last

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 Builders: Quant developer, Fintech app builder, Robo-advisor, Algo / bot developer, Data vendor / platform, Trading educator / newsletter.

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