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 · Sell side

Prop trading firm: 20 ways to use Ora

Trader risk rules, setup scans and firm-wide kill switches on the daily data. Each example is a complete, runnable request with the real answers it returned (47 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 (40)

offset 11sma 8atr 4avg 4ref 4swinghigh 4swinglow 4std 3roc 3abs 2highest 2rsi 2atr_pct 2lowest 2log 2sqrt 2max 2zscore 1bblower 1crossup 1three_black_crows 1adx 1hammer 1inverted_hammer 1morning_star 1three_white_soldiers 1days_to_earnings 1last_earnings_move 1next_report_amc 1macd 1bbupper 1cci 1stochk 1min 1tweezer_bottom 1obv 1sign 1sum 1doji 1spinning_top 1

Examples 1–10 of 20 · page 1 of 2

Prop trading firm · example 1

Firm-wide kill switch: SPY shock day cuts trader limits

When the index has a shock day, send the risk system a firm-wide instruction to halve trader limits.

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

State

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

Questions

shockrulezscore(C / C[-1] - 1, 20) < -2
A two-sigma down day
bigruleabs(C - C[-1]) > 1.5 * atr(14)
Today's move was bigger than 1.5 ATR
down3English → ruleDid the stock fall more than 3% today?
below200English → ruleIs the stock below its 200-day moving average?
big5forecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

QuestionAnswerReading
shock
A two-sigma down day
0.6995true
big
Today's move was bigger than 1.5 ATR
0.8053true
down3
Did the stock fall more than 3% today
compiled to C / C[-1] - 1 < -0.03
0.0709false
below200
Is the stock below its 200-day moving average
compiled to C < sma(C, 200)
0.0549false
big5
A big move either way in 5 days
0.42543% · close to even

Actions

Rules on the answers decide what to send.

shock >= 0.6 or (big >= 0.6 and down3 >= 0.6)→Webhookrisk-system
else→Slackrisk-floor
What each action would send 1 of 2 fired · dry run, nothing sent
halvewould send (dry run)Webhook → risk-system
{
  "scope": "firm",
  "action": "scale_limits",
  "factor": 0.5,
  "trigger": "SPY_shock_day",
  "p_shock": 0.6995,
  "p_big_move5": 0.425,
  "as_of": "2026-10-30"
}
normalrule false: skipped

What it means

For SPY on the session of 2026-10-30: True now: A two-sigma down day; Today's move was bigger than 1.5 ATR. Not true: Did the stock fall more than 3% today; Is the stock below its 200-day moving average. Forecasts: A big move either way in 5 days 43%. Fired: halve (Webhook → risk-system).

Exact rules on the index trigger the switch; the else branch confirms limits stay where they are.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "shock": {
      "type": "yes_no",
      "ask": "zscore(C / C[-1] - 1, 20) < -2"
    },
    "big": {
      "type": "yes_no",
      "ask": "abs(C - C[-1]) > 1.5 * atr(14)"
    },
    "down3": {
      "type": "yes_no",
      "instructions": "Did the stock fall more than 3% today?"
    },
    "below200": {
      "type": "yes_no",
      "instructions": "Is the stock below its 200-day moving average?"
    },
    "big5": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "halve",
      "when": "shock >= 0.6 or (big >= 0.6 and down3 >= 0.6)",
      "do": "webhook",
      "connection": "risk-system",
      "body": {
        "scope": "firm",
        "action": "scale_limits",
        "factor": 0.5,
        "trigger": "{{symbol}}_shock_day",
        "p_shock": "{{shock}}",
        "p_big_move5": "{{big5}}",
        "as_of": "{{as_of}}"
      }
    },
    {
      "id": "normal",
      "when": "else",
      "do": "slack",
      "connection": "risk-floor",
      "message": "{{symbol}} ({{as_of}}): no shock day (z-score rule {{shock|pct}}). Limits unchanged."
    }
  ],
  "dry_run": true
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "shock": {
      "yes_no": 0.6995,
      "rule": "zscore(C / C[-1] - 1, 20) < -2",
      "basis": "rule"
    },
    "big": {
      "yes_no": 0.8053,
      "rule": "abs(C - C[-1]) > 1.5 * atr(14)",
      "basis": "rule"
    },
    "down3": {
      "yes_no": 0.0709,
      "rule": "C / C[-1] - 1 < -0.03",
      "basis": "pattern"
    },
    "below200": {
      "yes_no": 0.0549,
      "rule": "C < sma(C, 200)",
      "basis": "comparison"
    },
    "big5": {
      "yes_no": 0.425
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "halve",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "risk-system",
      "preview": {
        "body": {
          "scope": "firm",
          "action": "scale_limits",
          "factor": 0.5,
          "trigger": "SPY_shock_day",
          "p_shock": 0.6995,
          "p_big_move5": 0.425,
          "as_of": "2026-10-30"
        }
      }
    },
    {
      "id": "normal",
      "fired": false,
      "status": "skipped"
    }
  ]
}

