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

Trading educator / newsletter: 20 ways to use Ora

Lessons and newsletters built on real setups, with the rule shown next to every claim. Each example is a complete, runnable request with the real answers it returned (32 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 (62)

ref 7sma 6offset 4rsi 3avg 3highest 3swinghigh 3swinglow 3atr 3std 2morning_star 2evening_star 2bbupper 2min 2cci 2iif 1dragonfly_doji 1engulfing_bull 1hammer 1harami_bull 1piercing_line 1dark_cloud 1engulfing_bear 1gravestone_doji 1hanging_man 1shooting_star 1beat_eps_last 1beat_streak 1days_to_earnings 1macd 1bblower 1bbmid 1log 1sqrt 1lowest 1days_to_ex_div 1div_count_ttm 1div_yield_ttm 1raised_last 1years_of_growth 1gap_up 1stochd 1stochk 1willr 1max 1roc 1spinning_top 1three_black_crows 1three_white_soldiers 1barssince 1highestbars 1linreg 1lowestbars 1percentrank 1adx 1diminus 1diplus 1ema 1obv 1inside_bar 1marubozu 1outside_bar 1

Examples 11–20 of 20 · page 2 of 2

Trading educator / newsletter · example 11

Lesson: building an income watchlist (JNJ, PG, PEP, O)

Teach yield, growth streaks, monthly payers and ex-dates with real dividend facts.

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

Questions

yield3English → ruleIs the dividend yield above 3%?
grow25English → ruleHas the stock grown its dividend for 25 years in a row?
monthlyEnglish → ruleDoes the stock pay a monthly dividend?
exEnglish → ruleIs the ex-dividend date within 30 days?
raisedEnglish → ruleDid the stock raise its dividend last time?

Answers

Symbolyield3rulegrow25rulemonthlyruleexruleraisedruleFired
JNJ0.06480.94630.05370.91870.1409ex_note
PG0.20910.94630.05370.05370.1409none
PEP0.94630.94630.05370.05370.1409none
O0.94630.05370.93170.05370.1409none

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.

ex >= 0.6→Emailstudents
JNJ 1 of 1 fired · dry run, nothing sent
ex_notewould send (dry run)Email → students
{
  "subject": "JNJ goes ex-dividend soon",
  "text": "JNJ (2026-10-30) has a declared ex-date within 30 days. Yield over 3% 6%, 25-year grower 95%. Exercise: what does an owner need to do to receive it?"
}
PG 0 of 1 fired · dry run, nothing sent
PEP 0 of 1 fired · dry run, nothing sent
O 0 of 1 fired · dry run, nothing sent

What it means

Session of 2026-10-30, 4 symbols: Is the dividend yield above 3%: true for PEP, O of 4. Has the stock grown its dividend for 25 years in a row: true for JNJ, PG, PEP of 4. Does the stock pay a monthly dividend: true for O of 4. Is the ex-dividend date within 30 days: true for JNJ of 4. ex_note fired for JNJ.

Each fact comes from the dividend record; students see that a high yield and a long growth streak are different things.

Request JSON (JNJ; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JNJ"
  },
  "questions": {
    "yield3": {
      "type": "yes_no",
      "instructions": "Is the dividend yield above 3%?"
    },
    "grow25": {
      "type": "yes_no",
      "instructions": "Has the stock grown its dividend for 25 years in a row?"
    },
    "monthly": {
      "type": "yes_no",
      "instructions": "Does the stock pay a monthly dividend?"
    },
    "ex": {
      "type": "yes_no",
      "instructions": "Is the ex-dividend date within 30 days?"
    },
    "raised": {
      "type": "yes_no",
      "instructions": "Did the stock raise its dividend last time?"
    }
  },
  "actions": [
    {
      "id": "ex_note",
      "when": "ex >= 0.6",
      "do": "email",
      "connection": "students",
      "subject": "{{symbol}} goes ex-dividend soon",
      "message": "{{symbol}} ({{as_of}}) has a declared ex-date within 30 days. Yield over 3% {{yield3|pct}}, 25-year grower {{grow25|pct}}. Exercise: what does an owner need to do to receive it?"
    }
  ],
  "dry_run": true
}
Response JSON (JNJ, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "yield3": {
      "yes_no": 0.0648,
      "rule": "div_yield_ttm > 3",
      "basis": "pattern"
    },
    "grow25": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 25",
      "basis": "pattern"
    },
    "monthly": {
      "yes_no": 0.0537,
      "rule": "div_count_ttm >= 11",
      "basis": "pattern"
    },
    "ex": {
      "yes_no": 0.9187,
      "rule": "days_to_ex_div <= 30",
      "basis": "pattern"
    },
    "raised": {
      "yes_no": 0.1409,
      "rule": "raised_last > 0.5",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "JNJ",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "ex_note",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "students",
      "preview": {
        "subject": "JNJ goes ex-dividend soon",
        "text": "JNJ (2026-10-30) has a declared ex-date within 30 days. Yield over 3% 6%, 25-year grower 95%. Exercise: what does an owner need to do to receive it?"
      }
    }
  ]
}

