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

Fintech app builder · example 1

An in-app insight card for AAPL: trend, earnings and next week

Render a small card in a banking app's investing tab with three plain facts and one forecast, posted to the card service.

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

trendEnglish → ruleIs the stock above its 200-day moving average?
earn_soonEnglish → ruleIs earnings in the next 14 days?
beatEnglish → ruleDid the stock beat EPS estimates last quarter?
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
trend
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.9463true
earn_soon
Is earnings in the next 14 days
compiled to days_to_earnings <= 14
0.9463true
beat
Did the stock beat EPS estimates last quarter
compiled to beat_eps_last > 0.5
0.8591true
up_week
Higher in a week
0.5959% · close to even

Actions

Rules on the answers decide what to send.

trend >= 0→Webhookcard-service
What each action would send 1 of 1 fired · dry run, nothing sent
cardwould send (dry run)Webhook → card-service
{
  "card": "stock_snapshot",
  "symbol": "AAPL",
  "as_of": "2026-10-30",
  "in_uptrend": 0.9463,
  "earnings_within_14d": 0.9463,
  "beat_last_quarter": 0.8591,
  "p_higher_in_week": 0.59
}

What it means

For AAPL on the session of 2026-10-30: True now: Is the stock above its 200-day moving average; Is earnings in the next 14 days; Did the stock beat EPS estimates last quarter. Forecasts: Higher in a week 59%. Fired: card (Webhook → card-service).

The card service gets typed probabilities and decides the wording; the app shows facts as yes or no and the forecast as odds.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "earn_soon": {
      "type": "yes_no",
      "instructions": "Is earnings in the next 14 days?"
    },
    "beat": {
      "type": "yes_no",
      "instructions": "Did the stock beat EPS estimates last quarter?"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  },
  "actions": [
    {
      "id": "card",
      "when": "trend >= 0",
      "do": "webhook",
      "connection": "card-service",
      "body": {
        "card": "stock_snapshot",
        "symbol": "{{symbol}}",
        "as_of": "{{as_of}}",
        "in_uptrend": "{{trend}}",
        "earnings_within_14d": "{{earn_soon}}",
        "beat_last_quarter": "{{beat}}",
        "p_higher_in_week": "{{up_week}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.9463,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "earn_soon": {
      "yes_no": 0.9463,
      "rule": "days_to_earnings <= 14",
      "basis": "pattern"
    },
    "beat": {
      "yes_no": 0.8591,
      "rule": "beat_eps_last > 0.5",
      "basis": "pattern"
    },
    "up_week": {
      "yes_no": 0.59
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "card",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "card-service",
      "preview": {
        "body": {
          "card": "stock_snapshot",
          "symbol": "AAPL",
          "as_of": "2026-10-30",
          "in_uptrend": 0.9463,
          "earnings_within_14d": 0.9463,
          "beat_last_quarter": 0.8591,
          "p_higher_in_week": 0.59
        }
      }
    }
  ]
}

beat_eps_last days_to_earnings sma

Fintech app builder · example 2

Push notification when a watched stock dips in an uptrend (AMZN)

Send a push to users who follow AMZN only when it pulls back inside a long uptrend, not on every red day.

ora-fin-0.1.1AMZN3 questions1 action
  1. StateAMZN
  2. Questions3 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

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

Questions

dipruleC > sma(C, 200) and rsi(C, 14) < 40
Pullback in an uptrend: above the 200-day, RSI under 40
down3English → ruleHas the stock closed lower 3 days in a row?
bounce_oddsforecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
dip
Pullback in an uptrend: above the 200-day, RSI under 40
0.3073false
down3
Has the stock closed lower 3 days in a row
compiled to (C < C[-1]) and (C[-1] < C[-2]) and (C[-2] < C[-3])
0.3106false
bounce_odds
A 5% rally within a month
0.53654% · close to even

Actions

Rules on the answers decide what to send.

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

What it means

For AMZN on the session of 2026-10-30: Not true: Pullback in an uptrend: above the 200-day, RSI under 40; Has the stock closed lower 3 days in a row. Forecasts: A 5% rally within a month 54%. No action fired: every rule was false.