abs atr offset sma zscore

Prop trading firm · example 2

Breakout scan for the desk: NVDA, AMD, SMCI, MU, TSM, ASML

Each evening, scan semiconductor names for volume breakouts and post the hits to the trader channel.

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

State

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

Questions

boruleC > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)
20-day breakout on 1.5× volume
squeeze_borulestd(C, 20) < 0.7 * std(C, 100) and C > highest(C, 20)
Squeeze, then a breakout
high20ruleH > highest(H, 20)
Took out the 20-day high intraday
new_highforecastWill it make a new 20-day high in the next week?
A new 20-day high next week

Answers

Symbolborulesqueeze_borulehigh20rulenew_highforecastFired
NVDA0.05370.05370.05370.027none
AMD0.05370.05370.05370.052none
SMCI0.05620.05620.05420.038none
MU0.05430.05430.05370.055none
TSM0.05370.05370.05370.037none
ASML0.05370.05370.05440.038none

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.

bo >= 0.6 or squeeze_bo >= 0.6→Slackprop-ideas
NVDA 0 of 1 fired · dry run, nothing sent
AMD 0 of 1 fired · dry run, nothing sent
SMCI 0 of 1 fired · dry run, nothing sent
MU 0 of 1 fired · dry run, nothing sent
TSM 0 of 1 fired · dry run, nothing sent
ASML 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 6 symbols: 20-day breakout on 1.5× volume: true for none of 6. Squeeze, then a breakout: true for none of 6. Took out the 20-day high intraday: true for none of 6. Highest odds for “A new 20-day high next week”: MU at 6%. hit fired for none.

Only names where a breakout rule is true post; traders review them before the next open.