days_to_ex_div div_count_ttm div_yield_ttm raised_last years_of_growth

Trading educator / newsletter · example 12

Member alert: 'stretched' warning for NFLX, sent by email

Email paying members when a widely followed name gets stretched, as a teaching moment about chasing.

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

State

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

Questions

stretchedEnglish → ruleIs price extended more than 2 ATR above its 20-day average?
upperEnglish → ruleDid the stock close above the upper Bollinger Band?
ccirulecci(20) > 150
CCI above 150
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.061false
upper
Did the stock close above the upper Bollinger Band
compiled to C > bbupper(C, 20)
0.057false
cci
CCI above 150
0.0603false
drop5
A 5% drawdown within a month
0.62763% · likely

Actions

Rules on the answers decide what to send.

stretched >= 0.6 or upper >= 0.6→Emailmembers
else→Slackeditor-log
What each action would send 1 of 2 fired · dry run, nothing sent
teachrule false: skipped
nonewould send (dry run)Slack → editor-log
{
  "text": "NFLX (2026-10-30): not stretched today, no member email."
}

What it means

For NFLX on the session of 2026-10-30: Not true: Is price extended more than 2 ATR above its 20-day average; Did the stock close above the upper Bollinger Band; CCI above 150. Forecasts: A 5% drawdown within a month 63%. Fired: none (Slack → editor-log).

The email teaches a concept with a live example and a disclaimer; the editor log records why nothing went out on quiet days.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NFLX"
  },
  "questions": {
    "stretched": {
      "type": "yes_no",
      "instructions": "Is price extended more than 2 ATR above its 20-day average?"
    },
    "upper": {
      "type": "yes_no",
      "instructions": "Did the stock close above the upper Bollinger Band?"
    },
    "cci": {
      "type": "yes_no",
      "ask": "cci(20) > 150"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "teach",
      "when": "stretched >= 0.6 or upper >= 0.6",
      "do": "email",
      "connection": "members",
      "subject": "Teaching moment: {{symbol}} is stretched",
      "message": "{{symbol}} ({{as_of}}) is more than 2 ATR above its 20-day ({{stretched|pct}}) or above its upper band ({{upper|pct}}). Odds of a 5% drop within a month: {{drop5|pct}}. Lesson: stretched is not the same as overvalued. Education only."
    },
    {
      "id": "none",
      "when": "else",
      "do": "slack",
      "connection": "editor-log",
      "message": "{{symbol}} ({{as_of}}): not stretched today, no member email."
    }
  ],
  "dry_run": true
}
Response JSON (NFLX, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "stretched": {
      "yes_no": 0.061,
      "rule": "C - sma(C, 20) > 2 * atr(14)",
      "basis": "pattern"
    },
    "upper": {
      "yes_no": 0.057,
      "rule": "C > bbupper(C, 20)",
      "basis": "comparison"
    },
    "cci": {
      "yes_no": 0.0603,
      "rule": "cci(20) > 150",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.627
    }
  },
  "context": {
    "symbol": "NFLX",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "teach",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "none",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "editor-log",
      "preview": {
        "text": "NFLX (2026-10-30): not stretched today, no member email."
      }
    }
  ]
}

atr bbupper cci sma

Trading educator / newsletter · example 13

Lesson: gaps up, gaps down and gap fills on AMD

