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

Fintech app builder: 20 ways to use Ora

Ships market insights inside a product: cards, nudges and push notifications. Each example is a complete, runnable request with the real answers it returned (39 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 (43)

sma 10offset 8avg 3beat_eps_last 2days_to_earnings 2rsi 2days_to_ex_div 2div_yield_ttm 2raised_last 2atr 2log 2sqrt 2std 2max 2highest 2ref 2beat_revenue_last 1beat_streak 1next_report_bmo 1last_div_amount 1next_div_amount 1years_of_growth 1abs 1doji 1dragonfly_doji 1gravestone_doji 1harami_bear 1tweezer_top 1atr_pct 1days_since_split 1days_to_split 1last_split_ratio 1reverse_split_last 1splits_5y 1three_white_soldiers 1roc 1dark_cloud 1engulfing_bear 1evening_star 1harami_bull 1piercing_line 1tweezer_bottom 1div_count_ttm 1

Examples 11–20 of 20 · page 2 of 2

Fintech app builder · example 11

Morning commute alert: did NFLX gap and fill?

Tell commuters whether a followed stock gapped, filled the gap, or held it, in one short notification.

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

State

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

Questions

gap_upruleO > C[-1] * 1.01
Opened more than 1% above yesterday's close
gap_dnruleO < C[-1] * 0.99
Opened more than 1% below yesterday's close
fadedruleO > C[-1] and C < C[-1]
Gapped up but closed under yesterday's close
reclaimedruleO < L[-1] and C > C[-1]
Opened under yesterday's low, closed up on the day
filledEnglish → ruleDid today's gap up fill?

Answers

QuestionAnswerReading
gap_up
Opened more than 1% above yesterday's close
0.4929on the line (false)
gap_dn
Opened more than 1% below yesterday's close
0.1197false
faded
Gapped up but closed under yesterday's close
0.4872on the line (false)
reclaimed
Opened under yesterday's low, closed up on the day
0.1484false
filled
Did today's gap up fill
compiled to (O > C[-1] * 1) and (L <= C[-1])
0.6813true

Actions

Rules on the answers decide what to send.

gap_up >= 0.6 or gap_dn >= 0.6→Webhookpush-gateway
What each action would send 0 of 1 fired · dry run, nothing sent
gap_noterule false: skipped

What it means

For NFLX on the session of 2026-10-30: True now: Did today's gap up fill. Not true: Opened more than 1% below yesterday's close; Opened under yesterday's low, closed up on the day. On the line: Opened more than 1% above yesterday's close; Gapped up but closed under yesterday's close. No action fired: every rule was false.

Gap rules describe the last completed session; the app words it as yesterday's session, never as live trading.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NFLX"
  },
  "questions": {
    "gap_up": {
      "type": "yes_no",
      "ask": "O > C[-1] * 1.01"
    },
    "gap_dn": {
      "type": "yes_no",
      "ask": "O < C[-1] * 0.99"
    },
    "faded": {
      "type": "yes_no",
      "ask": "O > C[-1] and C < C[-1]"
    },
    "reclaimed": {
      "type": "yes_no",
      "ask": "O < L[-1] and C > C[-1]"
    },
    "filled": {
      "type": "yes_no",
      "instructions": "Did today's gap up fill?"
    }
  },
  "actions": [
    {
      "id": "gap_note",
      "when": "gap_up >= 0.6 or gap_dn >= 0.6",
      "do": "webhook",
      "connection": "push-gateway",
      "body": {
        "topic": "follow_{{symbol}}",
        "title": "{{symbol}} gapped",
        "data": {
          "gap_up": "{{gap_up}}",
          "gap_down": "{{gap_dn}}",
          "faded": "{{faded}}",
          "reclaimed": "{{reclaimed}}",
          "as_of": "{{as_of}}"
        }
      }
    }
  ],
  "dry_run": true
}
Response JSON (NFLX, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "gap_up": {
      "yes_no": 0.4929,
      "rule": "O > C[-1] * 1.01",
      "basis": "rule"
    },
    "gap_dn": {
      "yes_no": 0.1197,
      "rule": "O < C[-1] * 0.99",
      "basis": "rule"
    },
    "faded": {
      "yes_no": 0.4872,
      "rule": "O > C[-1] and C < C[-1]",
      "basis": "rule"
    },
    "reclaimed": {
      "yes_no": 0.1484,
      "rule": "O < L[-1] and C > C[-1]",
      "basis": "rule"
    },
    "filled": {
      "yes_no": 0.6813,
      "rule": "(O > C[-1] * 1) and (L <= C[-1])",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "NFLX",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "gap_note",
      "fired": false,
      "status": "skipped"
    }
  ]
}