As a scheduled workflow (Mon–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": "Breakout scan for the desk: NVDA, AMD, SMCI, MU, TSM, ASML",
  "symbols": "NVDA AMD SMCI MU TSM ASML",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "17:00",
  "model": "ora-fin-0.1.1",
  "questions": {
    "bo": {
      "type": "yes_no",
      "ask": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "squeeze_bo": {
      "type": "yes_no",
      "ask": "std(C, 20) < 0.7 * std(C, 100) and C > highest(C, 20)"
    },
    "high20": {
      "type": "yes_no",
      "ask": "H > highest(H, 20)"
    },
    "new_high": {
      "type": "yes_no",
      "instructions": "Will it make a new 20-day high in the next week?"
    }
  },
  "actions": [
    {
      "id": "hit",
      "when": "bo >= 0.6 or squeeze_bo >= 0.6",
      "do": "slack",
      "connection": "prop-ideas",
      "message": "{{symbol}} ({{as_of}}): breakout (volume {{bo|pct}}, from a squeeze {{squeeze_bo|pct}}). New 20-day high next week {{new_high|pct}}."
    }
  ]
}
Request JSON (NVDA; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "bo": {
      "type": "yes_no",
      "ask": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "squeeze_bo": {
      "type": "yes_no",
      "ask": "std(C, 20) < 0.7 * std(C, 100) and C > highest(C, 20)"
    },
    "high20": {
      "type": "yes_no",
      "ask": "H > highest(H, 20)"
    },
    "new_high": {
      "type": "yes_no",
      "instructions": "Will it make a new 20-day high in the next week?"
    }
  },
  "actions": [
    {
      "id": "hit",
      "when": "bo >= 0.6 or squeeze_bo >= 0.6",
      "do": "slack",
      "connection": "prop-ideas",
      "message": "{{symbol}} ({{as_of}}): breakout (volume {{bo|pct}}, from a squeeze {{squeeze_bo|pct}}). New 20-day high next week {{new_high|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "bo": {
      "yes_no": 0.0537,
      "rule": "C > highest(C, 20) and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "squeeze_bo": {
      "yes_no": 0.0537,
      "rule": "std(C, 20) < 0.7 * std(C, 100) and C > highest(C, 20)",
      "basis": "rule"
    },
    "high20": {
      "yes_no": 0.0537,
      "rule": "H > highest(H, 20)",
      "basis": "rule"
    },
    "new_high": {
      "yes_no": 0.027
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "hit",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg highest ref std

Prop trading firm · example 3

Trader risk rule: no new TSLA longs below the 50-day after a drawdown

Enforce a desk rule: when the stock is under its 50-day and down five percent over a month, block new longs.

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

State

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

Questions

below50ruleC < sma(C, 50)
Close below the 50-day average
down_monthEnglish → ruleIs the stock down more than 5% over the last month?
lh_llEnglish → ruleIs the stock making lower swing highs and lower swing lows?
drop10forecastWill it drop at least 10% at some point in the next month?
A 10% drawdown within a month

Answers

QuestionAnswerReading
below50
Close below the 50-day average
0.1039false
down_month
Is the stock down more than 5% over the last month
compiled to C / C[-21] - 1 < -0.05
0.0713false
lh_ll
Is the stock making lower swing highs and lower swing lows
compiled to (swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))
0.4322on the line (false)
drop10
A 10% drawdown within a month
0.63864% · likely

Actions

Rules on the answers decide what to send.

below50 >= 0.6 and down_month >= 0.6→Webhookrisk-system
What each action would send 0 of 1 fired · dry run, nothing sent
blockrule false: skipped

What it means

For TSLA on the session of 2026-10-30: Not true: Close below the 50-day average; Is the stock down more than 5% over the last month. On the line: Is the stock making lower swing highs and lower swing lows. Forecasts: A 10% drawdown within a month 64%. No action fired: every rule was false.

The block is a firm rule applied the same way every day; traders can see exactly which conditions triggered it.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "TSLA"
  },
  "questions": {
    "below50": {
      "type": "yes_no",
      "ask": "C < sma(C, 50)"
    },
    "down_month": {
      "type": "yes_no",
      "instructions": "Is the stock down more than 5% over the last month?"
    },
    "lh_ll": {
      "type": "yes_no",
      "instructions": "Is the stock making lower swing highs and lower swing lows?"
    },
    "drop10": {
      "type": "yes_no",
      "instructions": "Will it drop at least 10% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "block",
      "when": "below50 >= 0.6 and down_month >= 0.6",
      "do": "webhook",
      "connection": "risk-system",
      "body": {
        "symbol": "{{symbol}}",
        "action": "block_new_longs",
        "rule": "below_50d_and_down_5pct_month",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (TSLA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "below50": {
      "yes_no": 0.1039,
      "rule": "C < sma(C, 50)",
      "basis": "rule"
    },
    "down_month": {
      "yes_no": 0.0713,
      "rule": "C / C[-21] - 1 < -0.05",
      "basis": "pattern"
    },
    "lh_ll": {
      "yes_no": 0.4322,
      "rule": "(swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))",
      "basis": "pattern"
    },
    "drop10": {
      "yes_no": 0.638
    }
  },
  "context": {
    "symbol": "TSLA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "block",
      "fired": false,
      "status": "skipped"
    }
  ]
}

offset sma swinghigh swinglow

Prop trading firm · example 4

RSI(2) mean-reversion scan on index ETFs

Find oversold index ETFs in long-term uptrends for the short-term reversion book.

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

State

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

Questions

rsi2rulersi(C, 2) < 10
Two-day RSI under 10
trendEnglish → ruleIs the stock above its 200-day moving average?
three_downruleC < C[-1] and C[-1] < C[-2] and C[-2] < C[-3] and C > sma(C, 200)
Three lower closes while above the 200-day
back_inrulecrossup(C, bblower(C, 20, 2))
Crossed back above the lower band
up_tomforecastWill the stock be up tomorrow?
Up tomorrow

Answers

Symbolrsi2ruletrendrulethree_downruleback_inruleup_tomforecast
SPY0.51640.94510.22770.050.532
QQQ0.53560.79870.22410.050.533
IWM0.19380.55640.12170.050.486
DIA0.56310.87780.27480.050.52

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: Two-day RSI under 10: true for none of 4. Is the stock above its 200-day moving average: true for SPY, QQQ, DIA of 4. Three lower closes while above the 200-day: true for none of 4. Crossed back above the lower band: true for none of 4. Highest odds for “Up tomorrow”: QQQ at 53%.

Oversold in an uptrend is the setup; the up-tomorrow odds rank the candidates.

Request JSON (SPY; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "rsi2": {
      "type": "yes_no",
      "ask": "rsi(C, 2) < 10"
    },
    "trend": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "three_down": {
      "type": "yes_no",
      "ask": "C < C[-1] and C[-1] < C[-2] and C[-2] < C[-3] and C > sma(C, 200)"
    },
    "back_in": {
      "type": "yes_no",
      "ask": "crossup(C, bblower(C, 20, 2))"
    },
    "up_tom": {
      "type": "yes_no",
      "instructions": "Will the stock be up tomorrow?"
    }
  }
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "rsi2": {
      "yes_no": 0.5164,
      "rule": "rsi(C, 2) < 10",
      "basis": "rule"
    },
    "trend": {
      "yes_no": 0.9451,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "three_down": {
      "yes_no": 0.2277,
      "rule": "C < C[-1] and C[-1] < C[-2] and C[-2] < C[-3] and C > sma(C, 200)",
      "basis": "rule"
    },
    "back_in": {
      "yes_no": 0.05,
      "rule": "crossup(C, bblower(C, 20, 2))",
      "basis": "rule"
    },
    "up_tom": {
      "yes_no": 0.532
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  }
}

bblower crossup offset rsi sma

Prop trading firm · example 5

NFLX gap-and-go: did the gap hold and close strong?

Check the classic opening-gap continuation setup on the daily bar for tomorrow's plan.

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

State

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

Questions

gapruleO > C[-1] * 1.01
Opened more than 1% above yesterday's close
heldruleL > H[-1]
An unfilled gap up
toprule(C - L) / (H - L) > 0.75
Closed in the top quarter of the day's range
fadedruleO > C[-1] and C < C[-1]
Gapped up but closed under yesterday's close
up_tomforecastWill the stock be up tomorrow?
Up tomorrow

Answers

QuestionAnswerReading
gap
Opened more than 1% above yesterday's close
0.4929on the line (false)
held
An unfilled gap up
0.2232false
top
Closed in the top quarter of the day's range
0.0983false
faded
Gapped up but closed under yesterday's close
0.4872on the line (false)
up_tom
Up tomorrow
0.49950% · close to even

What it means

For NFLX on the session of 2026-10-30: Not true: An unfilled gap up; Closed in the top quarter of the day's range. On the line: Opened more than 1% above yesterday's close; Gapped up but closed under yesterday's close. Forecasts: Up tomorrow 50%.

A gap that held with a close in the top quarter is a continuation candidate; a faded gap is not.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NFLX"
  },
  "questions": {
    "gap": {
      "type": "yes_no",
      "ask": "O > C[-1] * 1.01"
    },
    "held": {
      "type": "yes_no",
      "ask": "L > H[-1]"
    },
    "top": {
      "type": "yes_no",
      "ask": "(C - L) / (H - L) > 0.75"
    },
    "faded": {
      "type": "yes_no",
      "ask": "O > C[-1] and C < C[-1]"
    },
    "up_tom": {
      "type": "yes_no",
      "instructions": "Will the stock be up tomorrow?"
    }
  }
}
Response JSON (NFLX, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "gap": {
      "yes_no": 0.4929,
      "rule": "O > C[-1] * 1.01",
      "basis": "rule"
    },
    "held": {
      "yes_no": 0.2232,
      "rule": "L > H[-1]",
      "basis": "rule"
    },
    "top": {
      "yes_no": 0.0983,
      "rule": "(C - L) / (H - L) > 0.75",
      "basis": "rule"
    },
    "faded": {
      "yes_no": 0.4872,
      "rule": "O > C[-1] and C < C[-1]",
      "basis": "rule"
    },
    "up_tom": {
      "yes_no": 0.499
    }
  },
  "context": {
    "symbol": "NFLX",
    "as_of": "2026-10-30"
  }
}

