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

Robo-advisor: 20 ways to use Ora

Automated portfolios: rebalancing triggers, tax-loss harvesting candidates and risk dials. Each example is a complete, runnable request with the real answers it returned (43 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 (25)

sma 16offset 9max 7atr 6ref 5log 4sqrt 4std 4pays_dividend 3div_yield_ttm 2lowest 2macd 1macdsignal 1zscore 1div_count_ttm 1roc 1min 1adx 1diminus 1diplus 1avg 1bblower 1cci 1ema 1rsi 1

Examples 11–20 of 20 · page 2 of 2

Robo-advisor · example 11

Emerging markets guardrail: EEM and IEMG

Limit new purchases into emerging markets when volatility is elevated and the trend is down.

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":"EEM"} then IEMG, one request each. The server fills in the latest completed session.

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
adxruleadx(14) > 25 and diminus(14) > diplus(14)
a strong trend (ADX above 25) with sellers in control
atrruleatr(14) > 1.2 * ref(atr(14), -10)
ATR up 20% in two weeks
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

Symboltrendruleadxruleatrruledrop5forecastFired
EEM0.14490.86390.13070.422throttle
IEMG0.13430.86850.15220.414throttle

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.

adx >= 0.6 and trend < 0.4→Webhookorder-throttle
EEM 1 of 1 fired · dry run, nothing sent
throttlewould send (dry run)Webhook → order-throttle
{
  "sleeve": "EEM",
  "max_buy_fraction": 0.5,
  "reason": "strong_downtrend",
  "p_downtrend": 0.8639,
  "as_of": "2026-10-30"
}
IEMG 1 of 1 fired · dry run, nothing sent
throttlewould send (dry run)Webhook → order-throttle
{
  "sleeve": "IEMG",
  "max_buy_fraction": 0.5,
  "reason": "strong_downtrend",
  "p_downtrend": 0.8685,
  "as_of": "2026-10-30"
}

What it means

Session of 2026-10-30, 2 symbols: Is the stock above its 200-day moving average: true for none of 2. a strong trend (ADX above 25) with sellers in control: true for EEM, IEMG of 2. ATR up 20% in two weeks: true for none of 2. Highest odds for “A 5% drawdown within a month”: EEM at 42%. throttle fired for EEM, IEMG.

Throttling halves new buys rather than stopping them, so the model keeps averaging in while the downtrend lasts.

Request JSON (EEM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "EEM"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "adx": {
      "type": "yes_no",
      "ask": "adx(14) > 25 and diminus(14) > diplus(14)"
    },
    "atr": {
      "type": "yes_no",
      "ask": "atr(14) > 1.2 * ref(atr(14), -10)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "throttle",
      "when": "adx >= 0.6 and trend < 0.4",
      "do": "webhook",
      "connection": "order-throttle",
      "body": {
        "sleeve": "{{symbol}}",
        "max_buy_fraction": 0.5,
        "reason": "strong_downtrend",
        "p_downtrend": "{{adx}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (EEM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.1449,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "adx": {
      "yes_no": 0.8639,
      "rule": "adx(14) > 25 and diminus(14) > diplus(14)",
      "basis": "rule"
    },
    "atr": {
      "yes_no": 0.1307,
      "rule": "atr(14) > 1.2 * ref(atr(14), -10)",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.422
    }
  },
  "context": {
    "symbol": "EEM",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "throttle",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "order-throttle",
      "preview": {
        "body": {
          "sleeve": "EEM",
          "max_buy_fraction": 0.5,
          "reason": "strong_downtrend",
          "p_downtrend": 0.8639,
          "as_of": "2026-10-30"
        }
      }
    }
  ]
}

adx atr diminus diplus ref sma

Robo-advisor · example 12

Credit watch for the high-yield sleeve: HYG and JNK

Spot stress in high-yield bond funds early: breakdowns, volume spikes and rising volatility.

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":"HYG"} then JNK, one request each. The server fills in the latest completed session.

Questions

breakdownruleC < lowest(L, 20)
Closed under the 20-day low
volruleV > 2 * ref(avg(V, 20), -1)
Volume more than twice the previous 20-day average
stressruleC < bblower(C, 20, 2.5)
close under a 2.5 standard-deviation lower band
vol_riseforecastWill volatility rise over the next 5 days?
Volatility rising over 5 days