offset

Fintech app builder · example 12

Inputs for a simple risk meter on ARKK

Fill a one-to-five risk meter in the app from volatility rules and the drawdown forecast.

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

State

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

Questions

atrruleatr_pct(14) > 3
A typical day moves more than 3%
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
hv30forecastWill annualized volatility over the next 21 sessions exceed 30%?
Next-month volatility above 30%

Answers

QuestionAnswerReading
atr
A typical day moves more than 3%
0.9369true
hv
Annualized 20-day volatility above 40%
0.7844true
wide
Range more than twice the 20-day average range
0.0603false
drop10
A 10% drawdown within a month
0.6161% · likely
hv30
Next-month volatility above 30%
0.42643% · close to even

What it means

For ARKK on the session of 2026-10-30: True now: A typical day moves more than 3%; Annualized 20-day volatility above 40%. Not true: Range more than twice the 20-day average range. Forecasts: A 10% drawdown within a month 61%; Next-month volatility above 30% 43%.

The meter adds up true volatility rules and scales by the forecast; each input is shown on tap so the score is explainable.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "ARKK"
  },
  "questions": {
    "atr": {
      "type": "yes_no",
      "ask": "atr_pct(14) > 3"
    },
    "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?"
    },
    "hv30": {
      "type": "yes_no",
      "instructions": "Will annualized volatility over the next 21 sessions exceed 30%?"
    }
  }
}
Response JSON (ARKK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "atr": {
      "yes_no": 0.9369,
      "rule": "atr_pct(14) > 3",
      "basis": "rule"
    },
    "hv": {
      "yes_no": 0.7844,
      "rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
      "basis": "rule"
    },
    "wide": {
      "yes_no": 0.0603,
      "rule": "(H - L) > 2 * avg(H - L, 20)",
      "basis": "rule"
    },
    "drop10": {
      "yes_no": 0.61
    },
    "hv30": {
      "yes_no": 0.426
    }
  },
  "context": {
    "symbol": "ARKK",
    "as_of": "2026-10-30"
  }
}

atr_pct avg log offset sqrt std

Fintech app builder · example 13

Explain a past split on NVDA's chart

When users see a jump in share count or an old price, show a card explaining the split history.

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

State

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

Questions

split3yruledays_since_split <= 1095
Split in the last three years
ratio4rulelast_split_ratio >= 4
Last split at least 4-for-1
multirulesplits_5y >= 2
Two or more splits in five years
reverseEnglish → ruleWas the last split a reverse split?
announcedEnglish → ruleIs a stock split coming up?

Answers

QuestionAnswerReading
split3y
Split in the last three years
0.9463true
ratio4
Last split at least 4-for-1
0.9463true
multi
Two or more splits in five years
0.1409false
reverse
Was the last split a reverse split
compiled to reverse_split_last > 0.5
0.1409false
announced
Is a stock split coming up
compiled to days_to_split <= 365
0.0537false

What it means

For NVDA on the session of 2026-10-30: True now: Split in the last three years; Last split at least 4-for-1. Not true: Two or more splits in five years; Was the last split a reverse split; Is a stock split coming up.

