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

Broker app · example 11

Trend chip on every quote page: up, down or sideways (DIS)

Show a single trend chip using moving averages and ADX, computed the same way for every stock.

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

State

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

Questions

upruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
downruleC < ema(C, 20) and ema(C, 20) < sma(C, 50) and sma(C, 50) < sma(C, 200)
averages stacked downward: price under the 20-day EMA, under the 50-day, under the 200-day
trendingruleadx(14) > 25
Trending (ADX above 25)
risingrulesma(C, 50) > ref(sma(C, 50), -10)
The 50-day average is rising

Answers

QuestionAnswerReading
up
Stacked averages: close > 20 EMA > 50 > 200
0.7817true
down
averages stacked downward: price under the 20-day EMA, under the 50-day, under the 200-day
0.0914false
trending
Trending (ADX above 25)
0.7349true
rising
The 50-day average is rising
0.9309true

What it means

For DIS on the session of 2026-10-30: True now: Stacked averages: close > 20 EMA > 50 > 200; Trending (ADX above 25); The 50-day average is rising. Not true: averages stacked downward: price under the 20-day EMA, under the 50-day, under the 200-day.

The chip is up when the up stack is true, down when the down stack is true, and sideways otherwise; ADX adds 'strong' when it is true.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "DIS"
  },
  "questions": {
    "up": {
      "type": "yes_no",
      "ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
    },
    "down": {
      "type": "yes_no",
      "ask": "C < ema(C, 20) and ema(C, 20) < sma(C, 50) and sma(C, 50) < sma(C, 200)"
    },
    "trending": {
      "type": "yes_no",
      "ask": "adx(14) > 25"
    },
    "rising": {
      "type": "yes_no",
      "ask": "sma(C, 50) > ref(sma(C, 50), -10)"
    }
  }
}
Response JSON (DIS, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "up": {
      "yes_no": 0.7817,
      "rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "down": {
      "yes_no": 0.0914,
      "rule": "C < ema(C, 20) and ema(C, 20) < sma(C, 50) and sma(C, 50) < sma(C, 200)",
      "basis": "rule"
    },
    "trending": {
      "yes_no": 0.7349,
      "rule": "adx(14) > 25",
      "basis": "rule"
    },
    "rising": {
      "yes_no": 0.9309,
      "rule": "sma(C, 50) > ref(sma(C, 50), -10)",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "DIS",
    "as_of": "2026-10-30"
  }
}

adx ema ref sma

Broker app · example 12

Short-sale ticket context: is TSLA stretched to the upside?

Give customers opening a short a quick context line: how stretched the stock is and how likely a squeeze-sized rally is.

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

stretchedruleC > sma(C, 20) + 2 * atr(14)
Stretched: more than 2 ATR above the 20-day
obEnglish → ruleIs the stock overbought on RSI, above 70?
upperEnglish → ruleDid the stock close above the upper Bollinger Band?
rally10forecastWill it rally at least 10% at some point in the next month?
A 10% rally within a month

Answers

QuestionAnswerReading
stretched
Stretched: more than 2 ATR above the 20-day
0.2042false
ob
Is the stock overbought on RSI, above 70
compiled to rsi(C, 14) > 70
0.0873false
upper
Did the stock close above the upper Bollinger Band
compiled to C > bbupper(C, 20)
0.2572false
rally10
A 10% rally within a month
0.68769% · likely

What it means

For TSLA on the session of 2026-10-30: Not true: Stretched: more than 2 ATR above the 20-day; Is the stock overbought on RSI, above 70; Did the stock close above the upper Bollinger Band. Forecasts: A 10% rally within a month 69%.

The context line shows the stretch facts and the rally odds side by side; shorting stays the customer's decision.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "TSLA"
  },
  "questions": {
    "stretched": {
      "type": "yes_no",
      "ask": "C > sma(C, 20) + 2 * atr(14)"
    },
    "ob": {
      "type": "yes_no",
      "instructions": "Is the stock overbought on RSI, above 70?"
    },
    "upper": {
      "type": "yes_no",
      "instructions": "Did the stock close above the upper Bollinger Band?"
    },
    "rally10": {
      "type": "yes_no",
      "instructions": "Will it rally at least 10% at some point in the next month?"
    }
  }
}
Response JSON (TSLA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "stretched": {
      "yes_no": 0.2042,
      "rule": "C > sma(C, 20) + 2 * atr(14)",
      "basis": "rule"
    },
    "ob": {
      "yes_no": 0.0873,
      "rule": "rsi(C, 14) > 70",
      "basis": "pattern"
    },
    "upper": {
      "yes_no": 0.2572,
      "rule": "C > bbupper(C, 20)",
      "basis": "comparison"
    },
    "rally10": {
      "yes_no": 0.687
    }
  },
  "context": {
    "symbol": "TSLA",
    "as_of": "2026-10-30"
  }
}