Answers

Symbolbreakdownrulevolrulestressrulevol_riseforecastFired
HYG0.08110.09110.06070.383none
JNK0.08130.13520.06180.406none

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.

breakdown >= 0.6 or stress >= 0.6→Slackinvestment-committee
HYG 0 of 1 fired · dry run, nothing sent
JNK 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 2 symbols: Closed under the 20-day low: true for none of 2. Volume more than twice the previous 20-day average: true for none of 2. close under a 2.5 standard-deviation lower band: true for none of 2. Highest odds for “Volatility rising over 5 days”: JNK at 41%. credit_flag fired for none.

Credit funds move slowly, so a breakdown on volume is an early signal for the committee, not an automatic sale.

Request JSON (HYG; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "HYG"
  },
  "questions": {
    "breakdown": {
      "type": "yes_no",
      "ask": "C < lowest(L, 20)"
    },
    "vol": {
      "type": "yes_no",
      "ask": "V > 2 * ref(avg(V, 20), -1)"
    },
    "stress": {
      "type": "yes_no",
      "ask": "C < bblower(C, 20, 2.5)"
    },
    "vol_rise": {
      "type": "yes_no",
      "instructions": "Will volatility rise over the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "credit_flag",
      "when": "breakdown >= 0.6 or stress >= 0.6",
      "do": "slack",
      "connection": "investment-committee",
      "message": "{{symbol}} ({{as_of}}): high-yield stress. 20-day breakdown {{breakdown|pct}}, below the 2.5-sigma band {{stress|pct}}, volume spike {{vol|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (HYG, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "breakdown": {
      "yes_no": 0.0811,
      "rule": "C < lowest(L, 20)",
      "basis": "rule"
    },
    "vol": {
      "yes_no": 0.0911,
      "rule": "V > 2 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "stress": {
      "yes_no": 0.0607,
      "rule": "C < bblower(C, 20, 2.5)",
      "basis": "rule"
    },
    "vol_rise": {
      "yes_no": 0.383
    }
  },
  "context": {
    "symbol": "HYG",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "credit_flag",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg bblower lowest ref

Robo-advisor · example 13

Gold hedge sleeve: is GLD trending and calm enough to add?

Add to the gold hedge only when the trend is intact and the fund is not stretched.

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

State

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

Questions

trendruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
stretchedruleC > sma(C, 20) + 2 * atr(14)
Stretched: more than 2 ATR above the 20-day
ccirulecci(20) > 200
CCI above 200: very extended
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
trend
Stacked averages: close > 20 EMA > 50 > 200
0.0537false
stretched
Stretched: more than 2 ATR above the 20-day
0.063false
cci
CCI above 200: very extended
0.0537false
drop5
A 5% drawdown within a month
0.43544% · close to even

What it means

For GLD on the session of 2026-10-30: Not true: Stacked averages: close > 20 EMA > 50 > 200; Stretched: more than 2 ATR above the 20-day; CCI above 200: very extended. Forecasts: A 5% drawdown within a month 44%.

An intact but stretched trend waits for a pullback; the hedge is added on calm days so it is not bought at a spike.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "GLD"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
    },
    "stretched": {
      "type": "yes_no",
      "ask": "C > sma(C, 20) + 2 * atr(14)"
    },
    "cci": {
      "type": "yes_no",
      "ask": "cci(20) > 200"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (GLD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.0537,
      "rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "stretched": {
      "yes_no": 0.063,
      "rule": "C > sma(C, 20) + 2 * atr(14)",
      "basis": "rule"
    },
    "cci": {
      "yes_no": 0.0537,
      "rule": "cci(20) > 200",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.435
    }
  },
  "context": {
    "symbol": "GLD",
    "as_of": "2026-10-30"
  }
}

atr cci ema sma

Robo-advisor · example 14

First-purchase timing for new clients: spread the buy if SPY is stretched

When a new client funds an account, decide whether to invest at once or in three tranches based on how stretched the market is.

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

State

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