offset

Prop trading firm · example 6

AMD position sizing: does a 2 ATR stop fit the risk budget?

Confirm a trader can take a meaningful position with a 2 ATR stop at one percent of the account at risk.

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

State

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

Questions

sizerule0.01 / (2 * atr(14) / C) >= 0.25
A 2-ATR stop risking 1% allows at least a 25% position
stopruleC > L[-1] and C - L[-1] < atr(14)
A stop under yesterday's low is less than 1 ATR away
atr3ruleatr_pct(14) > 3
A typical day moves more than 3%
rrEnglish → ruleIs the risk/reward at least 2:1, targeting the last swing high with a stop at the last swing low?
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
size
A 2-ATR stop risking 1% allows at least a 25% position
0.0537false
stop
A stop under yesterday's low is less than 1 ATR away
0.0567false
atr3
A typical day moves more than 3%
0.9441true
rr
Is the risk/reward at least 2:1, targeting the last swing high with a stop at the last swing low
compiled to (C > swinglow(5, 1)) and (C < swinghigh(5, 1)) and (swinghigh(5, 1) - C >= 2 * (C - swinglow(5, 1)))
0.5233on the line (true)
drop5
A 5% drawdown within a month
0.76376% · likely

What it means

For AMD on the session of 2026-10-30: True now: A typical day moves more than 3%. Not true: A 2-ATR stop risking 1% allows at least a 25% position; A stop under yesterday's low is less than 1 ATR away. On the line: Is the risk/reward at least 2:1, targeting the last swing high with a stop at the last swing low. Forecasts: A 5% drawdown within a month 76%.