atr bbupper rsi sma

Broker app · example 13

Explain why SPY and VOO move together in a customer's portfolio

Answer identical questions for two near-identical funds to show customers the overlap.

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

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
rsirulersi(C, 14) > 50
RSI above 50
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

Symboltrendrulersiruledrop5forecastup_weekforecast
SPY0.11280.09190.2030.598
VOO0.11490.09380.1940.589

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: Above the 50-day average: true for none of 2. RSI above 50: true for none of 2. Highest odds for “A 5% drawdown within a month”: SPY at 20%.

Two funds tracking the same index give nearly identical answers, which makes the overlap visible without a chart.

Request JSON (SPY; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "rsi": {
      "type": "yes_no",
      "ask": "rsi(C, 14) > 50"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  }
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.1128,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "rsi": {
      "yes_no": 0.0919,
      "rule": "rsi(C, 14) > 50",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.203
    },
    "up_week": {
      "yes_no": 0.598
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  }
}

rsi sma

Broker app · example 14

Weekly statement insert for customers holding sector funds

Each Friday, add one line per sector fund to the weekly statement email: trend and momentum facts.

ora-fin-0.1.14 symbols, one request each4 questions1 actionworkflow · Fri at 18:00 ET
  1. ScheduleFri at 18:00 ET
  2. State4 symbols
  3. Questions4 asked
  4. Answersreal, captured
  5. Actions1 rule · dry run

State

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

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
monthEnglish → ruleIs the stock up over the last month?
macdEnglish → ruleIs MACD above zero?
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulemonthrulemacdrulebeat_spyforecastFired
XLK0.920.06540.11460.498insert
XLF0.9190.90090.76250.448insert
XLE0.94630.94190.9430.55insert
XLV0.94630.94540.94390.534insert

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→Emailstatements
XLK 1 of 1 fired · dry run, nothing sent
insertwould send (dry run)Email → statements
{
  "subject": "Your sector funds this week",
  "text": "XLK (2026-10-30): above its 200-day 92%, up over the month 7%, MACD above zero 11%. Information only, not a recommendation."
}
XLF 1 of 1 fired · dry run, nothing sent
insertwould send (dry run)Email → statements
{
  "subject": "Your sector funds this week",
  "text": "XLF (2026-10-30): above its 200-day 92%, up over the month 90%, MACD above zero 76%. Information only, not a recommendation."
}
XLE 1 of 1 fired · dry run, nothing sent
insertwould send (dry run)Email → statements
{
  "subject": "Your sector funds this week",
  "text": "XLE (2026-10-30): above its 200-day 95%, up over the month 94%, MACD above zero 94%. Information only, not a recommendation."
}
XLV 1 of 1 fired · dry run, nothing sent
insertwould send (dry run)Email → statements
{
  "subject": "Your sector funds this week",
  "text": "XLV (2026-10-30): above its 200-day 95%, up over the month 95%, MACD above zero 94%. Information only, not a recommendation."
}

What it means

Session of 2026-10-30, 4 symbols: Is the stock above its 200-day moving average: true for XLK, XLF, XLE, XLV of 4. Is the stock up over the last month: true for XLF, XLE, XLV of 4. Is MACD above zero: true for XLF, XLE, XLV of 4. Highest odds for “Beating SPY over a month”: XLE at 55%. insert fired for XLK, XLF, XLE, XLV.

The statement shows facts with a clear 'information only' line; the forecast is held back for the app, where odds are explained.

As a scheduled workflow (Fri at 18:00 ET)

Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.