Questions

stretchedEnglish → ruleIs price extended more than 2 ATR above its 20-day average?
rsi70rulersi(C, 14) > 70
RSI above 70
ext200English → ruleIs the stock more than 10% 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

QuestionAnswerReading
stretched
Is price extended more than 2 ATR above its 20-day average
compiled to C - sma(C, 20) > 2 * atr(14)
0.0537false
rsi70
RSI above 70
0.0537false
ext200
Is the stock more than 10% above its 200-day moving average
compiled to C > sma(C, 200) * 1.1
0.0537false
drop5
A 5% drawdown within a month
0.20320% · unlikely

Actions

Rules on the answers decide what to send.

stretched >= 0.6 or rsi70 >= 0.6→Webhookonboarding
else→Webhookonboarding
What each action would send 1 of 2 fired · dry run, nothing sent
tranchesrule false: skipped
lumpwould send (dry run)Webhook → onboarding
{
  "plan": "lump_sum",
  "as_of": "2026-10-30"
}

What it means

For SPY on the session of 2026-10-30: Not true: Is price extended more than 2 ATR above its 20-day average; RSI above 70; Is the stock more than 10% above its 200-day moving average. Forecasts: A 5% drawdown within a month 20%. Fired: lump (Webhook → onboarding).

Either plan ends fully invested; the rule only chooses how fast, which keeps the choice simple to explain.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "stretched": {
      "type": "yes_no",
      "instructions": "Is price extended more than 2 ATR above its 20-day average?"
    },
    "rsi70": {
      "type": "yes_no",
      "ask": "rsi(C, 14) > 70"
    },
    "ext200": {
      "type": "yes_no",
      "instructions": "Is the stock more than 10% 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": "tranches",
      "when": "stretched >= 0.6 or rsi70 >= 0.6",
      "do": "webhook",
      "connection": "onboarding",
      "body": {
        "plan": "three_tranches",
        "weeks_apart": 2,
        "reason": "market_stretched",
        "as_of": "{{as_of}}"
      }
    },
    {
      "id": "lump",
      "when": "else",
      "do": "webhook",
      "connection": "onboarding",
      "body": {
        "plan": "lump_sum",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "stretched": {
      "yes_no": 0.0537,
      "rule": "C - sma(C, 20) > 2 * atr(14)",
      "basis": "pattern"
    },
    "rsi70": {
      "yes_no": 0.0537,
      "rule": "rsi(C, 14) > 70",
      "basis": "rule"
    },
    "ext200": {
      "yes_no": 0.0537,
      "rule": "C > sma(C, 200) * 1.1",
      "basis": "comparison"
    },
    "drop5": {
      "yes_no": 0.203
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "tranches",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "lump",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "onboarding",
      "preview": {
        "body": {
          "plan": "lump_sum",
          "as_of": "2026-10-30"
        }
      }
    }
  ]
}

atr rsi sma

Robo-advisor · example 15

Thematic sleeve check: clean energy funds ICLN and TAN

Thematic sleeves are volatile; check trend, volatility and drawdown before the quarterly top-up.

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

State

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

Questions

trendEnglish → ruleIs the stock above its 200-day moving average?
hvrulestd(log(C / C[-1]), 20) * sqrt(252) > 0.4
Annualized 20-day volatility above 40%
ddruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
rally10forecastWill it rally at least 10% at some point in the next month?
A 10% rally within a month
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

Symboltrendrulehvruleddrulerally10forecastdrop10forecast
ICLN0.05370.05370.94630.6220.547
TAN0.05370.07330.94630.7010.61

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 none of 2. Annualized 20-day volatility above 40%: true for none of 2. More than 20% off the 52-week high: true for ICLN, TAN of 2. Highest odds for “A 10% rally within a month”: TAN at 70%.

Thematic funds can sit far below their highs for long periods; the top-up keeps to the policy weight and the forecasts only set the pace.

