Trade Alerts (Telegram)
When auto-execute is OFF, the bot messages you on Telegram before every trade, with Approve / Reject buttons. You can also approve right here on the dashboard.
Equity Over Time (bot-tracked snapshots)
Portfolio Allocation
Open Positions
| Ticker | Type | Qty | Avg Entry | Current | Value | Unreal. P&L | Bot Stop |
|---|
Watchlist — stocks, crypto & other products
Suggestions come from Alpaca's real tradable asset list, so you can only add symbols that actually exist. Crypto tickers are auto-formatted as pairs (e.g. "BTC" becomes "BTC/USD"), and the sector selector is hidden for crypto — every crypto asset shares one "Crypto" sector, so a sector tag wouldn't differentiate anything. Crypto trades 24/7 and isn't limited to market hours; stocks still are.
These add the current constituents and keep the list auto-updated daily. Note: adding the full Nasdaq-100 means ~100 tickers evaluated every cycle (and heartbeat) — more Alpaca calls; use a longer poll interval if needed.
| Ticker | Name | Type | Sector |
|---|
Price chart with buy/sell signals
Solid green/red triangles = actual executed trades. Hollow triangles = backtested signals from your current strategy config. Scroll/pinch to zoom, drag to pan, hover a point to see EMA/ATR for that day.
Strategy vs. simply buying and holding, over the same displayed period -- both rebased to 0% at the start of this view. This uses the backtested signal replay (in/out of the position, no partial sizing), not actual executed trades, so it works even before the bot has traded anything for real.
Ask Claude to assess your strategy. It sees your live config (stocks & crypto), watchlist, open positions, recent trades, the portfolio summary, and the chart currently in view — then suggests concrete adaptations. Requires a Claude API key in the Connectors tab.
Portfolio-wide risk (applies to stocks and crypto together)
Drawdown halt is capped at 10% max and floored at 0.5% -- the server enforces this even if you type something outside that range. Max concurrent positions is capped at 15 to keep each poll cycle's workload (Alpaca API calls) manageable. Heartbeat runs independently of trading checks -- it just confirms data is flowing and logs current EMA/ATR for every ticker. Changes take effect immediately if the bot is running.
SEC Filing Monitor (stocks only)
Requires a Claude API key in the Connectors tab. A new position can only ever open from a Form 4 open-market purchase ranked strictly above this threshold -- an 8-K can inform a sell on an existing position, but never opens a new one on its own. See the Strategy Guide tab for the full decision logic.
Backfill status: -
Candle size -- stocks
Every "close" used below (EMA, ATR, volume) is the close of one candle at this size -- daily by default. Smaller candles react faster but generate more noise. See the Strategy Guide tab before changing this.
Buy sizing -- stocks
Sell (trailing stop) -- stocks
The trailing stop always fires unconditionally when price hits it -- no trend gate, no overrides. Default 100% = a full exit every time.
Trend filter -- stocks
Buy trend = price > EMA(x1) > EMA(x2), all three in that order. x1 should always be smaller than x2.
Buy confirmation -- stocks
On top of the trend filter above, a buy also requires price to clear EMA(x1) by this many x ATR (not just barely above it), AND that the up-trend has held for this many consecutive closed candles -- filters out single-bar blips. Sells are unaffected.
Stop loss -- stocks
Volume filter -- stocks (optional extra safety check on buys)
Applies to buys only -- a stop-loss sell is a risk control and should never be blocked by low volume.
Candle size -- crypto
Crypto trades 24/7, so smaller candles here mean genuinely continuous re-evaluation, not just "more checks during market hours." See the Strategy Guide tab before changing this.
Buy sizing -- crypto
No sector cap here -- every crypto asset shares the same "Crypto" sector tag, so a sector-diversification rule wouldn't meaningfully differentiate anything. Use "Max allocation per trade" and "Max concurrent positions" (Portfolio-wide risk, above) to control crypto concentration instead.
Sell (trailing stop) -- crypto
Alpaca doesn't support resting stop orders for crypto -- this stop is checked in software every poll cycle instead. Always fires unconditionally when hit -- no trend gate, no overrides. See the Help tab for details.
Trend filter -- crypto
Buy trend = price > EMA(x1) > EMA(x2), all three in that order. x1 should always be smaller than x2.
Buy confirmation -- crypto
On top of the trend filter above, a buy also requires price to clear EMA(x1) by this many x ATR (not just barely above it), AND that the up-trend has held for this many consecutive closed candles -- filters out single-bar blips. Sells are unaffected.
Stop loss -- crypto
Volume filter -- crypto (optional extra safety check on buys)
Applies to buys only -- a stop-loss sell is a risk control and should never be blocked by low volume.
How to think about these three settings together
Candle size, EMA x1/x2, and the volume filter aren't independent knobs -- they interact. The practical approach: pick a candle size first based on how often you actually want the bot re-evaluating, then tune x1/x2 to that candle size, then decide if volume filtering adds value for your specific tickers.
1. Candle size -- what it actually changes
Every EMA, ATR, and volume calculation operates on whatever "close" means at your chosen candle size. A daily candle's close is one number per day. An hourly candle's close is one number per hour. Same formulas, completely different sensitivity.
| Candle size | Character | Trade-off |
|---|---|---|
| 1Min / 5Min | Scalping-like, reacts almost immediately to price moves | Very noisy -- whipsaws constantly, needs a fast poll interval to matter, generates far more trades (and more chances to be wrong) |
| 15Min / 30Min | Intraday swing behavior | Meaningfully more responsive than daily, still noisy around news/opens |
| 1Hour | A reasonable middle ground | Reacts within the trading day without reacting to every tick |
| 4Hour | Slower swing trading | Fewer, more deliberate signals -- closer to daily in character but a bit faster |
| 1Day (default) | Classic position/swing trading | Smoothest, fewest false signals, but slow to react -- a move can be well underway before a daily close confirms it |
Our recommendation: start at 1Day (the default) and only move to something faster once you've watched the backtested signal overlay on the Charts tab and have a specific reason -- "this stock makes its real moves within a few hours and daily candles miss them," for example. Faster candles are not automatically better; they mean more trades, more transaction friction, and more exposure to noise. This is the single easiest way to accidentally overfit or over-trade a strategy.
Consideration -- market data limits: intraday history (especially 1Min) can be a lot of data. This app requests only as much lookback as your EMA/ATR/volume settings actually need, but very small candles with long EMA spans can still mean a lot of API calls. If you notice slow chart loads or heartbeat warnings after switching to a fast candle size, that's likely why.
2. EMA x1 / x2 -- tuning to your candle size
x1 and x2 are span lengths in candles, not days -- their real-world meaning changes completely with candle size. EMA x1=8 on daily candles means "roughly the last 8 trading days." EMA x1=8 on 1-hour candles means "roughly the last 8 trading hours." The classic 8/21 default was designed with daily candles in mind.
Our recommendation, if you change candle size: think in real time, then convert. If you want the fast EMA to represent "about 2 trading days" and you've switched to 1-hour candles (~7 candles/trading day for stocks), that's roughly x1=14, not x1=8. For crypto on 1-hour candles (24/day), 2 days is closer to x1=48. The Strategy Config tab shows candle count, not calendar time -- do this conversion yourself before saving, or the same numbers that worked well on daily candles can behave completely differently on hourly ones.
x1 must be smaller than x2 -- that's what makes one "fast" and the other "slow." Setting them equal or reversed breaks the three-way alignment check entirely (nothing will ever satisfy price > x1 > x2 in a stable way).
Honest trade-off worth knowing: the three-way price/EMA(x1)/EMA(x2) alignment check (added in this version) is stricter than a simple "fast EMA above slow EMA" comparison -- it also requires the live price to be out in front. This means it can flip between "up" and "down" more readily during genuinely flat, choppy conditions, since there's no neutral buffer zone built in. That's an inherent property of this trend definition, not a bug -- if you find it flipping too often on a particular ticker, that ticker may just be range-bound right now, which is itself useful information.
3. Volume filter -- when it helps and when it doesn't
The idea: a price move on unusually high volume is more likely to be "real" (broad participation) than the same move on thin volume (which can be a handful of trades pushing price around with little conviction behind it). Requiring current volume > its recent average before buying is a common way to filter out low-conviction breakouts.
Our recommendation: this tends to help most on faster candle sizes (15Min and below) where thin-volume noise is common, and matters less on daily candles for liquid large-cap names, which rarely have a "low volume" problem in the first place. If your watchlist is large, liquid stocks on daily candles, the volume filter will rarely change anything -- which is fine, it just means it's not doing much work for you in that configuration.
Average period: 20 candles is a reasonable starting point (roughly a trading month on daily candles). Shorter periods make the baseline more reactive to recent volume changes; longer periods make it a steadier long-run average that's harder for any single candle to clear.
Why this only gates buys, not sells: a trailing-stop sell is a risk control, not a discretionary opportunity -- blocking an exit because volume happens to be low would mean staying in a losing position longer for no good reason. The filter only ever makes the bot more selective about entries, never slower to protect you on the way out.
4. SEC Filing Monitor -- a completely separate signal path
This is independent of everything above -- it doesn't use the EMA/ATR/volume gates at all, and it isn't included in the Charts tab's backtested signal overlay (that overlay stays purely technical on purpose, since SEC filings can't meaningfully be replayed candle-by-candle the way price data can).
What it watches: 8-K current reports and Form 4 filings, but only Form 4s reporting an actual open-market purchase (transaction code P) -- sales, option exercises, grants, and gifts are ignored, same filter this app used when it had a paid insider-data source.
How a filing becomes a decision: every new filing is sent to Claude, which returns a direction (buy/sell) and a 0-10 rank. If the rank clears your configured threshold, the EMA trend for that stock is checked as a confirmation:
- Trend agrees with the signal direction (e.g. a buy signal while the stock is in a confirmed EMA uptrend) -- full conviction: 100% buy sizing, or sell 100% of the position.
- Trend doesn't confirm -- conviction scales directly with the rank: rank 7 = 70%, rank 8 = 80%, and so on.
Opening a brand new position is stricter than acting on one you already hold: only a Form 4 open-market purchase, ranked strictly above your threshold, can open a position in a watchlist stock you don't currently hold. An 8-K -- no matter how highly ranked -- can inform a sell on something you already hold, but can never be the reason you buy into something new. The idea: an insider actually spending their own money clears a higher bar than a news event alone.
Model substitution: this app only integrates with Anthropic's API, so Claude Haiku (the fast/cheap tier) is used for the ranking call rather than a GPT model -- functionally the same role, different provider.
Cost note: every new qualifying filing triggers one real API call. Filings aren't frequent per stock, so this should stay cheap even with a full 25-stock watchlist, but it's not free -- keep an eye on Anthropic Console usage if you're watching a lot of tickers.
5. Buy confirmation -- ATR buffer + candle hold
A buy requires all three of these, together:
- Trend: price > EMA(x1) > EMA(x2).
- Real separation: price > EMA(x1) + (ATR buffer multiplier × ATR) -- not just barely above the fast EMA, a genuine ATR-scaled margin above it.
- Held, not a blip: that up-trend has to have been true for N consecutive closed candles (the "hold" setting) -- a single bar flipping up isn't enough.
Sells are unaffected by any of this -- the trailing stop fires unconditionally the moment price hits it, full stop, no trend gate, no overrides.
Conviction % (buy sizing and % sold on a stop hit) is a fixed setting now -- default 100% for both, meaning full size on a signal and a full exit on a stop. There's no adaptive/self-nudging behavior anymore; whatever you set is what's used, every time, until you change it.
6. SEC monitor backfill -- seeing real scoring before going live
The very first time the SEC monitor runs for a project, it reviews the 3 most recent 8-K filings and the 3 most recent Form 4 open-market purchases for every stock in the watchlist -- purely for analysis. Backfilled filings are scored by the LLM and recorded in the SEC Filings tab exactly like live ones, but never trigger a trade, no matter how they rank. The point is to let you see real, current examples of how the AI scores actual filings before any live forward-scanning (and any real trading) begins. After backfill completes, normal forward-scanning starts on the next poll cycle. You can re-run the backfill any time from the Strategy Config tab if you add new stocks to the watchlist and want fresh examples for them.
General recommendation if you're not sure where to start
Leave everything at the defaults (1Day candles, x1=8/x2=21, volume filter off, SEC monitor off) and use the Charts tab's backtested signal overlay to see how the current defaults would have played out on your actual watchlist tickers over the last year. Change one setting at a time from there, and re-check the chart after each change -- it's much easier to understand what a setting does by watching it move real signals on a real chart than by reasoning about it in the abstract.
How the historic charting / backtest system works
The Charts tab isn't a full backtest engine -- it's a signal replay. It re-runs your current strategy config over historical price bars and marks where that config would have signalled a buy or a sell, then draws a simple "in the position vs. out of it" equity curve against buy-and-hold. Here's exactly what it does, step by step:
- Data source & candle size. It pulls OHLCV bars from Alpaca at whatever candle size the asset class is configured for -- so the chart always matches what the live bot actually evaluates. Change the candle size in Strategy Config and the chart's indicators and signals change with it.
- Warm-up buffer. It fetches extra history before your selected window so the EMAs, ATR, and volume average are already "warmed up" at the left edge of what you see -- indicators computed from too little history would otherwise be wrong for the first stretch.
- Date-based window. The visible range (1M / 3M / … / 5Y) is trimmed by calendar date, not by a candle count. That's why switching candle size keeps the same start/end dates (where the data exists). Note that intraday history from Alpaca doesn't reach as far back as daily -- a "5Y" view on 4-hour candles will start wherever intraday data actually begins.
- The replayed rules (identical to the live bot). The exact same predicates the live engine uses are applied bar by bar, with no look-ahead (each bar only uses data up to itself):
- Buy when price > EMA(x1) > EMA(x2), price clears EMA(x1) by the ATR buffer multiplier × ATR, and that up-trend has held for the configured number of consecutive candles and, if the volume filter is on, current volume > its recent average.
- Sell when the ATR trailing stop is hit --
max(existing_stop, price - ATR × multiplier), which only ever ratchets up.
- Two triangle types. Hollow triangles are these backtested signals. Solid triangles are your bot's actual executed trades (from the Trade Log), drawn on top -- so you can compare "what the config says now" against "what really happened."
- Strategy vs. Buy & Hold curve. Two equity curves are tracked: buy-and-hold (holding the asset the whole time) and the strategy (tracking the asset's return only while the replay says it would have been holding, otherwise flat/in cash). Both are rebased to 0% at the left edge of the view. When you zoom, both curves re-rebase to 0% at the new left edge, so the comparison always reflects the window you're actually looking at.
What the replay deliberately does NOT model: position sizing, your risk %, conviction %, partial exits, the sector and max-allocation caps, the daily drawdown halt, the max-concurrent-positions cap, and -- importantly -- slippage, fees, and spread. It's fully in-or-out (100% or 0%), so it answers "would this trend/stop logic have caught the moves?" not "what P&L would I have made?".
Conviction is not reflected in the chart. Conviction only scales trade size, and the replay is all-or-nothing with no sizing, so it would have no visible effect here regardless of what it's set to.
Why live results usually come in weaker: because a signal replay ignores the costs and frictions above, and because a rule that looks good on one historical path can be over-fit. Treat a good-looking backtest as "worth paper-trading," not "proven."
Project
Alpaca (required)
For your security, saved keys are never shown back here — the field stays blank even when a key is stored. The badge above shows whether one is set. Enter a value only to add or replace a key.
Claude
Powers the Strategy Assistant (Charts tab) and the SEC Filing Monitor's filing scoring. Not needed for basic trading. Get a key from the Anthropic Console.
Trade Log
| Time | Ticker | Side | Qty | Price | Tier | Reason |
|---|
Activity Log
Every buy, sell, skipped trade, and error shows here. "Heartbeat" entries run every 5 minutes regardless of trading activity, showing the current EMA trend and ATR for every ticker -- confirming price data is actually being fetched and everything is functioning.
| Time | Level | Message |
|---|
Account snapshot
Place an order
This bypasses the bot entirely -- no EMA gate, no ATR sizing, no safety rules. Equivalent to placing an order directly on Alpaca.
Quick quote lookup
Last daily close from Alpaca -- a quick way to confirm data connectivity for a ticker without going through the strategy engine.
Open positions -- quick actions
| Ticker | Type | Qty | Entry | Stop |
|---|
Open orders
| Symbol | Side | Qty | Type | Status |
|---|
Order history
| Submitted | Symbol | Side | Type | Qty | Filled | Avg | Status |
|---|
Test tools
Trigger a cycle immediately instead of waiting for the configured poll interval -- useful for testing a config change without sitting around.
Check the Activity Log tab right after running one of these to see what happened.
SEC Monitor Progress
The monitor works through each watched stock one at a time — resolving its SEC CIK, pulling recent 8-K / Form 4 purchase filings (throttled to respect SEC's rate limit), and scoring each with Claude. This can take a few minutes on the first (backfill) run for a large watchlist. This panel updates live while a run is active.
SEC filings seen, with AI scoring
Every 8-K and qualifying Form 4 filing the SEC monitor actually analyzed for this project in the last 7 days -- whether or not it triggered a trade. Form 4s that turned out not to be an open-market purchase (option exercises, RSU vesting, gifts, sales) are skipped before analysis and don't appear here -- they're not a signal type this app acts on. Nothing older than 7 days is ever fetched, analyzed, or kept; anything that ages past a week is purged automatically. Requires the SEC Filing Monitor to be enabled (Strategy Config tab).
| Date | Ticker | Form | Direction | Rank | Action | Reason |
|---|
Market & Crypto News
Insider Activity — market-wide SEC filings
Limited to the last 7 days -- nothing older is ever fetched, displayed, or kept; the feed is scanned automatically every few hours, and anything that ages past a week is purged.
Not fetched yet — click "Fetch latest".
| Date | Company | Form | Insider | Shares | Price | Value | Actions |
|---|
How the bot works, in order
Every poll cycle (interval set per asset class in Strategy Config), for each ticker in the watchlist:
- Trend check (Rule 2) -- computes a fast EMA and slow EMA on daily closes. Only buys if the fast EMA is above the slow one and still rising. If not, it skips the stock entirely -- no buy, no log entry (that's normal, not a bug).
- Position sizing -- if the trend is up, sizes the trade using the ATR-based stop distance and your configured risk %, capped by the max allocation and sector cap.
- Order + confirmation -- submits the buy to Alpaca and waits (up to 10 seconds) for confirmation it actually filled before recording anything.
Separately, every cycle, for each open position:
- Trailing stop -- recalculates
max(existing_stop, price - ATR × multiplier). This only ever moves up. If price falls to or below it, the position sells (partially, per your conviction %) -- this happens regardless of trend (Rule 1 doesn't block a stop-loss).
A separate heartbeat runs every 5 minutes no matter what, just to log the current trend and ATR for every ticker -- this is your proof the bot is alive and fetching data correctly, even on a day nothing trades.
Parameter reference
| Parameter | What it controls |
|---|---|
| Base risk % | The % of total equity you're willing to lose if a single trade hits its stop. Combined with conviction % to get the effective risk per trade. |
| Max allocation per trade % | Hard ceiling on how much of your equity can go into one position, regardless of what the risk formula suggests. Can never be set below 12%. |
| Sector cap % | Hard ceiling on how much equity can sit in one sector at once, to force diversification. |
| Buy conviction % | Multiplies base risk % when sizing a buy. A fixed setting (default 100% -- full size); no adaptive nudging. |
| Sell conviction % (trailing stop) | What % of the position is sold when the trailing stop is hit. A fixed setting (default 100% -- full exit, unconditional, no overrides). Less than 100% leaves a smaller position open with a fresh stop -- a partial exit, not a full liquidation. |
| ATR buffer multiplier | Extra buy confirmation: price must clear EMA(x1) by this many x ATR, not just be barely above it. |
| Hold for N consecutive candles | Extra buy confirmation: the up-trend must have held for this many consecutive closed candles before a buy fires -- filters out single-bar blips. |
| ATR multiplier | How many multiples of the Average True Range (a stock's typical daily movement) the stop sits below the price. Higher = wider stop = fewer false exits, but more risk per trade. |
| ATR period (candles) | How many candles of price history the ATR average is computed over. 14 is a common default. |
| EMA x1 / x2 (candles) | The two moving averages compared to detect trend direction, in candle counts. See Strategy Guide for how to convert candle counts to real time when changing candle size. |
| Candle size | What one price bar represents -- 1 minute up to 1 day. Changes what every other calculation on this page is actually measuring. See Strategy Guide before changing. |
| Volume filter | Optional: only buy if current volume exceeds its recent average (over the configured period, in candles). Applies to buys only, never blocks a stop-loss sell. |
| Poll interval (minutes) | How often the bot checks this asset class for buy/sell signals. Crypto defaults faster (15 min) since it trades 24/7 and moves quickly; stocks default to 30 min. |
| Daily drawdown halt % | Portfolio-wide (not per asset class). If the account's equity falls this % below where it started today, no new buys happen for the rest of the day. |
| Max concurrent positions | Portfolio-wide cap on how many positions (stocks + crypto combined) can be open at once. |
How often does the bot actually check for trades?
Stocks and crypto are checked on completely independent schedules -- each asset class runs its own trading job at its own configured "Poll interval" above. If stocks are set to 30 minutes and crypto to 15 minutes, the bot checks crypto for buy/sell signals every 15 minutes and stocks every 30 minutes, on two separate timers -- one never speeds up or slows down the other.
The heartbeat is a third, separate timer (configurable in Portfolio-wide risk, above) that just logs diagnostics -- it doesn't buy or sell anything, regardless of how frequently it's set.
Where the price data comes from, and how EMA/ATR are calculated
Alpaca does not calculate EMA or ATR for you. It only provides raw OHLCV bars (open, high, low, close, volume) at whatever candle size is requested, via its market data API -- get_stock_bars for equities, get_crypto_bars for crypto. Every indicator you see anywhere in this app (trend, ATR, volume filter, chart lines) is computed by this app's own code (backend/strategy/indicators.py) from those raw bars using the pandas library -- nothing is pre-computed or fetched pre-calculated from Alpaca.
EMA (Exponential Moving Average) -- computed with pandas' built-in exponential weighting, on whatever candle size is configured:
ema_x1 = close_prices.ewm(span=ema_fast_span, adjust=False).mean() ema_x2 = close_prices.ewm(span=ema_slow_span, adjust=False).mean()
This weights recent closes more heavily than older ones. Trend is a three-way alignment check: current price vs EMA(x1) vs EMA(x2).
if price > ema_x1 > ema_x2:
trend = "up"
elif price < ema_x1 < ema_x2:
trend = "down"
else:
trend = "flat"
Only a clean "up" passes the buy gate (Rule 2). Requiring price itself to lead x1, which leads x2, is stricter than a simple two-EMA crossover -- see the Strategy Guide tab for the trade-off this brings (more responsive, but can flip more often in choppy conditions).
ATR (Average True Range) -- measures how much a ticker typically moves per candle, including gaps between candles:
true_range = max(
high - low,
abs(high - previous_close),
abs(low - previous_close)
)
atr = true_range.rolling(window=atr_period_days).mean()
The three-way max is what catches gaps a simple high-minus-low would miss. The result is averaged over the configured ATR period (in candles) to get one number representing "typical movement per candle" -- this is what the stop-loss distance and position sizing are both built from.
Volume filter (if enabled) -- compares the current candle's volume to the average of the candles before it (never including itself in its own average):
avg_volume = volume.shift(1).rolling(window=volume_avg_period).mean() passes = current_volume > avg_volume
If there isn't yet enough history to compute a meaningful average, this filter fails open (treated as passing) rather than blocking trades due to a data gap.
All calculations need enough historical candles to be meaningful -- if a ticker doesn't have enough history yet (e.g. it was just added, or you just switched to a much smaller candle size), ATR and the volume average show as "n/a" in the heartbeat log until enough candles accumulate.
Why stock and crypto configs are separate
Crypto behaves differently from equities in ways that matter for this strategy: it trades 24/7 (no market-hours gate), supports fractional position sizes, and -- critically -- Alpaca doesn't support resting stop orders for crypto the way it does for stocks. That last point means the crypto trailing stop is checked entirely in software on each poll cycle rather than sitting as a live protective order, which is part of why the crypto defaults use a wider ATR multiplier and sell more of the position per stop hit -- to compensate for the lack of a standing safety net between checks.
Not legal advice
This is generic, boilerplate disclaimer language common to self-hosted trading-automation tools -- a starting point, not certified legal compliance. Have a qualified lawyer review and adapt it before relying on it for real users, especially across multiple countries.
What this app is
SalsaTrade is a software tool that connects to your own Alpaca brokerage account and places trades on your behalf, based on rules you configure. It is not a broker-dealer, investment adviser, bank, or money transmitter. We do not hold your funds or securities -- your money and positions stay in your own Alpaca account at all times; this app only sends instructions to it using your own API keys.
No investment advice
Nothing in this app -- including AI-generated summaries, strategy suggestions, backtested signal replays, or filing analysis -- constitutes financial, investment, tax, or legal advice. All trading decisions, and their consequences, are yours alone. The Strategy Assistant and any AI-generated content can be wrong or misleading and should not be relied on as a sole basis for a trading decision.
Trading risk
Trading securities and cryptocurrency involves substantial risk of loss and is not suitable for everyone. Past performance -- including backtested results shown in the Charts tab -- does not guarantee future results; a backtest reflects how a strategy would have performed historically, not how it will perform going forward. Never trade with money you cannot afford to lose.
Your responsibility
- Complying with the laws, regulations, and licensing requirements of your own country and jurisdiction regarding automated/algorithmic trading, including any that may apply to using a third-party tool like this one with a brokerage account.
- The accuracy and security of your own Alpaca and Claude API credentials -- treat them like a password; this app encrypts them at rest but you control who has access to your account.
- Reviewing the trades this app places in your Alpaca account and confirming they match your expectations.
- Deciding whether auto-execution or confirm-before-trade (with Telegram/manual approval) is the right mode for you.
No warranty
This software is provided "as is" and "as available," without warranty of any kind, express or implied. We do not guarantee uninterrupted operation, that the strategy logic is error-free, or that third-party services it depends on (Alpaca, Anthropic/Claude, SEC EDGAR, Telegram) will always be available or accurate. We are not liable for losses arising from software bugs, downtime, API failures, data errors, or trading outcomes.
Changes to these terms
These terms may be updated from time to time. Continued use of the app after a change means you accept the updated terms.