{
  "name": "Weekly statement insert for customers holding sector funds",
  "symbols": "XLK XLF XLE XLV",
  "days": [
    5
  ],
  "at_time": "18:00",
  "model": "ora-fin-0.1.1",
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "month": {
      "type": "yes_no",
      "instructions": "Is the stock up over the last month?"
    },
    "macd": {
      "type": "yes_no",
      "instructions": "Is MACD above zero?"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  },
  "actions": [
    {
      "id": "insert",
      "when": "trend >= 0",
      "do": "email",
      "connection": "statements",
      "subject": "Your sector funds this week",
      "message": "{{symbol}} ({{as_of}}): above its 200-day {{trend|pct}}, up over the month {{month|pct}}, MACD above zero {{macd|pct}}. Information only, not a recommendation."
    }
  ]
}
Request JSON (XLK; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLK"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "month": {
      "type": "yes_no",
      "instructions": "Is the stock up over the last month?"
    },
    "macd": {
      "type": "yes_no",
      "instructions": "Is MACD above zero?"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  },
  "actions": [
    {
      "id": "insert",
      "when": "trend >= 0",
      "do": "email",
      "connection": "statements",
      "subject": "Your sector funds this week",
      "message": "{{symbol}} ({{as_of}}): above its 200-day {{trend|pct}}, up over the month {{month|pct}}, MACD above zero {{macd|pct}}. Information only, not a recommendation."
    }
  ],
  "dry_run": true
}
Response JSON (XLK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.92,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "month": {
      "yes_no": 0.0654,
      "rule": "C > C[-21]",
      "basis": "pattern"
    },
    "macd": {
      "yes_no": 0.1146,
      "rule": "macd(C) > 0",
      "basis": "pattern"
    },
    "beat_spy": {
      "yes_no": 0.498
    }
  },
  "context": {
    "symbol": "XLK",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "insert",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "statements",
      "preview": {
        "subject": "Your sector funds this week",
        "text": "XLK (2026-10-30): above its 200-day 92%, up over the month 7%, MACD above zero 11%. Information only, not a recommendation."
      }
    }
  ]
}

macd offset sma

Broker app · example 15

Pattern alerts for chart users: shooting star and hanging man on AAPL

Let chart users subscribe to bearish candle alerts on their holdings.

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

State

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

Questions

starruleshooting_star()
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
hangingrulehanging_man()
hanging man candle: Hammer shape, closing above the close five bars back.
star_highruleshooting_star() and H > highest(H, 20)
Shooting star at a 20-day high
crowsrulethree_black_crows()
three black crows candle: Three red bars, each closing lower and opening inside the previous body.

Answers

QuestionAnswerReading
star
shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.
0.0537false
hanging
hanging man candle: Hammer shape, closing above the close five bars back.
0.1795false
star_high
Shooting star at a 20-day high
0.0537false
crows
three black crows candle: Three red bars, each closing lower and opening inside the previous body.
0.1039false

Actions

Rules on the answers decide what to send.

star >= 0.6 or hanging >= 0.6 or crows >= 0.6→Webhookpush-gateway
What each action would send 0 of 1 fired · dry run, nothing sent
pattern_pushrule false: skipped

What it means

For AAPL on the session of 2026-10-30: Not true: shooting star candle: Upper wick at least twice the body, lower wick at most 10% of the range, after a five-bar rise.; hanging man candle: Hammer shape, closing above the close five bars back.; Shooting star at a 20-day high; three black crows candle: Three red bars, each closing lower and opening inside the previous body.. No action fired: every rule was false.

Pattern pushes go only to users who subscribed and only when a pattern is true; the app links to a lesson on what the candle means.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "star": {
      "type": "yes_no",
      "ask": "shooting_star()"
    },
    "hanging": {
      "type": "yes_no",
      "ask": "hanging_man()"
    },
    "star_high": {
      "type": "yes_no",
      "ask": "shooting_star() and H > highest(H, 20)"
    },
    "crows": {
      "type": "yes_no",
      "ask": "three_black_crows()"
    }
  },
  "actions": [
    {
      "id": "pattern_push",
      "when": "star >= 0.6 or hanging >= 0.6 or crows >= 0.6",
      "do": "webhook",
      "connection": "push-gateway",
      "body": {
        "topic": "patterns_{{symbol}}",
        "symbol": "{{symbol}}",
        "shooting_star": "{{star}}",
        "hanging_man": "{{hanging}}",
        "three_black_crows": "{{crows}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "star": {
      "yes_no": 0.0537,
      "rule": "shooting_star()",
      "basis": "rule"
    },
    "hanging": {
      "yes_no": 0.1795,
      "rule": "hanging_man()",
      "basis": "rule"
    },
    "star_high": {
      "yes_no": 0.0537,
      "rule": "shooting_star() and H > highest(H, 20)",
      "basis": "rule"
    },
    "crows": {
      "yes_no": 0.1039,
      "rule": "three_black_crows()",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "pattern_push",
      "fired": false,
      "status": "skipped"
    }
  ]
}