Request JSON (ICLN; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "ICLN"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "hv": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
    },
    "dd": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "rally10": {
      "type": "yes_no",
      "instructions": "Will it rally at least 10% at some point in the next month?"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    }
  }
}
Response JSON (ICLN, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.0537,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "hv": {
      "yes_no": 0.0537,
      "rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
      "basis": "rule"
    },
    "dd": {
      "yes_no": 0.9463,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "rally10": {
      "yes_no": 0.622
    },
    "drop10": {
      "yes_no": 0.547
    }
  },
  "context": {
    "symbol": "ICLN",
    "as_of": "2026-10-30"
  }
}

log max offset sma sqrt std

Robo-advisor · example 16

Small-cap sleeve: IWM, IJR and VB trend agreement

Only tilt toward small caps when all three small-cap funds agree on trend.

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

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
goldenEnglish → ruleIs the 50-day moving average above the 200-day?
momentumEnglish → ruleIs the stock up over the last month?
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulegoldenrulemomentumrulebeat_spyforecast
IWM0.21760.83180.52360.459
IJR0.53790.86440.81420.46
VB0.36980.89510.7030.462

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: Above the 50-day average: true for none of 3. Is the 50-day moving average above the 200-day: true for IWM, IJR, VB of 3. Is the stock up over the last month: true for IJR, VB of 3. Highest odds for “Beating SPY over a month”: VB at 46%.

Agreement across three funds filters out one fund's noise; the tilt is applied only if every fund's trend rule is true.

Request JSON (IWM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "IWM"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "golden": {
      "type": "yes_no",
      "instructions": "Is the 50-day moving average above the 200-day?"
    },
    "momentum": {
      "type": "yes_no",
      "instructions": "Is the stock up over the last month?"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  }
}
Response JSON (IWM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.2176,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "golden": {
      "yes_no": 0.8318,
      "rule": "sma(C, 50) > sma(C, 200)",
      "basis": "comparison"
    },
    "momentum": {
      "yes_no": 0.5236,
      "rule": "C > C[-21]",
      "basis": "pattern"
    },
    "beat_spy": {
      "yes_no": 0.459
    }
  },
  "context": {
    "symbol": "IWM",
    "as_of": "2026-10-30"
  }
}

offset sma

Robo-advisor · example 17

Weekly model report for the investment committee

Every Monday, email the committee a one-line status per core fund: trend, drawdown and next-month odds.

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

State

{"symbol":"VTI"} then VXUS, BND, BNDX, 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
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

Symboltrendruleddruledrop5forecastrally5forecastFired
VTI0.94150.05370.1870.204line
VXUS0.32550.05370.2330.269line
BND0.20130.05370.0070.007line
BNDX0.22970.05370.0060.006line

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→Emailinvestment-committee
VTI 1 of 1 fired · dry run, nothing sent
linewould send (dry run)Email → investment-committee
{
  "subject": "Model status VTI (2026-10-30)",
  "text": "VTI: above the 200-day 94%, 20% drawdown 5%, 5% drop within a month 19%, 5% rally within a month 20%."
}
VXUS 1 of 1 fired · dry run, nothing sent
linewould send (dry run)Email → investment-committee
{
  "subject": "Model status VXUS (2026-10-30)",
  "text": "VXUS: above the 200-day 33%, 20% drawdown 5%, 5% drop within a month 23%, 5% rally within a month 27%."
}
BND 1 of 1 fired · dry run, nothing sent
linewould send (dry run)Email → investment-committee
{
  "subject": "Model status BND (2026-10-30)",
  "text": "BND: above the 200-day 20%, 20% drawdown 5%, 5% drop within a month 1%, 5% rally within a month 1%."
}
BNDX 1 of 1 fired · dry run, nothing sent
linewould send (dry run)Email → investment-committee
{
  "subject": "Model status BNDX (2026-10-30)",
  "text": "BNDX: above the 200-day 23%, 20% drawdown 5%, 5% drop within a month 1%, 5% rally within a month 1%."
}

What it means

Session of 2026-10-30, 4 symbols: Is the stock above its 200-day moving average: true for VTI of 4. More than 20% off the 52-week high: true for none of 4. Highest odds for “A 5% drawdown within a month”: VXUS at 23%. line fired for VTI, VXUS, BND, BNDX.

The committee sees the same four numbers for every core fund each week, which makes changes easy to spot.