If the size rule is false, the stop is too wide for the budget and the trade is taken smaller or skipped.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AMD"
  },
  "questions": {
    "size": {
      "type": "yes_no",
      "ask": "0.01 / (2 * atr(14) / C) >= 0.25"
    },
    "stop": {
      "type": "yes_no",
      "ask": "C > L[-1] and C - L[-1] < atr(14)"
    },
    "atr3": {
      "type": "yes_no",
      "ask": "atr_pct(14) > 3"
    },
    "rr": {
      "type": "yes_no",
      "instructions": "Is the risk/reward at least 2:1, targeting the last swing high with a stop at the last swing low?"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  }
}
Response JSON (AMD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "size": {
      "yes_no": 0.0537,
      "rule": "0.01 / (2 * atr(14) / C) >= 0.25",
      "basis": "rule"
    },
    "stop": {
      "yes_no": 0.0567,
      "rule": "C > L[-1] and C - L[-1] < atr(14)",
      "basis": "rule"
    },
    "atr3": {
      "yes_no": 0.9441,
      "rule": "atr_pct(14) > 3",
      "basis": "rule"
    },
    "rr": {
      "yes_no": 0.5233,
      "rule": "(C > swinglow(5, 1)) and (C < swinghigh(5, 1)) and (swinghigh(5, 1) - C >= 2 * (C - swinglow(5, 1)))",
      "basis": "pattern"
    },
    "drop5": {
      "yes_no": 0.763
    }
  },
  "context": {
    "symbol": "AMD",
    "as_of": "2026-10-30"
  }
}

atr atr_pct offset swinghigh swinglow

Prop trading firm · example 7

Short-side scan: breakdowns in BA, INTC, NKE, PFE

Find names breaking their 20-day lows on volume with lower swing highs for the short book.

ora-fin-0.1.14 symbols, one request each5 questions1 action
  1. State4 symbols
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions1 rule · dry run

State

{"symbol":"BA"} then INTC, NKE, PFE, one request each. The server fills in the latest completed session.

Questions

bdruleC < lowest(L, 20)
Closed under the 20-day low
down_volruleC < C[-1] and V > 1.5 * ref(avg(V, 20), -1)
Down on heavy volume
lh_llEnglish → ruleIs the stock making lower swing highs and lower swing lows?
crowsrulethree_black_crows()
three black crows candle: Three red bars, each closing lower and opening inside the previous body.
new_lowforecastWill it make a new 20-day low in the next week?
A new 20-day low next week

Answers

Symbolbdruledown_volrulelh_llrulecrowsrulenew_lowforecastFired
BA0.1910.14060.54980.1070.408none
INTC0.91220.94630.15520.05370.723short_idea
NKE0.05370.12090.93980.07310.038none
PFE0.05390.08470.15860.08470.026none

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.

bd >= 0.6 and down_vol >= 0.6→Slackprop-ideas
BA 0 of 1 fired · dry run, nothing sent
INTC 1 of 1 fired · dry run, nothing sent
short_ideawould send (dry run)Slack → prop-ideas
{
  "text": "INTC (2026-10-30): broke its 20-day low on volume. Lower highs and lows 16%. New 20-day low next week 72%."
}
NKE 0 of 1 fired · dry run, nothing sent
PFE 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 4 symbols: Closed under the 20-day low: true for INTC of 4. Down on heavy volume: true for INTC of 4. Is the stock making lower swing highs and lower swing lows: true for NKE of 4. three black crows candle: Three red bars, each closing lower and opening inside the previous body.: true for none of 4. Highest odds for “A new 20-day low next week”: INTC at 72%. short_idea fired for INTC.