hanging_man highest shooting_star three_black_crows

Broker app · example 16

Risk label on spot crypto ETFs: IBIT, ETHA and BITO

Attach a 'high volatility' label to crypto funds on days their volatility rules are true.

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

State

{"symbol":"IBIT"} then ETHA, BITO, one request each. The server fills in the latest completed session.

Questions

atrEnglish → ruleIs the 14-day ATR more than 3% of the price?
hvrulestd(log(C / C[-1]), 20) * sqrt(252) > 0.4
Annualized 20-day volatility above 40%
widerule(H - L) > 2 * avg(H - L, 20)
Range more than twice the 20-day average range
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

Symbolatrrulehvrulewideruledrop10forecast
IBIT0.23650.12390.10480.566
ETHA0.94520.33610.07540.655
BITO0.28320.12280.09570.524

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

What it means

Session of 2026-10-30, 3 symbols: Is the 14-day ATR more than 3% of the price: true for ETHA of 3. Annualized 20-day volatility above 40%: true for none of 3. Range more than twice the 20-day average range: true for none of 3. Highest odds for “A 10% drawdown within a month”: ETHA at 66%.

Labels are exact and refreshed after each close; a fund can lose the label when volatility settles.

Request JSON (IBIT; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "IBIT"
  },
  "questions": {
    "atr": {
      "type": "yes_no",
      "instructions": "Is the 14-day ATR more than 3% of the price?"
    },
    "hv": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
    },
    "wide": {
      "type": "yes_no",
      "ask": "(H - L) > 2 * avg(H - L, 20)"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    }
  }
}
Response JSON (IBIT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "atr": {
      "yes_no": 0.2365,
      "rule": "atr(14) / C > 0.03",
      "basis": "pattern"
    },
    "hv": {
      "yes_no": 0.1239,
      "rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
      "basis": "rule"
    },
    "wide": {
      "yes_no": 0.1048,
      "rule": "(H - L) > 2 * avg(H - L, 20)",
      "basis": "rule"
    },
    "drop10": {
      "yes_no": 0.566
    }
  },
  "context": {
    "symbol": "IBIT",
    "as_of": "2026-10-30"
  }
}

atr avg log offset sqrt std

Broker app · example 17

Fractional-share nudge for high-priced stocks after a pullback (COST)

Suggest fractional buys to customers following a high-priced stock when it pulls back inside its uptrend.

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

State

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

Questions

pullbackEnglish → ruleHas the stock pulled back at least 5% from its 20-day high?
trendEnglish → ruleIs the stock above its 200-day moving average?
entryEnglish → ruleIs the stock in an uptrend with a pullback to the 20-day (entry zone)?
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
pullback
Has the stock pulled back at least 5% from its 20-day high
compiled to C <= max(H, 20) * 0.95
0.0782false
trend
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.9022true
entry
Is the stock in an uptrend with a pullback to the 20-day (entry zone)
compiled to (C > sma(C, 50)) and (sma(C, 50) > sma(C, 200)) and (L <= sma(C, 20) * 1.01) and (C >= sma(C, 20))
0.0538false
rally5
A 5% rally within a month
0.35335% · unlikely

Actions

Rules on the answers decide what to send.

pullback >= 0.6 and trend >= 0.6→Webhookin-app-messages
What each action would send 0 of 1 fired · dry run, nothing sent
nudgerule false: skipped

What it means

For COST on the session of 2026-10-30: True now: Is the stock above its 200-day moving average. Not true: Has the stock pulled back at least 5% from its 20-day high; Is the stock in an uptrend with a pullback to the 20-day (entry zone). Forecasts: A 5% rally within a month 35%. No action fired: every rule was false.