Show the gap vocabulary with real answers: gap, unfilled gap, gap fill and faded gap.

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

open_aboveEnglish → ruleDid the stock open above yesterday's close?
unfilledEnglish → ruleDid the stock gap up with today's low above yesterday's high?
fillEnglish → ruleDid today's gap up fill?
fadedruleO > C[-1] and C < C[-1]
Gapped up but closed under yesterday's close
gap_tomorrowforecastWill it gap up tomorrow?
A gap up tomorrow

Answers

QuestionAnswerReading
open_above
Did the stock open above yesterday's close
compiled to O > C[-1]
0.0537false
unfilled
Did the stock gap up with today's low above yesterday's high
compiled to gap_up()
0.0537false
fill
Did today's gap up fill
compiled to (O > C[-1] * 1) and (L <= C[-1])
0.0537false
faded
Gapped up but closed under yesterday's close
0.0537false
gap_tomorrow
A gap up tomorrow
0.36336% · unlikely

What it means

For AMD on the session of 2026-10-30: Not true: Did the stock open above yesterday's close; Did the stock gap up with today's low above yesterday's high; Did today's gap up fill; Gapped up but closed under yesterday's close. Forecasts: A gap up tomorrow 36%.

Gap questions about yesterday are facts; whether it gaps tomorrow is a forecast, and the lesson shows both side by side.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AMD"
  },
  "questions": {
    "open_above": {
      "type": "yes_no",
      "instructions": "Did the stock open above yesterday's close?"
    },
    "unfilled": {
      "type": "yes_no",
      "instructions": "Did the stock gap up with today's low above yesterday's high?"
    },
    "fill": {
      "type": "yes_no",
      "instructions": "Did today's gap up fill?"
    },
    "faded": {
      "type": "yes_no",
      "ask": "O > C[-1] and C < C[-1]"
    },
    "gap_tomorrow": {
      "type": "yes_no",
      "instructions": "Will it gap up tomorrow?"
    }
  }
}
Response JSON (AMD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "open_above": {
      "yes_no": 0.0537,
      "rule": "O > C[-1]",
      "basis": "comparison"
    },
    "unfilled": {
      "yes_no": 0.0537,
      "rule": "gap_up()",
      "basis": "pattern"
    },
    "fill": {
      "yes_no": 0.0537,
      "rule": "(O > C[-1] * 1) and (L <= C[-1])",
      "basis": "pattern"
    },
    "faded": {
      "yes_no": 0.0537,
      "rule": "O > C[-1] and C < C[-1]",
      "basis": "rule"
    },
    "gap_tomorrow": {
      "yes_no": 0.363
    }
  },
  "context": {
    "symbol": "AMD",
    "as_of": "2026-10-30"
  }
}

gap_up offset

Trading educator / newsletter · example 14

Lesson: stochastic, Williams %R and CCI on DIS

Compare three range oscillators on the same stock and day.

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

State

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

Questions

stoch_osEnglish → ruleIs the stock oversold on the stochastic, below 20?
kdrulestochk(14) > stochd(14)
stochastic %K above %D
willrrulewillr(14) < -80
Williams %R below -80
ccirulecci(20) < -100
CCI below -100

Answers

QuestionAnswerReading
stoch_os
Is the stock oversold on the stochastic, below 20
compiled to stochk(14, 3, 3) < 20
0.1323false
kd
stochastic %K above %D
0.2687false
willr
Williams %R below -80
0.1055false
cci
CCI below -100
0.0781false

What it means

For DIS on the session of 2026-10-30: Not true: Is the stock oversold on the stochastic, below 20; stochastic %K above %D; Williams %R below -80; CCI below -100.

All three measure where the close sits in a recent range; students see when they agree and how their scales differ.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "DIS"
  },
  "questions": {
    "stoch_os": {
      "type": "yes_no",
      "instructions": "Is the stock oversold on the stochastic, below 20?"
    },
    "kd": {
      "type": "yes_no",
      "ask": "stochk(14) > stochd(14)"
    },
    "willr": {
      "type": "yes_no",
      "ask": "willr(14) < -80"
    },
    "cci": {
      "type": "yes_no",
      "ask": "cci(20) < -100"
    }
  }
}
Response JSON (DIS, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "stoch_os": {
      "yes_no": 0.1323,
      "rule": "stochk(14, 3, 3) < 20",
      "basis": "pattern"
    },
    "kd": {
      "yes_no": 0.2687,
      "rule": "stochk(14) > stochd(14)",
      "basis": "rule"
    },
    "willr": {
      "yes_no": 0.1055,
      "rule": "willr(14) < -80",
      "basis": "rule"
    },
    "cci": {
      "yes_no": 0.0781,
      "rule": "cci(20) < -100",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "DIS",
    "as_of": "2026-10-30"
  }
}