Only volume breakdowns post; structure and the forecast help choose between them.

Request JSON (BA; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "BA"
  },
  "questions": {
    "bd": {
      "type": "yes_no",
      "ask": "C < lowest(L, 20)"
    },
    "down_vol": {
      "type": "yes_no",
      "ask": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)"
    },
    "lh_ll": {
      "type": "yes_no",
      "instructions": "Is the stock making lower swing highs and lower swing lows?"
    },
    "crows": {
      "type": "yes_no",
      "ask": "three_black_crows()"
    },
    "new_low": {
      "type": "yes_no",
      "instructions": "Will it make a new 20-day low in the next week?"
    }
  },
  "actions": [
    {
      "id": "short_idea",
      "when": "bd >= 0.6 and down_vol >= 0.6",
      "do": "slack",
      "connection": "prop-ideas",
      "message": "{{symbol}} ({{as_of}}): broke its 20-day low on volume. Lower highs and lows {{lh_ll|pct}}. New 20-day low next week {{new_low|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (BA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "bd": {
      "yes_no": 0.191,
      "rule": "C < lowest(L, 20)",
      "basis": "rule"
    },
    "down_vol": {
      "yes_no": 0.1406,
      "rule": "C < C[-1] and V > 1.5 * ref(avg(V, 20), -1)",
      "basis": "rule"
    },
    "lh_ll": {
      "yes_no": 0.5498,
      "rule": "(swinghigh(5, 1) < swinghigh(5, 2)) and (swinglow(5, 1) < swinglow(5, 2))",
      "basis": "pattern"
    },
    "crows": {
      "yes_no": 0.107,
      "rule": "three_black_crows()",
      "basis": "rule"
    },
    "new_low": {
      "yes_no": 0.408
    }
  },
  "context": {
    "symbol": "BA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "short_idea",
      "fired": false,
      "status": "skipped"
    }
  ]
}

avg lowest offset ref swinghigh swinglow three_black_crows

Prop trading firm · example 8

End-of-day context email for the head trader

Email a one-line market context per index so P&L reviews account for the kind of day it was.

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

State

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

Questions

trend_dayrule(O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))
A trend day up: opened near the low, closed near the high
widerule(H - L) > 2 * avg(H - L, 20)
Range more than twice the 20-day average range
insideruleH < H[-1] and L > L[-1]
An inside day
volruleV > avg(V, 20)
Volume above its 20-day average

Answers

Symboltrend_dayrulewideruleinsiderulevolruleFired
SPY0.05370.2620.05370.9463context
QQQ0.05370.17550.05370.9463context
IWM0.05370.18040.06370.4577context

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.

vol >= 0→Emailhead-trader
SPY 1 of 1 fired · dry run, nothing sent
contextwould send (dry run)Email → head-trader
{
  "subject": "Context SPY 2026-10-30",
  "text": "SPY: trend day 5%, wide range 26%, inside day 5%, volume above average 95%."
}
QQQ 1 of 1 fired · dry run, nothing sent
contextwould send (dry run)Email → head-trader
{
  "subject": "Context QQQ 2026-10-30",
  "text": "QQQ: trend day 5%, wide range 18%, inside day 5%, volume above average 95%."
}
IWM 1 of 1 fired · dry run, nothing sent
contextwould send (dry run)Email → head-trader
{
  "subject": "Context IWM 2026-10-30",
  "text": "IWM: trend day 5%, wide range 18%, inside day 6%, volume above average 46%."
}

What it means

Session of 2026-10-30, 3 symbols: A trend day up: opened near the low, closed near the high: true for none of 3. Range more than twice the 20-day average range: true for none of 3. An inside day: true for none of 3. Volume above its 20-day average: true for SPY, QQQ of 3. context fired for SPY, QQQ, IWM.

Traders are judged against the day they had; the context email makes that part of every review.