Most days nothing is pushed; the rule gate keeps notification volume low enough that users do not mute it.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AMZN"
  },
  "questions": {
    "dip": {
      "type": "yes_no",
      "ask": "C > sma(C, 200) and rsi(C, 14) < 40"
    },
    "down3": {
      "type": "yes_no",
      "instructions": "Has the stock closed lower 3 days in a row?"
    },
    "bounce_odds": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "push",
      "when": "dip >= 0.6",
      "do": "webhook",
      "connection": "push-gateway",
      "body": {
        "topic": "follow_{{symbol}}",
        "title": "{{symbol}} pulled back",
        "body": "{{symbol}} dipped while still above its 200-day average.",
        "data": {
          "symbol": "{{symbol}}",
          "p_rally5": "{{bounce_odds}}",
          "as_of": "{{as_of}}"
        }
      }
    }
  ],
  "dry_run": true
}
Response JSON (AMZN, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "dip": {
      "yes_no": 0.3073,
      "rule": "C > sma(C, 200) and rsi(C, 14) < 40",
      "basis": "rule"
    },
    "down3": {
      "yes_no": 0.3106,
      "rule": "(C < C[-1]) and (C[-1] < C[-2]) and (C[-2] < C[-3])",
      "basis": "pattern"
    },
    "bounce_odds": {
      "yes_no": 0.536
    }
  },
  "context": {
    "symbol": "AMZN",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "push",
      "fired": false,
      "status": "skipped"
    }
  ]
}

offset rsi sma

Fintech app builder · example 3

Earnings badges for a watchlist screen: NVDA, AAPL, MSFT, AMZN, NFLX

Show an 'earnings soon' badge and a 'beat last time' badge next to each symbol in the app's watchlist.

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

State

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

Questions

soonruledays_to_earnings <= 10
Reports earnings within 10 days
beat_bothrulebeat_eps_last > 0.5 and beat_revenue_last > 0.5
Beat on EPS and revenue last quarter
streakrulebeat_streak >= 4
Beat four quarters in a row
bmoEnglish → ruleDoes the stock report before the market opens next time?

Answers

Symbolsoonrulebeat_bothrulestreakrulebmorule
NVDA0.05630.85910.94630.1409
AAPL0.93920.85910.94630.1409
MSFT0.05370.85910.94630.1409
AMZN0.05370.14090.05370.1409
NFLX0.05370.85910.550.1409

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

What it means

Session of 2026-10-30, 5 symbols: Reports earnings within 10 days: true for AAPL of 5. Beat on EPS and revenue last quarter: true for NVDA, AAPL, MSFT, NFLX of 5. Beat four quarters in a row: true for NVDA, AAPL, MSFT of 5. Does the stock report before the market opens next time: true for none of 5.

Badges map directly to fact rules, so they are either shown or not; no probability needs to reach the user.

Request JSON (NVDA; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "soon": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10"
    },
    "beat_both": {
      "type": "yes_no",
      "ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
    },
    "streak": {
      "type": "yes_no",
      "ask": "beat_streak >= 4"
    },
    "bmo": {
      "type": "yes_no",
      "instructions": "Does the stock report before the market opens next time?"
    }
  }
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "soon": {
      "yes_no": 0.0563,
      "rule": "days_to_earnings <= 10",
      "basis": "rule"
    },
    "beat_both": {
      "yes_no": 0.8591,
      "rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
      "basis": "rule"
    },
    "streak": {
      "yes_no": 0.9463,
      "rule": "beat_streak >= 4",
      "basis": "rule"
    },
    "bmo": {
      "yes_no": 0.1409,
      "rule": "next_report_bmo > 0.5",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  }
}

beat_eps_last beat_revenue_last beat_streak days_to_earnings next_report_bmo

Fintech app builder · example 4

A dividend calendar widget for income stocks (KO, PG, PEP, JNJ)

Fill a widget that lists upcoming ex-dates, yields and raise history for the user's income holdings.

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

State

{"symbol":"KO"} then PG, PEP, JNJ, one request each. The server fills in the latest completed session.

Questions

ex_soonruledays_to_ex_div <= 30
Goes ex-dividend within 30 days
yield3rulediv_yield_ttm > 3
Yield above 3%
raisedruleraised_last > 0.5
Raised its last dividend
growerruleyears_of_growth >= 10
Ten years of dividend growth
next_upEnglish → ruleIs the next declared dividend larger than the last one?

Answers

Symbolex_soonruleyield3ruleraisedrulegrowerrulenext_uprule
KO0.20490.05370.14090.94630.45
PG0.05370.20910.14090.94630.50
PEP0.05370.94630.14090.94630.50
JNJ0.91870.06480.14090.94630.45

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