Split facts come from the corporate-action record and are exact; the card only appears when a recent split is true.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "split3y": {
      "type": "yes_no",
      "ask": "days_since_split <= 1095"
    },
    "ratio4": {
      "type": "yes_no",
      "ask": "last_split_ratio >= 4"
    },
    "multi": {
      "type": "yes_no",
      "ask": "splits_5y >= 2"
    },
    "reverse": {
      "type": "yes_no",
      "instructions": "Was the last split a reverse split?"
    },
    "announced": {
      "type": "yes_no",
      "instructions": "Is a stock split coming up?"
    }
  }
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "split3y": {
      "yes_no": 0.9463,
      "rule": "days_since_split <= 1095",
      "basis": "rule"
    },
    "ratio4": {
      "yes_no": 0.9463,
      "rule": "last_split_ratio >= 4",
      "basis": "rule"
    },
    "multi": {
      "yes_no": 0.1409,
      "rule": "splits_5y >= 2",
      "basis": "rule"
    },
    "reverse": {
      "yes_no": 0.1409,
      "rule": "reverse_split_last > 0.5",
      "basis": "pattern"
    },
    "announced": {
      "yes_no": 0.0537,
      "rule": "days_to_split <= 365",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  }
}

days_since_split days_to_split last_split_ratio reverse_split_last splits_5y

Fintech app builder · example 14

A crypto tile for bitcoin ETFs: IBIT and FBTC

Show users who hold spot bitcoin ETFs whether trend and volatility are calm or stretched.

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

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
stretchedruleC > sma(C, 20) + 2 * atr(14)
Stretched: more than 2 ATR above the 20-day
atrEnglish → ruleIs the 14-day ATR more than 3% of the price?
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month
rally10forecastWill it rally at least 10% at some point in the next month?
A 10% rally within a month

Answers

Symboltrendrulestretchedruleatrruledrop10forecastrally10forecast
IBIT0.16490.06180.23650.5660.64
FBTC0.16930.06240.18810.5730.642

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. Stretched: more than 2 ATR above the 20-day: true for none of 2. Is the 14-day ATR more than 3% of the price: true for none of 2. Highest odds for “A 10% drawdown within a month”: FBTC at 57%.

Both funds track the same asset, so their answers should be close; a big difference would point to a data issue worth checking.

Request JSON (IBIT; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "IBIT"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "stretched": {
      "type": "yes_no",
      "ask": "C > sma(C, 20) + 2 * atr(14)"
    },
    "atr": {
      "type": "yes_no",
      "instructions": "Is the 14-day ATR more than 3% of the price?"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    },
    "rally10": {
      "type": "yes_no",
      "instructions": "Will it rally at least 10% at some point in the next month?"
    }
  }
}
Response JSON (IBIT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.1649,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "stretched": {
      "yes_no": 0.0618,
      "rule": "C > sma(C, 20) + 2 * atr(14)",
      "basis": "rule"
    },
    "atr": {
      "yes_no": 0.2365,
      "rule": "atr(14) / C > 0.03",
      "basis": "pattern"
    },
    "drop10": {
      "yes_no": 0.566
    },
    "rally10": {
      "yes_no": 0.64
    }
  },
  "context": {
    "symbol": "IBIT",
    "as_of": "2026-10-30"
  }
}

atr sma

Fintech app builder · example 15

Re-engagement email when a followed stock (DIS) breaks out

Bring back dormant users who follow a stock by emailing them when it makes a meaningful move up.

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

State

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

Questions

breakoutruleC > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)
20-day breakout on 1.5× volume
cross50English → ruleDid the stock cross above its 50-day moving average today?
soldiersrulethree_white_soldiers()
three white soldiers candle: Three green bars, each closing higher and opening inside the previous body.
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
breakout
20-day breakout on 1.5× volume
0.0758false
cross50
Did the stock cross above its 50-day moving average today
compiled to (C > sma(C, 50)) and (C[-1] <= ref(sma(C, 50), -1))
0.1105false
soldiers
three white soldiers candle: Three green bars, each closing higher and opening inside the previous body.
0.0793false
up_week
Higher in a week
0.56256% · close to even