cci stochd stochk willr

Trading educator / newsletter · example 15

Lesson: relative strength across sectors (XLK, XLU, XLE, XLV)

Teach relative strength with momentum rules and the beat-SPY forecast on four sectors.

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

State

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

Questions

rocruleroc(C, 20) > 5
Up more than 5% in 20 sessions
monthEnglish → ruleIs the stock up over the last month?
leaderruleroc(C, 63) > 10 and C >= 0.95 * max(H, 63)
Up more than 10% in a quarter, near the high
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symbolrocrulemonthruleleaderrulebeat_spyforecast
XLK0.05370.06540.06240.498
XLU0.82820.92590.05490.445
XLE0.8970.94190.93360.55
XLV0.91570.94540.83220.534

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: Up more than 5% in 20 sessions: true for XLU, XLE, XLV of 4. Is the stock up over the last month: true for XLU, XLE, XLV of 4. Up more than 10% in a quarter, near the high: true for XLE, XLV of 4. Highest odds for “Beating SPY over a month”: XLE at 55%.

Students rank sectors by true momentum rules and then compare with the forecast, learning that past strength and future odds differ.

Request JSON (XLK; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "XLK"
  },
  "questions": {
    "roc": {
      "type": "yes_no",
      "ask": "roc(C, 20) > 5"
    },
    "month": {
      "type": "yes_no",
      "instructions": "Is the stock up over the last month?"
    },
    "leader": {
      "type": "yes_no",
      "ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  }
}
Response JSON (XLK, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "roc": {
      "yes_no": 0.0537,
      "rule": "roc(C, 20) > 5",
      "basis": "rule"
    },
    "month": {
      "yes_no": 0.0654,
      "rule": "C > C[-21]",
      "basis": "pattern"
    },
    "leader": {
      "yes_no": 0.0624,
      "rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.498
    }
  },
  "context": {
    "symbol": "XLK",
    "as_of": "2026-10-30"
  }
}

max offset roc

Trading educator / newsletter · example 16

Lesson: stops, targets and position size on HD

Walk through a trade plan with real numbers: stop distance, risk/reward and a position-size check.

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

State

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

Questions

stopEnglish → ruleIs a stop below the last swing low less than 1.5 ATR away?
rrEnglish → ruleIs the risk/reward at least 2:1, targeting the last swing high with a stop at the last swing low?
sizerule0.01 / (2 * atr(14) / C) >= 0.25
A 2-ATR stop risking 1% allows at least a 25% position
liquidEnglish → ruleDoes the stock trade more than $50 million a day on average?
stop_hitforecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
stop
Is a stop below the last swing low less than 1.5 ATR away
compiled to (C > swinglow(5, 1)) and (C - swinglow(5, 1) < 1.5 * atr(14))
0.097false
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.1341false
size
A 2-ATR stop risking 1% allows at least a 25% position
0.0859false
liquid
Does the stock trade more than $50 million a day on average
compiled to avg(C * V, 20) > 50000000
0.9463true
stop_hit
A 5% drawdown within a month
0.45746% · close to even

Actions

Rules on the answers decide what to send.

stop >= 0.6 and rr >= 0.6 and liquid >= 0.6→Webhookcourse-platform
else→Webhookcourse-platform
What each action would send 1 of 2 fired · dry run, nothing sent
plan_okrule false: skipped
plan_failswould send (dry run)Webhook → course-platform
{
  "lesson": "trade_plan",
  "symbol": "HD",
  "verdict": "plan_fails_a_check",
  "stop_close": 0.097,
  "reward_2to1": 0.1341,
  "as_of": "2026-10-30"
}

What it means

