- Single palette (web/src/styles/palette.ts) taken from the Stitch
design, exposed as ap-* UnoCSS colors and --ap-* CSS variables and
used for Element Plus dark theme overrides, KLineChart and the news
iframe; zero radius, JetBrains Mono / Space Grotesk bundled locally
- New sidebar and header layout; trading page, plan card and analysis
drawer follow the design; other pages use the same panels
- Status API reports today's closed trades, wins and net PnL, shown as
today's PnL and win rate on the trading page
When the limit price sat near the far edge of the zone, the stop beyond
the far edge was well inside normal 5m noise (plan #34: 0.11%). The stop
is now the farther of far edge +/- 0.5 x ATR and entry +/- 1 x ATR.
- The model gives a zone and a limit price inside it (below the mark for
longs, above for shorts); the executor places the GTC limit order with
the reduce-only stop right away instead of waiting for a 5m
confirmation and entering at market, so entries pay maker fees
- Stop beyond the far edge of the zone by 0.5 x ATR14(5m), computed with
the quantity at submission and rejected above 1%
- Unfilled limits are cancelled at expiry; a rejected entry cancels the
plan instead of being retried every round
- The model now submits a pending setup (direction, zone, confirm price,
validity); the executor enters at market once a 5m close confirms a
dip into support or a rejection from resistance, and cancels the setup
when the zone breaks, the trigger is missed or the stop is too far
- Stop beyond the confirmation extreme by 0.5 x ATR14(5m), skipped above
1%; fixed take-profit ladders from the fill price (long 60/30/10 at
+0.5/0.75/1%, short 80/20 at -0.5/0.75%); 4h time stop
- While holding, the model may only keep or exit
- Drop the long-term angle from the program, API, tables and page
- Executor reconciles each symbol to its desired orders: journaled ap{id}
client ids, reduce-only quantity stop placed before entries, make-before-
break stop moves, breakeven after TP1, orphan cancel, -2021 market close
- Plan lifecycle: proposed plans are adopted only if the position is
unchanged; holding-mode plans may only tighten the stop
- Program rules: time stop, short-term invalidation close, long-term 4h
review, reevaluate conditions, takeover of unmanaged positions
- Trigger and routine analysis scheduling with a 10 min gap, daily cap and
bounded retries
- Plan endpoint and plan status, fills and countdowns on the trading page
The analyst prompts the model with trading rules, published skills,
account sizing inputs and prefetched market data, exposes read-only
tools plus submit_trade_plan, and validates and sizes the submitted plan
in pure functions covered by pytest. Manual analyses run as dry runs
while trading is stopped; the trading page shows the latest plan and an
analysis detail drawer.
Add trading_account.capital_usdt. Position sizing will use
min(capital, account equity); starting requires the capital to be set.
The trading page shows and edits it.
Add trading_symbols, trading_analyses, trading_orders and trading_events.
The new trader service publishes account, position and open-order
snapshots of the Binance demo account to Redis every 3s. The /trading
page shows engine status, start/stop, balances, positions, the symbol
list with angle selection, open orders and the event timeline.
Store demo API key/secret encrypted in a single-row trading_account table,
expose get/put/delete/test endpoints under /api/settings/exchange, and add
a settings card to enter and test the key. The client is hard-wired to
demo-fapi.binance.com.
- get_klines always fetches from Binance REST: the stored last open
candle is a snapshot from the sync and never updates, so 1d/4h data
read from the database was stale. Mark whether the last bar is closed.
- Cluster swing highs/lows within 0.5 ATR into support/resistance zones
with touch counts, returning the nearest 5 on each side instead of the
last 5 raw swing points.
- New chat tool get_derivatives: funding rate (next estimate and recent
settlements), premium, open interest change vs price, global and top
trader long/short ratios, taker buy/sell ratio from Binance public
endpoints. Each part fails independently.
- Strip whitespace from provider name and model; a leading space in the
model name made the upstream return 404.
- Retry connection failures and mid-stream disconnects (raw httpx /
httpx2 errors are not wrapped by the SDKs) up to 3 times while no
output has been emitted, and surface them as chat errors.
- Return 30 recent bars from get_klines instead of 60 to cut tokens.
- Providers get a default reasoning effort (low..max, empty = not sent);
chat can override it per message. OpenAI sends reasoning_effort,
Claude sends output_config.effort with adaptive thinking, and thinking
blocks are replayed during the tool loop.
- Show a thinking indicator while waiting for model output.
- Surface in-stream upstream errors (e.g. overloaded) instead of
breaking the SSE stream, and retry them up to 3 times when nothing
has been emitted yet.
- Model providers for OpenAI and Anthropic message formats (e.g. via
Sub2API), with API keys encrypted at rest and never returned
- Skills tree with markdown editing, priorities, drafts, publishing and
rollback; only published skills enter the chat prompt
- Chat page with tool calls over collected news and Binance USD-M
klines, a persisted CONTEXT.md, reset, and stop-generation support
- Chat may only create skill drafts and update CONTEXT.md; publishing,
deleting, moving and priority changes stay with the user
The news list API now takes page and limit and returns the total count
instead of a cursor, and the news page uses el-pagination with a
persisted page size.
Let the crawler console set a backfill target per source. Each scheduled
run pages backwards from a checkpoint for at most 20s so real-time
crawling is not blocked. The checkpoint is saved only after a successful
run and is also kept in process memory, because the next trigger may be
queued before the database write lands. cls_depth is excluded since its
list API cannot page into history.
Seed um BTCUSDT/ETHUSDT/BNBUSDT as default symbols. The legacy futures
route fstream.binance.com/stream accepts connections but no longer pushes
data, so switch to /market/stream. Receive with a timeout so symbol
changes are picked up and silent connections are reconnected.
- crawler manager: retry transient errors inside each loop, never let
log writes break supervision, run tasks in a TaskGroup so any escaped
error restarts the container instead of leaving a half-dead process
- market worker: tolerate symbols deleted mid-backfill, retry task
selection and symbol queries, run loops in a TaskGroup
- market WS: validate subscription messages and close the connection
when either the receive or forward side ends
- news pipeline: make first insert concurrency-safe with ON CONFLICT
- market API: only proxy ticker/1s klines for added symbols, map Binance
rate limits to 503 and upstream errors to 502 without blocking
- news API: escape LIKE wildcards in search, return 422 for bad cursors
- market page: cancel pending reconnect timer on unmount