What it means

Session of 2026-10-30, 4 symbols: Goes ex-dividend within 30 days: true for JNJ of 4. Yield above 3%: true for PEP of 4. Raised its last dividend: true for none of 4. Ten years of dividend growth: true for KO, PG, PEP, JNJ of 4.

Ex-dates show only once declared; an undeclared next dividend answers no for ex-soon and not known for the next amount.

Request JSON (KO; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "KO"
  },
  "questions": {
    "ex_soon": {
      "type": "yes_no",
      "ask": "days_to_ex_div <= 30"
    },
    "yield3": {
      "type": "yes_no",
      "ask": "div_yield_ttm > 3"
    },
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "grower": {
      "type": "yes_no",
      "ask": "years_of_growth >= 10"
    },
    "next_up": {
      "type": "yes_no",
      "instructions": "Is the next declared dividend larger than the last one?"
    }
  }
}
Response JSON (KO, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "ex_soon": {
      "yes_no": 0.2049,
      "rule": "days_to_ex_div <= 30",
      "basis": "rule"
    },
    "yield3": {
      "yes_no": 0.0537,
      "rule": "div_yield_ttm > 3",
      "basis": "rule"
    },
    "raised": {
      "yes_no": 0.1409,
      "rule": "raised_last > 0.5",
      "basis": "rule"
    },
    "grower": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 10",
      "basis": "rule"
    },
    "next_up": {
      "yes_no": 0.45,
      "rule": "next_div_amount > last_div_amount",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "KO",
    "as_of": "2026-10-30"
  }
}

days_to_ex_div div_yield_ttm last_div_amount next_div_amount raised_last years_of_growth

Fintech app builder · example 5

Explain TSLA's volatility in a user-facing tooltip

Tell users in plain words whether today was a big day for this stock and whether bigger swings are likely.

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

State

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

Questions

big_dayEnglish → ruleWas today's move bigger than 1.5 ATR?
atr3English → ruleIs the 14-day ATR more than 3% of the price?
hv40English → ruleIs 20-day historical volatility above 40%?
vol_riseforecastWill volatility rise over the next 5 days?
Volatility rising over 5 days
big_move5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

QuestionAnswerReading
big_day
Was today's move bigger than 1.5 ATR
compiled to abs(C - C[-1]) > 1.5 * atr(14)
0.054false
atr3
Is the 14-day ATR more than 3% of the price
compiled to atr(14) / C > 0.03
0.848true
hv40
Is 20-day historical volatility above 40%
compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4
0.3248false
vol_rise
Volatility rising over 5 days
0.3838% · unlikely
big_move5
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: Is the 14-day ATR more than 3% of the price. Not true: Was today's move bigger than 1.5 ATR; Is 20-day historical volatility above 40%. Forecasts: Volatility rising over 5 days 38%; A big move either way in 5 days 25%.