For HD on the session of 2026-10-30: True now: Does the stock trade more than $50 million a day on average. Not true: Is a stop below the last swing low less than 1.5 ATR away; Is the risk/reward at least 2:1, targeting the last swing high with a stop at the last swing low; A 2-ATR stop risking 1% allows at least a 25% position. Forecasts: A 5% drawdown within a month 46%. Fired: plan_fails (Webhook → course-platform).

The plan's pieces are exact checks on today's data; the drawdown forecast shows students that a good plan can still lose.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "HD"
  },
  "questions": {
    "stop": {
      "type": "yes_no",
      "instructions": "Is a stop below the last swing low less than 1.5 ATR away?"
    },
    "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?"
    },
    "size": {
      "type": "yes_no",
      "ask": "0.01 / (2 * atr(14) / C) >= 0.25"
    },
    "liquid": {
      "type": "yes_no",
      "instructions": "Does the stock trade more than $50 million a day on average?"
    },
    "stop_hit": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "plan_ok",
      "when": "stop >= 0.6 and rr >= 0.6 and liquid >= 0.6",
      "do": "webhook",
      "connection": "course-platform",
      "body": {
        "lesson": "trade_plan",
        "symbol": "{{symbol}}",
        "verdict": "plan_meets_checks",
        "p_drop5": "{{stop_hit}}",
        "as_of": "{{as_of}}"
      }
    },
    {
      "id": "plan_fails",
      "when": "else",
      "do": "webhook",
      "connection": "course-platform",
      "body": {
        "lesson": "trade_plan",
        "symbol": "{{symbol}}",
        "verdict": "plan_fails_a_check",
        "stop_close": "{{stop}}",
        "reward_2to1": "{{rr}}",
        "as_of": "{{as_of}}"
      }
    }
  ],
  "dry_run": true
}
Response JSON (HD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "stop": {
      "yes_no": 0.097,
      "rule": "(C > swinglow(5, 1)) and (C - swinglow(5, 1) < 1.5 * atr(14))",
      "basis": "pattern"
    },
    "rr": {
      "yes_no": 0.1341,
      "rule": "(C > swinglow(5, 1)) and (C < swinghigh(5, 1)) and (swinghigh(5, 1) - C >= 2 * (C - swinglow(5, 1)))",
      "basis": "pattern"
    },
    "size": {
      "yes_no": 0.0859,
      "rule": "0.01 / (2 * atr(14) / C) >= 0.25",
      "basis": "rule"
    },
    "liquid": {
      "yes_no": 0.9463,
      "rule": "avg(C * V, 20) > 50000000",
      "basis": "pattern"
    },
    "stop_hit": {
      "yes_no": 0.457
    }
  },
  "context": {
    "symbol": "HD",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "plan_ok",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "plan_fails",
      "fired": true,
      "status": "dry_run",
      "do": "webhook",
      "connection": "course-platform",
      "preview": {
        "body": {
          "lesson": "trade_plan",
          "symbol": "HD",
          "verdict": "plan_fails_a_check",
          "stop_close": 0.097,
          "reward_2to1": 0.1341,
          "as_of": "2026-10-30"
        }
      }
    }
  ]
}

atr avg swinghigh swinglow

Trading educator / newsletter · example 17

Lesson: three-candle patterns on GLD

Teach three white soldiers, three black crows, morning star and evening star on a commodity fund.

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

State

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

Questions

soldiersEnglish → ruleAre the last three candles three white soldiers?
crowsEnglish → ruleAre the last three candles three black crows?
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.
eveningruleevening_star()
evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.
spinningEnglish → ruleIs today's candle a spinning top?

Answers

QuestionAnswerReading
soldiers
Are the last three candles three white soldiers
compiled to three_white_soldiers()
0.064false
crows
Are the last three candles three black crows
compiled to three_black_crows()
0.0907false
morning
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.
0.0643false
evening
evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.
0.1476false
spinning
Is today's candle a spinning top
compiled to spinning_top()
0.0625false

What it means

For GLD on the session of 2026-10-30: Not true: Are the last three candles three white soldiers; Are the last three candles three black crows; 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.; evening star candle: A green bar, a small bar that stays above its close, then a red bar closing below the middle of the first.; Is today's candle a spinning top.