Actions

Rules on the answers decide what to send.

breakout >= 0.6 or soldiers >= 0.6→Emaillifecycle
What each action would send 0 of 1 fired · dry run, nothing sent
winbackrule false: skipped

What it means

For DIS on the session of 2026-10-30: Not true: 20-day breakout on 1.5× volume; Did the stock cross above its 50-day moving average today; three white soldiers candle: Three green bars, each closing higher and opening inside the previous body.. Forecasts: Higher in a week 56%. No action fired: every rule was false.

Lifecycle emails tied to real events beat calendar blasts; the rule gate means a dormant user hears only when something happened.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "DIS"
  },
  "questions": {
    "breakout": {
      "type": "yes_no",
      "ask": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "cross50": {
      "type": "yes_no",
      "instructions": "Did the stock cross above its 50-day moving average today?"
    },
    "soldiers": {
      "type": "yes_no",
      "ask": "three_white_soldiers()"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  },
  "actions": [
    {
      "id": "winback",
      "when": "breakout >= 0.6 or soldiers >= 0.6",
      "do": "email",
      "connection": "lifecycle",
      "subject": "{{symbol}} is moving",
      "message": "{{symbol}} ({{as_of}}) broke out on volume ({{breakout|pct}}) or printed three white soldiers ({{soldiers|pct}}). Open the app to see the full picture."
    }
  ],
  "dry_run": true
}
Response JSON (DIS, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "breakout": {
      "yes_no": 0.0758,
      "rule": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "cross50": {
      "yes_no": 0.1105,
      "rule": "(C > sma(C, 50)) and (C[-1] <= ref(sma(C, 50), -1))",
      "basis": "comparison"
    },
    "soldiers": {
      "yes_no": 0.0793,
      "rule": "three_white_soldiers()",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.562
    }
  },
  "context": {
    "symbol": "DIS",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "winback",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg highest offset ref sma three_white_soldiers

Fintech app builder · example 16

Feed a sector heatmap: XLK, XLF, XLE, XLV, XLU, XLY

Color six sector tiles by trend and momentum from one rule set, posted to the app's heatmap endpoint.

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

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
rocruleroc(C, 20) > 5
Up more than 5% in 20 sessions
rsirulersi(C, 14) > 50
RSI above 50
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

Symboltrendrulerocrulersiruleup_weekforecastFired
XLK0.07760.05370.09570.546tile
XLF0.66920.6060.79290.541tile
XLE0.94320.8970.93180.592tile
XLV0.94470.91570.94150.571tile
XLU0.88650.82820.89290.515tile
XLY0.81560.47610.83760.479tile

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→Webhookheatmap
XLK 1 of 1 fired · dry run, nothing sent
tilewould send (dry run)Webhook → heatmap
{
  "tile": "XLK",
  "trend": 0.0776,
  "roc20_over_5": 0.0537,
  "rsi_over_50": 0.0957,
  "p_up_week": 0.546,
  "as_of": "2026-10-30"
}
XLF 1 of 1 fired · dry run, nothing sent
tilewould send (dry run)Webhook → heatmap
{
  "tile": "XLF",
  "trend": 0.6692,
  "roc20_over_5": 0.606,
  "rsi_over_50": 0.7929,
  "p_up_week": 0.541,
  "as_of": "2026-10-30"
}
XLE 1 of 1 fired · dry run, nothing sent
tilewould send (dry run)Webhook → heatmap
{
  "tile": "XLE",
  "trend": 0.9432,
  "roc20_over_5": 0.897,
  "rsi_over_50": 0.9318,
  "p_up_week": 0.592,
  "as_of": "2026-10-30"
}
XLV 1 of 1 fired · dry run, nothing sent
tilewould send (dry run)Webhook → heatmap
{
  "tile": "XLV",
  "trend": 0.9447,
  "roc20_over_5": 0.9157,
  "rsi_over_50": 0.9415,
  "p_up_week": 0.571,
  "as_of": "2026-10-30"
}
XLU 1 of 1 fired · dry run, nothing sent
tilewould send (dry run)Webhook → heatmap
{
  "tile": "XLU",
  "trend": 0.8865,
  "roc20_over_5": 0.8282,
  "rsi_over_50": 0.8929,
  "p_up_week": 0.515,
  "as_of": "2026-10-30"
}
XLY 1 of 1 fired · dry run, nothing sent
tilewould send (dry run)Webhook → heatmap
{
  "tile": "XLY",
  "trend": 0.8156,
  "roc20_over_5": 0.4761,
  "rsi_over_50": 0.8376,
  "p_up_week": 0.479,
  "as_of": "2026-10-30"
}

What it means

Session of 2026-10-30, 6 symbols: Above the 50-day average: true for XLF, XLE, XLV, XLU, XLY of 6. Up more than 5% in 20 sessions: true for XLF, XLE, XLV, XLU of 6. RSI above 50: true for XLF, XLE, XLV, XLU, XLY of 6. Highest odds for “Higher in a week”: XLE at 59%. tile fired for XLK, XLF, XLE, XLV, XLU, XLY.

Every sector posts a tile; the app colors by the count of true rules and shows the forecast on hover.

Request JSON (XLK; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLK"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "roc": {
      "type": "yes_no",
      "ask": "roc(C, 20) > 5"
    },
    "rsi": {
      "type": "yes_no",
      "ask": "rsi(C, 14) > 50"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  },
  "actions": [
    {
      "id": "tile",
      "when": "trend >= 0",
      "do": "webhook",
      "connection": "heatmap",
      "body": {
        "tile": "{{symbol}}",
        "trend": "{{trend}}",
        "roc20_over_5": "{{roc}}",
        "rsi_over_50": "{{rsi}}",
        "p_up_week": "{{up_week}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (XLK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.0776,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "roc": {
      "yes_no": 0.0537,
      "rule": "roc(C, 20) > 5",
      "basis": "rule"
    },
    "rsi": {
      "yes_no": 0.0957,
      "rule": "rsi(C, 14) > 50",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.546
    }
  },
  "context": {
    "symbol": "XLK",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "tile",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "heatmap",
      "preview": {
        "body": {
          "tile": "XLK",
          "trend": 0.0776,
          "roc20_over_5": 0.0537,
          "rsi_over_50": 0.0957,
          "p_up_week": 0.546,
          "as_of": "2026-10-30"
        }
      }
    }
  ]
}

roc rsi sma

Fintech app builder · example 17

A gentle warning card after a bearish candle on MSFT

Show a 'watch this' card when an evening star, bearish engulfing or dark cloud prints on a holding.

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

State

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

Questions

eveningruleevening_star()
evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.
engulf_bearruleengulfing_bear()
engulfing bear candle: A red body that engulfs yesterday's green body.
dark_cloudruledark_cloud()
dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
evening
evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.
0.0631false
engulf_bear
engulfing bear candle: A red body that engulfs yesterday's green body.
0.0823false
dark_cloud
dark cloud candle: After a green day, opens above its close and closes below the middle of its body (but above its open).
0.0643false
drop5
A 5% drawdown within a month
0.42242% · close to even

What it means

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

A bearish candle is a reason to look, not a sell signal; the app shows the drawdown odds next to the pattern to keep it in proportion.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MSFT"
  },
  "questions": {
    "evening": {
      "type": "yes_no",
      "ask": "evening_star()"
    },
    "engulf_bear": {
      "type": "yes_no",
      "ask": "engulfing_bear()"
    },
    "dark_cloud": {
      "type": "yes_no",
      "ask": "dark_cloud()"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (MSFT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "evening": {
      "yes_no": 0.0631,
      "rule": "evening_star()",
      "basis": "rule"
    },
    "engulf_bear": {
      "yes_no": 0.0823,
      "rule": "engulfing_bear()",
      "basis": "rule"
    },
    "dark_cloud": {
      "yes_no": 0.0643,
      "rule": "dark_cloud()",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.422
    }
  },
  "context": {
    "symbol": "MSFT",
    "as_of": "2026-10-30"
  }
}

dark_cloud engulfing_bear evening_star

Fintech app builder · example 18

Pre-market cards for the five most-followed stocks

Each weekday before the open, generate a card per stock with yesterday's facts and today's odds.

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

State

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

Questions

up_dayEnglish → ruleDid the stock close higher than yesterday?
above_50ruleC > sma(C, 50)
Above the 50-day average
gap_upforecastWill it gap up tomorrow?
A gap up tomorrow
gap_downforecastWill it gap down tomorrow?
A gap down tomorrow
up_tomorrowforecastWill the stock be up tomorrow?
Up tomorrow

Answers

Symbolup_dayruleabove_50rulegap_upforecastgap_downforecastup_tomorrowforecastFired
AAPL0.1270.91190.0530.0560.556card
TSLA0.29490.89610.2240.1570.482card
NVDA0.07320.07460.1910.1160.485card
AMZN0.18520.09640.1980.1310.476card
MSFT0.11480.70880.0710.0710.548card

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_day >= 0→Webhookcard-service
AAPL 1 of 1 fired · dry run, nothing sent
cardwould send (dry run)Webhook → card-service
{
  "card": "pre_market",
  "symbol": "AAPL",
  "closed_up": 0.127,
  "above_50d": 0.9119,
  "p_gap_up": 0.053,
  "p_gap_down": 0.056,
  "p_up_today": 0.556,
  "as_of": "2026-10-30"
}
TSLA 1 of 1 fired · dry run, nothing sent
cardwould send (dry run)Webhook → card-service
{
  "card": "pre_market",
  "symbol": "TSLA",
  "closed_up": 0.2949,
  "above_50d": 0.8961,
  "p_gap_up": 0.224,
  "p_gap_down": 0.157,
  "p_up_today": 0.482,
  "as_of": "2026-10-30"
}
NVDA 1 of 1 fired · dry run, nothing sent
cardwould send (dry run)Webhook → card-service
{
  "card": "pre_market",
  "symbol": "NVDA",
  "closed_up": 0.0732,
  "above_50d": 0.0746,
  "p_gap_up": 0.191,
  "p_gap_down": 0.116,
  "p_up_today": 0.485,
  "as_of": "2026-10-30"
}
AMZN 1 of 1 fired · dry run, nothing sent
cardwould send (dry run)Webhook → card-service
{
  "card": "pre_market",
  "symbol": "AMZN",
  "closed_up": 0.1852,
  "above_50d": 0.0964,
  "p_gap_up": 0.198,
  "p_gap_down": 0.131,
  "p_up_today": 0.476,
  "as_of": "2026-10-30"
}
MSFT 1 of 1 fired · dry run, nothing sent
cardwould send (dry run)Webhook → card-service
{
  "card": "pre_market",
  "symbol": "MSFT",
  "closed_up": 0.1148,
  "above_50d": 0.7088,
  "p_gap_up": 0.071,
  "p_gap_down": 0.071,
  "p_up_today": 0.548,
  "as_of": "2026-10-30"
}

What it means

Session of 2026-10-30, 5 symbols: Did the stock close higher than yesterday: true for none of 5. Above the 50-day average: true for AAPL, TSLA, MSFT of 5. Highest odds for “A gap up tomorrow”: TSLA at 22%. card fired for AAPL, TSLA, NVDA, AMZN, MSFT.

Cards are built from the last completed session, so the as_of date is always shown; the forecasts cover the session about to open.

As a scheduled workflow (Mon–Fri at 08:30 ET)

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

{
  "name": "Pre-market cards for the five most-followed stocks",
  "symbols": "AAPL TSLA NVDA AMZN MSFT",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "08:30",
  "model": "ora-fin-0.1.1",
  "questions": {
    "up_day": {
      "type": "yes_no",
      "instructions": "Did the stock close higher than yesterday?"
    },
    "above_50": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "gap_up": {
      "type": "yes_no",
      "instructions": "Will it gap up tomorrow?"
    },
    "gap_down": {
      "type": "yes_no",
      "instructions": "Will it gap down tomorrow?"
    },
    "up_tomorrow": {
      "type": "yes_no",
      "instructions": "Will the stock be up tomorrow?"
    }
  },
  "actions": [
    {
      "id": "card",
      "when": "up_day >= 0",
      "do": "webhook",
      "connection": "card-service",
      "body": {
        "card": "pre_market",
        "symbol": "{{symbol}}",
        "closed_up": "{{up_day}}",
        "above_50d": "{{above_50}}",
        "p_gap_up": "{{gap_up}}",
        "p_gap_down": "{{gap_down}}",
        "p_up_today": "{{up_tomorrow}}",
        "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_day": {
      "type": "yes_no",
      "instructions": "Did the stock close higher than yesterday?"
    },
    "above_50": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "gap_up": {
      "type": "yes_no",
      "instructions": "Will it gap up tomorrow?"
    },
    "gap_down": {
      "type": "yes_no",
      "instructions": "Will it gap down tomorrow?"
    },
    "up_tomorrow": {
      "type": "yes_no",
      "instructions": "Will the stock be up tomorrow?"
    }
  },
  "actions": [
    {
      "id": "card",
      "when": "up_day >= 0",
      "do": "webhook",
      "connection": "card-service",
      "body": {
        "card": "pre_market",
        "symbol": "{{symbol}}",
        "closed_up": "{{up_day}}",
        "above_50d": "{{above_50}}",
        "p_gap_up": "{{gap_up}}",
        "p_gap_down": "{{gap_down}}",
        "p_up_today": "{{up_tomorrow}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "up_day": {
      "yes_no": 0.127,
      "rule": "C > C[-1]",
      "basis": "comparison"
    },
    "above_50": {
      "yes_no": 0.9119,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "gap_up": {
      "yes_no": 0.053
    },
    "gap_down": {
      "yes_no": 0.056
    },
    "up_tomorrow": {
      "yes_no": 0.556
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "card",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "card-service",
      "preview": {
        "body": {
          "card": "pre_market",
          "symbol": "AAPL",
          "closed_up": 0.127,
          "above_50d": 0.9119,
          "p_gap_up": 0.053,
          "p_gap_down": 0.056,
          "p_up_today": 0.556,
          "as_of": "2026-10-30"
        }
      }
    }
  ]
}

offset sma

Fintech app builder · example 19

Two-candle reversal lesson on BA: harami and piercing line

Power an interactive lesson that checks whether a bullish two-candle reversal printed on the latest bars.

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

State

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

Questions

haramiruleharami_bull()
harami bull candle: A small green body inside yesterday's red body.
piercingrulepiercing_line()
piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open).
tweezerruletweezer_bottom()
tweezer bottom candle: Red then green, with lows within 0.1% of each other.
below_50English → ruleIs the stock below its 50-day moving average?

Answers

QuestionAnswerReading
harami
harami bull candle: A small green body inside yesterday's red body.
0.1092false
piercing
piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open).
0.1092false
tweezer
tweezer bottom candle: Red then green, with lows within 0.1% of each other.
0.1092false
below_50
Is the stock below its 50-day moving average
compiled to C < sma(C, 50)
0.9381true

What it means

For BA on the session of 2026-10-30: True now: Is the stock below its 50-day moving average. Not true: harami bull candle: A small green body inside yesterday's red body.; piercing line candle: After a red day, opens below its close and closes above the middle of its body (but under its open).; tweezer bottom candle: Red then green, with lows within 0.1% of each other..

The lesson shows each pattern's yes or no with its rule, and the trend context, so learners see why a reversal needs a prior decline.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "BA"
  },
  "questions": {
    "harami": {
      "type": "yes_no",
      "ask": "harami_bull()"
    },
    "piercing": {
      "type": "yes_no",
      "ask": "piercing_line()"
    },
    "tweezer": {
      "type": "yes_no",
      "ask": "tweezer_bottom()"
    },
    "below_50": {
      "type": "yes_no",
      "instructions": "Is the stock below its 50-day moving average?"
    }
  }
}
Response JSON (BA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "harami": {
      "yes_no": 0.1092,
      "rule": "harami_bull()",
      "basis": "rule"
    },
    "piercing": {
      "yes_no": 0.1092,
      "rule": "piercing_line()",
      "basis": "rule"
    },
    "tweezer": {
      "yes_no": 0.1092,
      "rule": "tweezer_bottom()",
      "basis": "rule"
    },
    "below_50": {
      "yes_no": 0.9381,
      "rule": "C < sma(C, 50)",
      "basis": "comparison"
    }
  },
  "context": {
    "symbol": "BA",
    "as_of": "2026-10-30"
  }
}

harami_bull piercing_line sma tweezer_bottom

Fintech app builder · example 20

Income nudge: tell holders of O when the next payout is close

Remind users who hold a monthly payer that the ex-date is near, with the yield and recent raise record.

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

State

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

Questions

monthlyEnglish → ruleDoes the stock pay a monthly dividend?
ex_soonruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
yieldEnglish → ruleIs the dividend yield above 3%?
raisedEnglish → ruleDid the stock raise its dividend last time?

Answers

QuestionAnswerReading
monthly
Does the stock pay a monthly dividend
compiled to div_count_ttm >= 11
0.9317true
ex_soon
Goes ex-dividend within 30 days
0.0537false
yield
Is the dividend yield above 3%
compiled to div_yield_ttm > 3
0.9463true
raised
Did the stock raise its dividend last time
compiled to raised_last > 0.5
0.1409false

Actions

Rules on the answers decide what to send.

ex_soon >= 0.6→Webhookpush-gateway
What each action would send 0 of 1 fired · dry run, nothing sent
remindrule false: skipped

What it means

For O on the session of 2026-10-30: True now: Does the stock pay a monthly dividend; Is the dividend yield above 3%. Not true: Goes ex-dividend within 30 days; Did the stock raise its dividend last time. No action fired: every rule was false.

The reminder only fires on a declared ex-date; if none is declared yet, the app stays quiet rather than guessing.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "O"
  },
  "questions": {
    "monthly": {
      "type": "yes_no",
      "instructions": "Does the stock pay a monthly dividend?"
    },
    "ex_soon": {
      "type": "yes_no",
      "ask": "days_to_ex_div <= 30"
    },
    "yield": {
      "type": "yes_no",
      "instructions": "Is the dividend yield above 3%?"
    },
    "raised": {
      "type": "yes_no",
      "instructions": "Did the stock raise its dividend last time?"
    }
  },
  "actions": [
    {
      "id": "remind",
      "when": "ex_soon >= 0.6",
      "do": "webhook",
      "connection": "push-gateway",
      "body": {
        "topic": "holders_{{symbol}}",
        "title": "{{symbol}} goes ex-dividend soon",
        "data": {
          "monthly_payer": "{{monthly}}",
          "yield_over_3": "{{yield}}",
          "as_of": "{{as_of}}"
        }
      }
    }
  ],
  "dry_run": true
}
Response JSON (O, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "monthly": {
      "yes_no": 0.9317,
      "rule": "div_count_ttm >= 11",
      "basis": "pattern"
    },
    "ex_soon": {
      "yes_no": 0.0537,
      "rule": "days_to_ex_div <= 30",
      "basis": "rule"
    },
    "yield": {
      "yes_no": 0.9463,
      "rule": "div_yield_ttm > 3",
      "basis": "pattern"
    },
    "raised": {
      "yes_no": 0.1409,
      "rule": "raised_last > 0.5",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "O",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "remind",
      "fired": false,
      "status": "skipped"
    }
  ]
}

days_to_ex_div div_count_ttm div_yield_ttm raised_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, Robo-advisor, Broker app, 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.