The nudge is educational and only fires on a real pullback in an uptrend; it links to fractional trading, not to a buy button.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "COST"
  },
  "questions": {
    "pullback": {
      "type": "yes_no",
      "instructions": "Has the stock pulled back at least 5% from its 20-day high?"
    },
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "entry": {
      "type": "yes_no",
      "instructions": "Is the stock in an uptrend with a pullback to the 20-day (entry zone)?"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "nudge",
      "when": "pullback >= 0.6 and trend >= 0.6",
      "do": "webhook",
      "connection": "in-app-messages",
      "body": {
        "segment": "followers_{{symbol}}",
        "template": "fractional_pullback",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (COST, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "pullback": {
      "yes_no": 0.0782,
      "rule": "C <= max(H, 20) * 0.95",
      "basis": "pattern"
    },
    "trend": {
      "yes_no": 0.9022,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "entry": {
      "yes_no": 0.0538,
      "rule": "(C > sma(C, 50)) and (sma(C, 50) > sma(C, 200)) and (L <= sma(C, 20) * 1.01) and (C >= sma(C, 20))",
      "basis": "pattern"
    },
    "rally5": {
      "yes_no": 0.353
    }
  },
  "context": {
    "symbol": "COST",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "nudge",
      "fired": false,
      "status": "skipped"
    }
  ]
}

max sma

Broker app · example 18

International ADR note: TSM, ASML and NVO trend

Show customers holding foreign stocks a trend summary next to a note that currency moves affect ADR prices.

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

State

{"symbol":"TSM"} then ASML, NVO, one request each. The server fills in the latest completed session.

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
goldenEnglish → ruleIs the 50-day moving average above the 200-day?
ddruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

Symboltrendrulegoldenruleddruleup_weekforecast
TSM0.71240.94630.16220.564
ASML0.3630.90480.69970.564
NVO0.120.07930.94550.535

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

What it means

Session of 2026-10-30, 3 symbols: Is the stock above its 200-day moving average: true for TSM of 3. Is the 50-day moving average above the 200-day: true for TSM, ASML of 3. More than 20% off the 52-week high: true for ASML, NVO of 3. Highest odds for “Higher in a week”: TSM at 56%.

Trend facts are computed on the US-listed price, which already includes currency moves; the note explains that to customers.

Request JSON (TSM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "TSM"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "golden": {
      "type": "yes_no",
      "instructions": "Is the 50-day moving average above the 200-day?"
    },
    "dd": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  }
}
Response JSON (TSM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.7124,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "golden": {
      "yes_no": 0.9463,
      "rule": "sma(C, 50) > sma(C, 200)",
      "basis": "comparison"
    },
    "dd": {
      "yes_no": 0.1622,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.564
    }
  },
  "context": {
    "symbol": "TSM",
    "as_of": "2026-10-30"
  }
}

max sma

Broker app · example 19

Inside-bar breakout alert for active traders (QQQ)

Offer active traders an alert when price breaks out of an inside bar, with stop distance context.

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

State

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

Questions

inside_breakEnglish → ruleDid the stock break out above yesterday's inside bar?
inside_todayEnglish → ruleIs today an inside day?
stopEnglish → ruleIs a stop below yesterday's low less than 1 ATR away?
new_highforecastWill it make a new 20-day high in the next week?
A new 20-day high next week

Answers

QuestionAnswerReading
inside_break
Did the stock break out above yesterday's inside bar
compiled to (H[-1] <= H[-2]) and (L[-1] >= L[-2]) and (C > H[-1])
0.0537false
inside_today
Is today an inside day
compiled to inside_bar()
0.0537false
stop
Is a stop below yesterday's low less than 1 ATR away
compiled to (C > L[-1]) and (C - L[-1] < 1 * atr(14))
0.0582false
new_high
A new 20-day high next week
0.044% · unlikely

Actions

Rules on the answers decide what to send.

inside_break >= 0.6→Slackactive-trader-community
What each action would send 0 of 1 fired · dry run, nothing sent
alertrule false: skipped

What it means