Three-candle patterns need three bars to line up, which is why they are rarer than one-bar candles.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "GLD"
  },
  "questions": {
    "soldiers": {
      "type": "yes_no",
      "instructions": "Are the last three candles three white soldiers?"
    },
    "crows": {
      "type": "yes_no",
      "instructions": "Are the last three candles three black crows?"
    },
    "morning": {
      "type": "yes_no",
      "ask": "morning_star()"
    },
    "evening": {
      "type": "yes_no",
      "ask": "evening_star()"
    },
    "spinning": {
      "type": "yes_no",
      "instructions": "Is today's candle a spinning top?"
    }
  }
}
Response JSON (GLD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "soldiers": {
      "yes_no": 0.064,
      "rule": "three_white_soldiers()",
      "basis": "pattern"
    },
    "crows": {
      "yes_no": 0.0907,
      "rule": "three_black_crows()",
      "basis": "pattern"
    },
    "morning": {
      "yes_no": 0.0643,
      "rule": "morning_star()",
      "basis": "rule"
    },
    "evening": {
      "yes_no": 0.1476,
      "rule": "evening_star()",
      "basis": "rule"
    },
    "spinning": {
      "yes_no": 0.0625,
      "rule": "spinning_top()",
      "basis": "pattern"
    }
  },
  "context": {
    "symbol": "GLD",
    "as_of": "2026-10-30"
  }
}

evening_star morning_star spinning_top three_black_crows three_white_soldiers

Trading educator / newsletter · example 18

Advanced lesson: linear regression, percent rank and bars-since on MU

For advanced students: three functions that measure slope, rank and time, on one stock.

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

State

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

Questions

sloperulelinreg(C, 20) > ref(linreg(C, 20), -5)
20-day regression line rising over a week
rankrulepercentrank(C, 252) > 80
close in the top fifth of the last year
sincerulebarssince(C > highest(C, 20)) <= 10
a 20-day closing breakout within the last 10 sessions
high_agerulehighestbars(H, 60) <= 5
the 60-day high set in the last 5 sessions
low_agerulelowestbars(L, 60) >= 40
the 60-day low at least 40 sessions old

Answers

QuestionAnswerReading
slope
20-day regression line rising over a week
0.5669on the line (true)
rank
close in the top fifth of the last year
0.08false
since
a 20-day closing breakout within the last 10 sessions
0.121false
high_age
the 60-day high set in the last 5 sessions
0.1334false
low_age
the 60-day low at least 40 sessions old
0.8782true

What it means

For MU on the session of 2026-10-30: True now: the 60-day low at least 40 sessions old. Not true: close in the top fifth of the last year; a 20-day closing breakout within the last 10 sessions; the 60-day high set in the last 5 sessions. On the line: 20-day regression line rising over a week.

These functions answer how steep, how high relative to history and how long ago; together they describe a trend's age.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MU"
  },
  "questions": {
    "slope": {
      "type": "yes_no",
      "ask": "linreg(C, 20) > ref(linreg(C, 20), -5)"
    },
    "rank": {
      "type": "yes_no",
      "ask": "percentrank(C, 252) > 80"
    },
    "since": {
      "type": "yes_no",
      "ask": "barssince(C > highest(C, 20)) <= 10"
    },
    "high_age": {
      "type": "yes_no",
      "ask": "highestbars(H, 60) <= 5"
    },
    "low_age": {
      "type": "yes_no",
      "ask": "lowestbars(L, 60) >= 40"
    }
  }
}
Response JSON (MU, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "slope": {
      "yes_no": 0.5669,
      "rule": "linreg(C, 20) > ref(linreg(C, 20), -5)",
      "basis": "rule"
    },
    "rank": {
      "yes_no": 0.08,
      "rule": "percentrank(C, 252) > 80",
      "basis": "rule"
    },
    "since": {
      "yes_no": 0.121,
      "rule": "barssince(C > highest(C, 20)) <= 10",
      "basis": "rule"
    },
    "high_age": {
      "yes_no": 0.1334,
      "rule": "highestbars(H, 60) <= 5",
      "basis": "rule"
    },
    "low_age": {
      "yes_no": 0.8782,
      "rule": "lowestbars(L, 60) >= 40",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "MU",
    "as_of": "2026-10-30"
  }
}