As a scheduled workflow (Mon–Fri at 16:20 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": "End-of-day context email for the head trader",
  "symbols": "SPY QQQ IWM",
  "days": [
    1,
    2,
    3,
    4,
    5
  ],
  "at_time": "16:20",
  "model": "ora-fin-0.1.1",
  "questions": {
    "trend_day": {
      "type": "yes_no",
      "ask": "(O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))"
    },
    "wide": {
      "type": "yes_no",
      "ask": "(H - L) > 2 * avg(H - L, 20)"
    },
    "inside": {
      "type": "yes_no",
      "ask": "H < H[-1] and L > L[-1]"
    },
    "vol": {
      "type": "yes_no",
      "ask": "V > avg(V, 20)"
    }
  },
  "actions": [
    {
      "id": "context",
      "when": "vol >= 0",
      "do": "email",
      "connection": "head-trader",
      "subject": "Context {{symbol}} {{as_of}}",
      "message": "{{symbol}}: trend day {{trend_day|pct}}, wide range {{wide|pct}}, inside day {{inside|pct}}, volume above average {{vol|pct}}."
    }
  ]
}
Request JSON (SPY; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "SPY"
  },
  "questions": {
    "trend_day": {
      "type": "yes_no",
      "ask": "(O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))"
    },
    "wide": {
      "type": "yes_no",
      "ask": "(H - L) > 2 * avg(H - L, 20)"
    },
    "inside": {
      "type": "yes_no",
      "ask": "H < H[-1] and L > L[-1]"
    },
    "vol": {
      "type": "yes_no",
      "ask": "V > avg(V, 20)"
    }
  },
  "actions": [
    {
      "id": "context",
      "when": "vol >= 0",
      "do": "email",
      "connection": "head-trader",
      "subject": "Context {{symbol}} {{as_of}}",
      "message": "{{symbol}}: trend day {{trend_day|pct}}, wide range {{wide|pct}}, inside day {{inside|pct}}, volume above average {{vol|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (SPY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend_day": {
      "yes_no": 0.0537,
      "rule": "(O <= L + 0.2 * (H - L)) and (C >= H - 0.2 * (H - L))",
      "basis": "rule"
    },
    "wide": {
      "yes_no": 0.262,
      "rule": "(H - L) > 2 * avg(H - L, 20)",
      "basis": "rule"
    },
    "inside": {
      "yes_no": 0.0537,
      "rule": "H < H[-1] and L > L[-1]",
      "basis": "rule"
    },
    "vol": {
      "yes_no": 0.9463,
      "rule": "V > avg(V, 20)",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "SPY",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "context",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "head-trader",
      "preview": {
        "subject": "Context SPY 2026-10-30",
        "text": "SPY: trend day 5%, wide range 26%, inside day 5%, volume above average 95%."
      }
    }
  ]
}

avg offset

Prop trading firm · example 9

GLD trend-following: 55-day breakout with ADX

A classic turtle-style entry check for gold: a 55-day closing breakout in a strong trend.

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

State

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

Questions

donruleC > highest(C, 55)
55-day closing breakout
adxruleadx(14) > 25
Trending (ADX above 25)
sma_uprulesma(C, 50) > ref(sma(C, 50), -10)
The 50-day average is rising
stackedEnglish → ruleIs price above the 20-day, the 20-day above the 50-day, and the 50-day above the 200-day moving average?
rally5forecastWill it rally at least 5% at some point in the next month?
A 5% rally within a month

Answers

QuestionAnswerReading
don
55-day closing breakout
0.0537false
adx
Trending (ADX above 25)
0.2061false
sma_up
The 50-day average is rising
0.082false
stacked
Is price above the 20-day, the 20-day above the 50-day, and the 50-day above the 200-day moving average
compiled to (C > sma(C, 20)) and (sma(C, 20) > sma(C, 50)) and (sma(C, 50) > sma(C, 200))
0.0537false
rally5
A 5% rally within a month
0.50350% · close to even

Actions

Rules on the answers decide what to send.

don >= 0.6 and adx >= 0.6→Webhookprop-oms
What each action would send 0 of 1 fired · dry run, nothing sent
entryrule false: skipped

What it means

For GLD on the session of 2026-10-30: Not true: 55-day closing breakout; Trending (ADX above 25); The 50-day average is rising; Is price above the 20-day, the 20-day above the 50-day, and the 50-day above the 200-day moving average. Forecasts: A 5% rally within a month 50%. No action fired: every rule was false.