As a scheduled workflow (Mon at 07: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": "Weekly model report for the investment committee",
  "symbols": "VTI VXUS BND BNDX",
  "days": [
    1
  ],
  "at_time": "07:30",
  "model": "ora-fin-0.1.1",
  "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)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "line",
      "when": "trend >= 0",
      "do": "email",
      "connection": "investment-committee",
      "subject": "Model status {{symbol}} ({{as_of}})",
      "message": "{{symbol}}: above the 200-day {{trend|pct}}, 20% drawdown {{dd|pct}}, 5% drop within a month {{drop5|pct}}, 5% rally within a month {{rally5|pct}}."
    }
  ]
}
Request JSON (VTI; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "VTI"
  },
  "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)"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "line",
      "when": "trend >= 0",
      "do": "email",
      "connection": "investment-committee",
      "subject": "Model status {{symbol}} ({{as_of}})",
      "message": "{{symbol}}: above the 200-day {{trend|pct}}, 20% drawdown {{dd|pct}}, 5% drop within a month {{drop5|pct}}, 5% rally within a month {{rally5|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (VTI, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.9415,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "dd": {
      "yes_no": 0.0537,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.187
    },
    "rally5": {
      "yes_no": 0.204
    }
  },
  "context": {
    "symbol": "VTI",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "line",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "investment-committee",
      "preview": {
        "subject": "Model status VTI (2026-10-30)",
        "text": "VTI: above the 200-day 94%, 20% drawdown 5%, 5% drop within a month 19%, 5% rally within a month 20%."
      }
    }
  ]
}

max sma

Robo-advisor · example 18

Municipal bond sleeve for taxable accounts: MUB and VTEB

Check the tax-exempt bond funds for trend and calm before routing new taxable-account cash into them.

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

State

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

Questions

trendruleC > sma(C, 50)
Above the 50-day average
calmEnglish → ruleIs the 14-day ATR less than 2% of the price?
paysrulepays_dividend > 0.5
Pays a dividend
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

Symboltrendrulecalmrulepaysruleup_weekforecast
MUB0.86660.94630.85910.588
VTEB0.87830.94630.85910.561

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 MUB, VTEB of 2. Is the 14-day ATR less than 2% of the price: true for MUB, VTEB of 2. Pays a dividend: true for MUB, VTEB of 2. Highest odds for “Higher in a week”: MUB at 59%.

Munis are a placement choice for taxable accounts; these checks only confirm nothing unusual is happening before the cash moves.

Request JSON (MUB; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MUB"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "calm": {
      "type": "yes_no",
      "instructions": "Is the 14-day ATR less than 2% of the price?"
    },
    "pays": {
      "type": "yes_no",
      "ask": "pays_dividend > 0.5"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  }
}
Response JSON (MUB, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.8666,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "calm": {
      "yes_no": 0.9463,
      "rule": "atr(14) / C < 0.02",
      "basis": "pattern"
    },
    "pays": {
      "yes_no": 0.8591,
      "rule": "pays_dividend > 0.5",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.588
    }
  },
  "context": {
    "symbol": "MUB",
    "as_of": "2026-10-30"
  }
}

atr pays_dividend sma

Robo-advisor · example 19

Volatility-targeted equity weight from SPY's realized and forecast volatility

Scale the equity weight down when realized volatility and the next-month forecast are both high.

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

State

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

Questions

hv20rulestd(log(C / C[-1]), 20) * sqrt(252) > 0.2
20-day realized volatility above 20% a year
vol5English → ruleIs 5-day volatility higher than 20-day volatility?
hv_nextforecastWill annualized volatility over the next 21 sessions exceed 30%?
Next-month volatility above 30%
vol_upforecastWill volatility be higher over the next month?
Higher volatility next month

Answers

QuestionAnswerReading
hv20
20-day realized volatility above 20% a year
0.0537false
vol5
Is 5-day volatility higher than 20-day volatility
compiled to std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19)
0.8872true
hv_next
Next-month volatility above 30%
0.56456% · close to even
vol_up
Higher volatility next month
0.6969% · likely

What it means