The tooltip quotes the yes/no facts for today and the odds for the coming week, so users see the difference between what happened and what might.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "TSLA"
  },
  "questions": {
    "big_day": {
      "type": "yes_no",
      "instructions": "Was today's move bigger than 1.5 ATR?"
    },
    "atr3": {
      "type": "yes_no",
      "instructions": "Is the 14-day ATR more than 3% of the price?"
    },
    "hv40": {
      "type": "yes_no",
      "instructions": "Is 20-day historical volatility above 40%?"
    },
    "vol_rise": {
      "type": "yes_no",
      "instructions": "Will volatility rise over the next 5 days?"
    },
    "big_move5": {
      "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": {
    "big_day": {
      "yes_no": 0.054,
      "rule": "abs(C - C[-1]) > 1.5 * atr(14)",
      "basis": "pattern"
    },
    "atr3": {
      "yes_no": 0.848,
      "rule": "atr(14) / C > 0.03",
      "basis": "pattern"
    },
    "hv40": {
      "yes_no": 0.3248,
      "rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) > 0.4",
      "basis": "pattern"
    },
    "vol_rise": {
      "yes_no": 0.38
    },
    "big_move5": {
      "yes_no": 0.248
    }
  },
  "context": {
    "symbol": "TSLA",
    "as_of": "2026-10-30"
  }
}

abs atr log offset sqrt std

Fintech app builder · example 6

Goal-based savings app: pause auto-invest into VTI in a sharp drawdown?

A savings app asks whether to show a 'stay the course' message when the fund it auto-invests in drops sharply.

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

State

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

Questions

down_monthEnglish → ruleIs the stock down more than 5% over the last month?
bearEnglish → ruleIs the stock in bear-market territory, more than 20% below its 52-week high?
below_200English → ruleIs the stock below 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

QuestionAnswerReading
down_month
Is the stock down more than 5% over the last month
compiled to C / C[-21] - 1 < -0.05
0.0662false
bear
Is the stock in bear-market territory, more than 20% below its 52-week high
compiled to C < 0.8 * max(H, 252)
0.0537false
below_200
Is the stock below its 200-day moving average
compiled to C < sma(C, 200)
0.0585false
drop5
A 5% drawdown within a month
0.18719% · unlikely

Actions

Rules on the answers decide what to send.

down_month >= 0.6 or below_200 >= 0.6→Webhookin-app-messages
else→Webhookin-app-messages
What each action would send 1 of 2 fired · dry run, nothing sent
reassurerule false: skipped
nonewould send (dry run)Webhook → in-app-messages
{
  "segment": "autoinvest_VTI",
  "template": "none",
  "as_of": "2026-10-30"
}

What it means

For VTI on the session of 2026-10-30: Not true: Is the stock down more than 5% over the last month; Is the stock in bear-market territory, more than 20% below its 52-week high; Is the stock below its 200-day moving average. Forecasts: A 5% drawdown within a month 19%. Fired: none (Webhook → in-app-messages).

The app never stops a user's plan on its own; it chooses which message to show, and an explicit none keeps the message queue predictable.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "VTI"
  },
  "questions": {
    "down_month": {
      "type": "yes_no",
      "instructions": "Is the stock down more than 5% over the last month?"
    },
    "bear": {
      "type": "yes_no",
      "instructions": "Is the stock in bear-market territory, more than 20% below its 52-week high?"
    },
    "below_200": {
      "type": "yes_no",
      "instructions": "Is the stock below 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": "reassure",
      "when": "down_month >= 0.6 or below_200 >= 0.6",
      "do": "webhook",
      "connection": "in-app-messages",
      "body": {
        "segment": "autoinvest_{{symbol}}",
        "template": "stay_the_course",
        "fund": "{{symbol}}",
        "as_of": "{{as_of}}"
      }
    },
    {
      "id": "none",
      "when": "else",
      "do": "webhook",
      "connection": "in-app-messages",
      "body": {
        "segment": "autoinvest_{{symbol}}",
        "template": "none",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (VTI, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "down_month": {
      "yes_no": 0.0662,
      "rule": "C / C[-21] - 1 < -0.05",
      "basis": "pattern"
    },
    "bear": {
      "yes_no": 0.0537,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "pattern"
    },
    "below_200": {
      "yes_no": 0.0585,
      "rule": "C < sma(C, 200)",
      "basis": "comparison"
    },
    "drop5": {
      "yes_no": 0.187
    }
  },
  "context": {
    "symbol": "VTI",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "reassure",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "none",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "in-app-messages",
      "preview": {
        "body": {
          "segment": "autoinvest_VTI",
          "template": "none",
          "as_of": "2026-10-30"
        }
      }
    }
  ]
}

max offset sma

Fintech app builder · example 7

Candle of the day: teach users one pattern on SPY

Show an educational card naming today's candlestick on SPY, if any pattern printed.

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

State

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

Questions

dojiruledoji()
doji candle: Body at most 10% of the day's range.
gravestonerulegravestone_doji()
gravestone doji candle: Doji with a long upper wick and almost no lower wick.
dragonflyruledragonfly_doji()
dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.
harami_bearruleharami_bear()
harami bear candle: A small red body inside yesterday's green body.
tweezer_topruletweezer_top()
tweezer top candle: Green then red, with highs within 0.1%.

Answers

QuestionAnswerReading
doji
doji candle: Body at most 10% of the day's range.
0.0579false
gravestone
gravestone doji candle: Doji with a long upper wick and almost no lower wick.
0.0537false
dragonfly
dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.
0.0579false
harami_bear
harami bear candle: A small red body inside yesterday's green body.
0.0597false
tweezer_top
tweezer top candle: Green then red, with highs within 0.1%.
0.0537false

What it means

For SPY on the session of 2026-10-30: Not true: doji candle: Body at most 10% of the day's range.; gravestone doji candle: Doji with a long upper wick and almost no lower wick.; dragonfly doji candle: Doji with a long lower wick (60%+ of the range) and almost no upper wick.; harami bear candle: A small red body inside yesterday's green body.; tweezer top candle: Green then red, with highs within 0.1%..

Only a pattern that is true gets a card; on most days none prints, and the app falls back to a generic lesson.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "doji": {
      "type": "yes_no",
      "ask": "doji()"
    },
    "gravestone": {
      "type": "yes_no",
      "ask": "gravestone_doji()"
    },
    "dragonfly": {
      "type": "yes_no",
      "ask": "dragonfly_doji()"
    },
    "harami_bear": {
      "type": "yes_no",
      "ask": "harami_bear()"
    },
    "tweezer_top": {
      "type": "yes_no",
      "ask": "tweezer_top()"
    }
  }
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "doji": {
      "yes_no": 0.0579,
      "rule": "doji()",
      "basis": "rule"
    },
    "gravestone": {
      "yes_no": 0.0537,
      "rule": "gravestone_doji()",
      "basis": "rule"
    },
    "dragonfly": {
      "yes_no": 0.0579,
      "rule": "dragonfly_doji()",
      "basis": "rule"
    },
    "harami_bear": {
      "yes_no": 0.0597,
      "rule": "harami_bear()",
      "basis": "rule"
    },
    "tweezer_top": {
      "yes_no": 0.0537,
      "rule": "tweezer_top()",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  }
}