For QQQ on the session of 2026-10-30: Not true: Did the stock break out above yesterday's inside bar; Is today an inside day; Is a stop below yesterday's low less than 1 ATR away. Forecasts: A new 20-day high next week 4%. No action fired: every rule was false.

The alert goes to the broker's active-trader channel; the stop-distance fact helps traders size, the forecast is labeled as odds.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "QQQ"
  },
  "questions": {
    "inside_break": {
      "type": "yes_no",
      "instructions": "Did the stock break out above yesterday's inside bar?"
    },
    "inside_today": {
      "type": "yes_no",
      "instructions": "Is today an inside day?"
    },
    "stop": {
      "type": "yes_no",
      "instructions": "Is a stop below yesterday's low less than 1 ATR away?"
    },
    "new_high": {
      "type": "yes_no",
      "instructions": "Will it make a new 20-day high in the next week?"
    }
  },
  "actions": [
    {
      "id": "alert",
      "when": "inside_break >= 0.6",
      "do": "slack",
      "connection": "active-trader-community",
      "message": "{{symbol}} ({{as_of}}) broke out above an inside bar. Stop under yesterday's low within 1 ATR: {{stop|pct}}. New 20-day high next week: {{new_high|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (QQQ, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "inside_break": {
      "yes_no": 0.0537,
      "rule": "(H[-1] <= H[-2]) and (L[-1] >= L[-2]) and (C > H[-1])",
      "basis": "pattern"
    },
    "inside_today": {
      "yes_no": 0.0537,
      "rule": "inside_bar()",
      "basis": "pattern"
    },
    "stop": {
      "yes_no": 0.0582,
      "rule": "(C > L[-1]) and (C - L[-1] < 1 * atr(14))",
      "basis": "pattern"
    },
    "new_high": {
      "yes_no": 0.04
    }
  },
  "context": {
    "symbol": "QQQ",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "alert",
      "fired": false,
      "status": "skipped"
    }
  ]
}

atr inside_bar offset

Broker app · example 20

Quarterly account-review trigger: bonds vs stocks drift (AGG and VTI)

Trigger an advisor review offer when stocks and bonds have moved far apart over three months.

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

State

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

Questions

up10English → ruleIs the stock up more than 10% over the last three months?
down5English → ruleIs the stock down more than 5% over the last month?
trendEnglish → ruleIs the stock above its 200-day moving average?
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symbolup10ruledown5ruletrendruledrop5forecastFired
AGG0.05370.05370.2480.009none
VTI0.05370.06620.94150.187none

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.

up10 >= 0.6 or down5 >= 0.6→Emailadvice-team
AGG 0 of 1 fired · dry run, nothing sent
VTI 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 2 symbols: Is the stock up more than 10% over the last three months: true for none of 2. Is the stock down more than 5% over the last month: true for none of 2. Is the stock above its 200-day moving average: true for VTI of 2. Highest odds for “A 5% drawdown within a month”: VTI at 19%. offer fired for none.

The advice team offers a review to affected customers; nothing changes in an account without the customer.

Request JSON (AGG; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AGG"
  },
  "questions": {
    "up10": {
      "type": "yes_no",
      "instructions": "Is the stock up more than 10% over the last three months?"
    },
    "down5": {
      "type": "yes_no",
      "instructions": "Is the stock down more than 5% over the last month?"
    },
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "offer",
      "when": "up10 >= 0.6 or down5 >= 0.6",
      "do": "email",
      "connection": "advice-team",
      "subject": "Review offer: {{symbol}} moved",
      "message": "{{symbol}} ({{as_of}}) moved enough (up 10% in three months {{up10|pct}}, down 5% this month {{down5|pct}}) that holders' mixes may have drifted. Offer a review."
    }
  ],
  "dry_run": true
}
Response JSON (AGG, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "up10": {
      "yes_no": 0.0537,
      "rule": "C / C[-63] - 1 > 0.1",
      "basis": "pattern"
    },
    "down5": {
      "yes_no": 0.0537,
      "rule": "C / C[-21] - 1 < -0.05",
      "basis": "pattern"
    },
    "trend": {
      "yes_no": 0.248,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "drop5": {
      "yes_no": 0.009
    }
  },
  "context": {
    "symbol": "AGG",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "offer",
      "fired": false,
      "status": "skipped"
    }
  ]
}

offset sma

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.