For SPY on the session of 2026-10-30: True now: Is 5-day volatility higher than 20-day volatility. Not true: 20-day realized volatility above 20% a year. Forecasts: Next-month volatility above 30% 56%; Higher volatility next month 69%.

The weight formula uses realized volatility today and the forecast for the month; both are logged with the trade for audit.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "hv20": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.2"
    },
    "vol5": {
      "type": "yes_no",
      "instructions": "Is 5-day volatility higher than 20-day volatility?"
    },
    "hv_next": {
      "type": "yes_no",
      "instructions": "Will annualized volatility over the next 21 sessions exceed 30%?"
    },
    "vol_up": {
      "type": "yes_no",
      "instructions": "Will volatility be higher over the next month?"
    }
  }
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "hv20": {
      "yes_no": 0.0537,
      "rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.2",
      "basis": "rule"
    },
    "vol5": {
      "yes_no": 0.8872,
      "rule": "std(log(C / C[-1]), 5) * sqrt(5 / 4) > std(log(C / C[-1]), 20) * sqrt(20 / 19)",
      "basis": "pattern"
    },
    "hv_next": {
      "yes_no": 0.564
    },
    "vol_up": {
      "yes_no": 0.69
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  }
}

log offset sqrt std

Robo-advisor · example 20

Single-stock concentration review for clients holding AAPL

Clients with a large employer or legacy position in AAPL get a review flag when the stock is stretched or breaking down.

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

stretchedruleC > sma(C, 20) + 2 * atr(14)
Stretched: more than 2 ATR above the 20-day
breakdownruleC < lowest(L, 20)
Closed under the 20-day low
chandelierEnglish → ruleHas the stock closed below its chandelier stop (22-day high minus 3 ATR)?
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

QuestionAnswerReading
stretched
Stretched: more than 2 ATR above the 20-day
0.114false
breakdown
Closed under the 20-day low
0.0744false
chandelier
Has the stock closed below its chandelier stop (22-day high minus 3 ATR)
compiled to C < max(H, 22) - 3 * atr(22)
0.1232false
drop10
A 10% drawdown within a month
0.36537% · unlikely

Actions

Rules on the answers decide what to send.

stretched >= 0.6 or breakdown >= 0.6 or chandelier >= 0.6→Emailadvisor-queue
What each action would send 0 of 1 fired · dry run, nothing sent
reviewrule false: skipped

What it means

For AAPL on the session of 2026-10-30: Not true: Stretched: more than 2 ATR above the 20-day; Closed under the 20-day low; Has the stock closed below its chandelier stop (22-day high minus 3 ATR). Forecasts: A 10% drawdown within a month 37%. No action fired: every rule was false.

The robo flags; a human advisor talks to the client, because concentrated positions have tax and personal context the rules cannot see.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "stretched": {
      "type": "yes_no",
      "ask": "C > sma(C, 20) + 2 * atr(14)"
    },
    "breakdown": {
      "type": "yes_no",
      "ask": "C < lowest(L, 20)"
    },
    "chandelier": {
      "type": "yes_no",
      "instructions": "Has the stock closed below its chandelier stop (22-day high minus 3 ATR)?"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "review",
      "when": "stretched >= 0.6 or breakdown >= 0.6 or chandelier >= 0.6",
      "do": "email",
      "connection": "advisor-queue",
      "subject": "Concentration review: {{symbol}}",
      "message": "{{symbol}} ({{as_of}}) is stretched ({{stretched|pct}}) or breaking down ({{breakdown|pct}}, chandelier {{chandelier|pct}}). Review clients with a concentrated position."
    }
  ],
  "dry_run": true
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "stretched": {
      "yes_no": 0.114,
      "rule": "C > sma(C, 20) + 2 * atr(14)",
      "basis": "rule"
    },
    "breakdown": {
      "yes_no": 0.0744,
      "rule": "C < lowest(L, 20)",
      "basis": "rule"
    },
    "chandelier": {
      "yes_no": 0.1232,
      "rule": "C < max(H, 22) - 3 * atr(22)",
      "basis": "pattern"
    },
    "drop10": {
      "yes_no": 0.365
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "review",
      "fired": false,
      "status": "skipped"
    }
  ]
}

atr lowest max 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, 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.