doji dragonfly_doji gravestone_doji harami_bear tweezer_top

Fintech app builder · example 8

Weekly portfolio digest email for app users holding QQQ and SPY

Every Friday evening, email a short digest with trend and next-week odds for the two funds most users hold.

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

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
momentumruleC > C[-63]
Higher than three months ago
up_weekforecastWill the stock be higher in a week?
Higher in a week
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symboltrendrulemomentumruleup_weekforecastdrop5forecastFired
QQQ0.06530.27860.5610.443digest
SPY0.11280.38090.5980.203digest

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→Emailuser-digests
QQQ 1 of 1 fired · dry run, nothing sent
digestwould send (dry run)Email → user-digests
{
  "subject": "QQQ this week (2026-10-30)",
  "text": "QQQ: above its 50-day 7%, higher than three months ago 28%. Odds it is higher in a week 56%; a 5% dip within a month 44%. Information, not advice."
}
SPY 1 of 1 fired · dry run, nothing sent
digestwould send (dry run)Email → user-digests
{
  "subject": "SPY this week (2026-10-30)",
  "text": "SPY: above its 50-day 11%, higher than three months ago 38%. Odds it is higher in a week 60%; a 5% dip within a month 20%. Information, not advice."
}

What it means

Session of 2026-10-30, 2 symbols: Above the 50-day average: true for none of 2. Higher than three months ago: true for none of 2. Highest odds for “Higher in a week”: SPY at 60%. digest fired for QQQ, SPY.

The digest always goes out and always labels the forecast as odds; rules and forecasts are never mixed in one sentence.

As a scheduled workflow (Fri at 17: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 portfolio digest email for app users holding QQQ and SPY",
  "symbols": "QQQ SPY",
  "days": [
    5
  ],
  "at_time": "17:00",
  "model": "ora-fin-0.1.1",
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "momentum": {
      "type": "yes_no",
      "ask": "C > C[-63]"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "digest",
      "when": "trend >= 0",
      "do": "email",
      "connection": "user-digests",
      "subject": "{{symbol}} this week ({{as_of}})",
      "message": "{{symbol}}: above its 50-day {{trend|pct}}, higher than three months ago {{momentum|pct}}. Odds it is higher in a week {{up_week|pct}}; a 5% dip within a month {{drop5|pct}}. Information, not advice."
    }
  ]
}
Request JSON (QQQ; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "QQQ"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "momentum": {
      "type": "yes_no",
      "ask": "C > C[-63]"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "digest",
      "when": "trend >= 0",
      "do": "email",
      "connection": "user-digests",
      "subject": "{{symbol}} this week ({{as_of}})",
      "message": "{{symbol}}: above its 50-day {{trend|pct}}, higher than three months ago {{momentum|pct}}. Odds it is higher in a week {{up_week|pct}}; a 5% dip within a month {{drop5|pct}}. Information, not advice."
    }
  ],
  "dry_run": true
}
Response JSON (QQQ, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.0653,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "momentum": {
      "yes_no": 0.2786,
      "rule": "C > C[-63]",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.561
    },
    "drop5": {
      "yes_no": 0.443
    }
  },
  "context": {
    "symbol": "QQQ",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "digest",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "user-digests",
      "preview": {
        "subject": "QQQ this week (2026-10-30)",
        "text": "QQQ: above its 50-day 7%, higher than three months ago 28%. Odds it is higher in a week 56%; a 5% dip within a month 44%. Information, not advice."
      }
    }
  ]
}