barssince highest highestbars linreg lowestbars percentrank ref

Trading educator / newsletter · example 19

Cohort challenge: which bank stock has the cleanest uptrend?

A weekly challenge where students rank four banks; the answers are posted after submissions close.

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

State

{"symbol":"JPM"} then BAC, WFC, C, one request each. The server fills in the latest completed session.

Questions

stackedruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
adxruleadx(14) > 20 and diplus(14) > diminus(14)
Trending up (ADX over 20 and +DI over −DI)
obvruleobv() > sma(obv(), 20)
On-balance volume above its 20-day average
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symbolstackedruleadxruleobvrulebeat_spyforecastFired
JPM0.23090.10120.88170.488reveal
BAC0.08990.12140.39480.473reveal
WFC0.16970.12710.92120.505reveal
C0.0570.08910.68610.476reveal

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.

stacked >= 0→Slackcohort-channel
JPM 1 of 1 fired · dry run, nothing sent
revealwould send (dry run)Slack → cohort-channel
{
  "text": "Challenge reveal JPM (2026-10-30): stacked averages 23%, ADX uptrend 10%, OBV rising 88%, beat SPY next month 49%."
}
BAC 1 of 1 fired · dry run, nothing sent
revealwould send (dry run)Slack → cohort-channel
{
  "text": "Challenge reveal BAC (2026-10-30): stacked averages 9%, ADX uptrend 12%, OBV rising 39%, beat SPY next month 47%."
}
WFC 1 of 1 fired · dry run, nothing sent
revealwould send (dry run)Slack → cohort-channel
{
  "text": "Challenge reveal WFC (2026-10-30): stacked averages 17%, ADX uptrend 13%, OBV rising 92%, beat SPY next month 50%."
}
C 1 of 1 fired · dry run, nothing sent
revealwould send (dry run)Slack → cohort-channel
{
  "text": "Challenge reveal C (2026-10-30): stacked averages 6%, ADX uptrend 9%, OBV rising 69%, beat SPY next month 48%."
}

What it means

Session of 2026-10-30, 4 symbols: Stacked averages: close > 20 EMA > 50 > 200: true for none of 4. Trending up (ADX over 20 and +DI over −DI): true for none of 4. On-balance volume above its 20-day average: true for JPM, WFC, C of 4. Highest odds for “Beating SPY over a month”: WFC at 51%. reveal fired for JPM, BAC, WFC, C.

Students compare their ranking with the rule answers; the forecast column reminds them that a clean trend is not a guarantee.

Request JSON (JPM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JPM"
  },
  "questions": {
    "stacked": {
      "type": "yes_no",
      "ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
    },
    "adx": {
      "type": "yes_no",
      "ask": "adx(14) > 20 and diplus(14) > diminus(14)"
    },
    "obv": {
      "type": "yes_no",
      "ask": "obv() > sma(obv(), 20)"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  },
  "actions": [
    {
      "id": "reveal",
      "when": "stacked >= 0",
      "do": "slack",
      "connection": "cohort-channel",
      "message": "Challenge reveal {{symbol}} ({{as_of}}): stacked averages {{stacked|pct}}, ADX uptrend {{adx|pct}}, OBV rising {{obv|pct}}, beat SPY next month {{beat_spy|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (JPM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "stacked": {
      "yes_no": 0.2309,
      "rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "adx": {
      "yes_no": 0.1012,
      "rule": "adx(14) > 20 and diplus(14) > diminus(14)",
      "basis": "rule"
    },
    "obv": {
      "yes_no": 0.8817,
      "rule": "obv() > sma(obv(), 20)",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.488
    }
  },
  "context": {
    "symbol": "JPM",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "reveal",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "cohort-channel",
      "preview": {
        "text": "Challenge reveal JPM (2026-10-30): stacked averages 23%, ADX uptrend 10%, OBV rising 88%, beat SPY next month 49%."
      }
    }
  ]
}

adx diminus diplus ema obv sma

Trading educator / newsletter · example 20

Lesson: inside bars, outside bars and NR7 on BA

Teach range contraction and expansion bars with live answers.

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

State

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

Questions