The order only goes out when both the breakout and trend strength are true.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "GLD"
  },
  "questions": {
    "don": {
      "type": "yes_no",
      "ask": "C > highest(C, 55)"
    },
    "adx": {
      "type": "yes_no",
      "ask": "adx(14) > 25"
    },
    "sma_up": {
      "type": "yes_no",
      "ask": "sma(C, 50) > ref(sma(C, 50), -10)"
    },
    "stacked": {
      "type": "yes_no",
      "instructions": "Is price above the 20-day, the 20-day above the 50-day, and the 50-day above the 200-day moving average?"
    },
    "rally5": {
      "type": "yes_no",
      "instructions": "Will it rally at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "entry",
      "when": "don >= 0.6 and adx >= 0.6",
      "do": "webhook",
      "connection": "prop-oms",
      "body": {
        "symbol": "{{symbol}}",
        "side": "buy",
        "strategy": "donchian_55",
        "stop_atr": 2,
        "p_breakout": "{{don}}",
        "p_adx": "{{adx}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (GLD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "don": {
      "yes_no": 0.0537,
      "rule": "C > highest(C, 55)",
      "basis": "rule"
    },
    "adx": {
      "yes_no": 0.2061,
      "rule": "adx(14) > 25",
      "basis": "rule"
    },
    "sma_up": {
      "yes_no": 0.082,
      "rule": "sma(C, 50) > ref(sma(C, 50), -10)",
      "basis": "rule"
    },
    "stacked": {
      "yes_no": 0.0537,
      "rule": "(C > sma(C, 20)) and (sma(C, 20) > sma(C, 50)) and (sma(C, 50) > sma(C, 200))",
      "basis": "pattern"
    },
    "rally5": {
      "yes_no": 0.503
    }
  },
  "context": {
    "symbol": "GLD",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "entry",
      "fired": false,
      "status": "skipped"
    }
  ]
}

adx highest ref sma

Prop trading firm · example 10

Bullish candle scan: hammers, morning stars and soldiers

Scan large caps for bullish reversal and continuation candles for the swing book.

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

State

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

Questions

hammerrulehammer()
hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back.
inv_hammerruleinverted_hammer()
inverted hammer candle: Shooting-star shape after a five-bar decline.
morningrulemorning_star()
morning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first.
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

Symbolhammerruleinv_hammerrulemorningrulesoldiersruleup_weekforecast
AAPL0.17950.05370.08050.07770.59
MSFT0.57010.05370.06310.06030.574
JPM0.05470.05370.05920.05970.558
WMT0.06530.17330.08980.09220.535
XOM0.09710.10890.16350.08330.577

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: hammer candle: Lower wick at least twice the body, upper wick at most 10% of the range, closing below the close five bars back.: true for none of 5. inverted hammer candle: Shooting-star shape after a five-bar decline.: true for none of 5. morning star candle: A red bar, a small bar (half its body or less) that stays under its close, then a green bar closing above the middle of the first.: true for none of 5. three white soldiers candle: Three green bars, each closing higher and opening inside the previous body.: true for none of 5. Highest odds for “Higher in a week”: AAPL at 59%.

A pattern hit is a candidate, not a trade; traders check the trend and level before acting.

Request JSON (AAPL; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AAPL"
  },
  "questions": {
    "hammer": {
      "type": "yes_no",
      "ask": "hammer()"
    },
    "inv_hammer": {
      "type": "yes_no",
      "ask": "inverted_hammer()"
    },
    "morning": {
      "type": "yes_no",
      "ask": "morning_star()"
    },
    "soldiers": {
      "type": "yes_no",
      "ask": "three_white_soldiers()"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  }
}
Response JSON (AAPL, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "hammer": {
      "yes_no": 0.1795,
      "rule": "hammer()",
      "basis": "rule"
    },
    "inv_hammer": {
      "yes_no": 0.0537,
      "rule": "inverted_hammer()",
      "basis": "rule"
    },
    "morning": {
      "yes_no": 0.0805,
      "rule": "morning_star()",
      "basis": "rule"
    },
    "soldiers": {
      "yes_no": 0.0777,
      "rule": "three_white_soldiers()",
      "basis": "rule"
    },
    "up_week": {
      "yes_no": 0.59
    }
  },
  "context": {
    "symbol": "AAPL",
    "as_of": "2026-10-30"
  }
}

hammer inverted_hammer morning_star three_white_soldiers

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 Sell side: Equity research analyst, Sell-side sales trader, Execution trader / desk, Market maker, Compliance officer.

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