offset sma

Fintech app builder · example 9

A 'new 52-week high' badge for COST

Show a celebratory badge when a holding makes a new 52-week high on good volume.

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

new_highruleH > highest(H, 252)
New 52-week high
close_highEnglish → ruleDid the stock make a new 52-week closing high?
volumeruleV > avg(V, 20)
Volume above its 20-day average
pullback_oddsforecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
new_high
New 52-week high
0.0669false
close_high
Did the stock make a new 52-week closing high
compiled to C > highest(C, 252)
0.0614false
volume
Volume above its 20-day average
0.9297true
pullback_odds
A 5% drawdown within a month
0.31932% · unlikely

Actions

Rules on the answers decide what to send.

new_high >= 0.6→Webhookbadge-service
What each action would send 0 of 1 fired · dry run, nothing sent
badgerule false: skipped

What it means

For COST on the session of 2026-10-30: True now: Volume above its 20-day average. Not true: New 52-week high; Did the stock make a new 52-week closing high. Forecasts: A 5% drawdown within a month 32%. No action fired: every rule was false.

The badge depends only on the fact rule; the volume flag lets the app add 'on strong volume' when it is true.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "COST"
  },
  "questions": {
    "new_high": {
      "type": "yes_no",
      "ask": "H > highest(H, 252)"
    },
    "close_high": {
      "type": "yes_no",
      "instructions": "Did the stock make a new 52-week closing high?"
    },
    "volume": {
      "type": "yes_no",
      "ask": "V > avg(V, 20)"
    },
    "pullback_odds": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "badge",
      "when": "new_high >= 0.6",
      "do": "webhook",
      "connection": "badge-service",
      "body": {
        "badge": "new_52w_high",
        "symbol": "{{symbol}}",
        "closed_at_high": "{{close_high}}",
        "volume_confirmed": "{{volume}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (COST, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "new_high": {
      "yes_no": 0.0669,
      "rule": "H > highest(H, 252)",
      "basis": "rule"
    },
    "close_high": {
      "yes_no": 0.0614,
      "rule": "C > highest(C, 252)",
      "basis": "pattern"
    },
    "volume": {
      "yes_no": 0.9297,
      "rule": "V > avg(V, 20)",
      "basis": "rule"
    },
    "pullback_odds": {
      "yes_no": 0.319
    }
  },
  "context": {
    "symbol": "COST",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "badge",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg highest

Fintech app builder · example 10

Round-up investing: which fund gets this week's spare change?

A round-up app picks between a stock fund and a bond fund based on trend and drawdown, then posts the allocation.

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

State

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

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
ddruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
sma_uprulesma(C, 200) > ref(sma(C, 200), -20)
The 200-day average is rising
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symboltrendruleddrulesma_upruledrop5forecast
VOO0.94630.05370.94630.194
BND0.20130.05370.06740.007

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: Is the stock above its 200-day moving average: true for VOO of 2. More than 20% off the 52-week high: true for none of 2. The 200-day average is rising: true for VOO of 2. Highest odds for “A 5% drawdown within a month”: VOO at 19%.

Both funds answer the same questions; the app's own policy, not Ora, decides the split from these answers.

Request JSON (VOO; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "VOO"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "dd": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "sma_up": {
      "type": "yes_no",
      "ask": "sma(C, 200) > ref(sma(C, 200), -20)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (VOO, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.9463,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "dd": {
      "yes_no": 0.0537,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "sma_up": {
      "yes_no": 0.9463,
      "rule": "sma(C, 200) > ref(sma(C, 200), -20)",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.194
    }
  },
  "context": {
    "symbol": "VOO",
    "as_of": "2026-10-30"
  }
}

max ref 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, 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.