insideruleinside_bar()
inside bar candle: Today's high and low are inside yesterday's (equal counts).
outsideruleoutside_bar()
outside bar candle: Today's high above yesterday's and low below it.
nr7English → ruleIs today an NR7 day, the narrowest range of the last 7 sessions?
marubozurulemarubozu()
marubozu candle: Body at least 90% of the range: almost no wicks.
bigforecastWill there be a big move in either direction in the next 5 days?
A big move either way in 5 days

Answers

QuestionAnswerReading
inside
inside bar candle: Today's high and low are inside yesterday's (equal counts).
0.6355true
outside
outside bar candle: Today's high above yesterday's and low below it.
0.2043false
nr7
Is today an NR7 day, the narrowest range of the last 7 sessions
compiled to (H > L) and ((H - L) <= ref(min(H - L, 6), -1))
0.5326on the line (true)
marubozu
marubozu candle: Body at least 90% of the range: almost no wicks.
0.0655false
big
A big move either way in 5 days
0.17217% · unlikely

Actions

Rules on the answers decide what to send.

inside >= 0.6 or nr7 >= 0.6→Emailstudents
What each action would send 1 of 1 fired · dry run, nothing sent
setupwould send (dry run)Email → students
{
  "subject": "Homework: contraction bar on BA",
  "text": "BA (2026-10-30) printed an inside bar (64%) or an NR7 (53%). Big move in 5 days: 17%. Track what happens next."
}

What it means

For BA on the session of 2026-10-30: True now: inside bar candle: Today's high and low are inside yesterday's (equal counts).. Not true: outside bar candle: Today's high above yesterday's and low below it.; marubozu candle: Body at least 90% of the range: almost no wicks.. On the line: Is today an NR7 day, the narrowest range of the last 7 sessions. Forecasts: A big move either way in 5 days 17%. Fired: setup (Email → students).

Contraction bars often come before expansion; the forecast for a big move lets students test that idea on real odds.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "BA"
  },
  "questions": {
    "inside": {
      "type": "yes_no",
      "ask": "inside_bar()"
    },
    "outside": {
      "type": "yes_no",
      "ask": "outside_bar()"
    },
    "nr7": {
      "type": "yes_no",
      "instructions": "Is today an NR7 day, the narrowest range of the last 7 sessions?"
    },
    "marubozu": {
      "type": "yes_no",
      "ask": "marubozu()"
    },
    "big": {
      "type": "yes_no",
      "instructions": "Will there be a big move in either direction in the next 5 days?"
    }
  },
  "actions": [
    {
      "id": "setup",
      "when": "inside >= 0.6 or nr7 >= 0.6",
      "do": "email",
      "connection": "students",
      "subject": "Homework: contraction bar on {{symbol}}",
      "message": "{{symbol}} ({{as_of}}) printed an inside bar ({{inside|pct}}) or an NR7 ({{nr7|pct}}). Big move in 5 days: {{big|pct}}. Track what happens next."
    }
  ],
  "dry_run": true
}
Response JSON (BA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "inside": {
      "yes_no": 0.6355,
      "rule": "inside_bar()",
      "basis": "rule"
    },
    "outside": {
      "yes_no": 0.2043,
      "rule": "outside_bar()",
      "basis": "rule"
    },
    "nr7": {
      "yes_no": 0.5326,
      "rule": "(H > L) and ((H - L) <= ref(min(H - L, 6), -1))",
      "basis": "pattern"
    },
    "marubozu": {
      "yes_no": 0.0655,
      "rule": "marubozu()",
      "basis": "rule"
    },
    "big": {
      "yes_no": 0.172
    }
  },
  "context": {
    "symbol": "BA",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "setup",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "students",
      "preview": {
        "subject": "Homework: contraction bar on BA",
        "text": "BA (2026-10-30) printed an inside bar (64%) or an NR7 (53%). Big move in 5 days: 17%. Track what happens next."
      }
    }
  ]
}

inside_bar marubozu min outside_bar ref

Information, not investment advice. Rules answer from the latest completed daily session; forecasts are probabilities. Actions ran as dry runs: nothing was sent. More in Builders: Quant developer, Fintech app builder, Robo-advisor, Broker app, Algo / bot developer, Data vendor / platform.

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