# WyckoffAgent: a Wyckoff trading agent for A-share, Hong Kong and US screening

> WyckoffAgent (youngcan-wyckoff-analysis) turns volume-price structure into a conversational CLI, an Electron desktop app and an MCP tool surface. It targets A-share, Hong Kong and US daily data, and it is honest about what it does not do.

**YoungCan-Wang/WyckoffTradingAgent** — Open-source Wyckoff trading agent and AI stock screener for volume-price analysis, A-share screening, CLI workflows, and MCP tools. trader @Hoyooyoo.

- Repository: https://github.com/YoungCan-Wang/WyckoffTradingAgent
- Website: https://youngcan-wang.github.io/wyckoff-homepage/
- Stars: 723 · Forks: 214
- Language: Python
- License: AGPL-3.0
- Published: 2026-08-08 · Updated: 2026-08-18 · Language: en
- Canonical page: https://hysenlabs.com/projects/youngcan-wang-wyckofftradingagent

## The problem WyckoffAgent takes on: volume-price reading at market scale

Wyckoff analysis is a manual discipline. You mark accumulation and distribution, watch for a spring or an upthrust, and wait for confirmation before committing. Doing that across roughly 5000 A-share names every day is not something a person can hold in their head, and the usual substitute is a momentum screener that ignores structure entirely.

WyckoffAgent is aimed at the gap between those two. The README describes a conversational agent that reads daily bars, identifies Wyckoff structure, produces AI research reports, checks open positions and pushes notifications. The audience is a technically comfortable retail or semi-professional trader who already knows the method and wants the screening loop compressed. It is not a signal service for someone who wants a ticker handed to them.

The project also states its own boundary plainly in the README: it is for educational, research and informational use, does not provide investment advice, and does not guarantee future performance. That disclaimer is worth taking at face value, because the funnel produces candidates and confirmation gates, not orders.

## How the funnel, the OMS gate and the approval queue fit together

The pipeline has a clear shape. Daily quotes are pulled through TickFlow in real time, and the README notes there is no Supabase quote cache; Supabase holds user configuration, positions, pattern reviews, market signals, signal feedback and task results. That split matters because it tells you where the state lives.

Screening runs as a mainline funnel over the A-share market. It dynamically discovers concept mainlines, scores eight-channel strength, assigns candidate lanes and waits for buy-point confirmation. The README states NEUTRAL mainlines are prioritised and RISK_ON forbids new positions. A daily funnel is then chained to the next day's open: once a candidate is confirmed across the day boundary, the OMS produces a single permitted buy range, and the open price must fall inside that range for execution. The report header carries a fixed execution-discipline block.

Position diagnosis is deliberately staged rather than mechanical. Single-stock quality is assessed before account role; a WARNING only triggers observation, while a confirmed breakdown or hard risk produces EXIT or TRIM. A stock that leaves the mainline enters review after five days but is not sold automatically.

Unsupervised writes are the part worth reading twice. The daemon and `wyckoff run` restore the locally saved CLI session first, otherwise an automatic stop-loss would be written to local `USER_LIVE:local` instead of the cloud position. The daemon will execute only `set_stop_loss` on its own, and the README explains why: that tool can only change the stop price, its signature carries no share count, cost or cash, so it cannot move a position or spend money. Everything else enters a pending-approval queue bound to the account that enqueued it, so an approval cannot be applied after an account switch. Pending items expire after 12 hours and cannot be approved afterwards, because an overnight rebalance would fill at a stale price.

## Installing WyckoffAgent and running a first session

The README recommends the CLI path. There is a one-line installer, and Homebrew and pip alternatives. The PyPI package name is `youngcan-wyckoff-analysis`, which is not the same as the command name, so keep the two apart when you search for it.

```bash
curl -fsSL https://raw.githubusercontent.com/YoungCan-Wang/WyckoffTradingAgent/main/install.sh | bash
brew tap YoungCan-Wang/wyckoff && brew install wyckoff
uv pip install youngcan-wyckoff-analysis
```

The package requires Python 3.11 or newer, per `pyproject.toml`. Once installed, the `wyckoff` entry point starts the agent conversation and `wyckoff dashboard` starts a local visual panel.

```bash
wyckoff
wyckoff dashboard
```

Inside the conversation, `/model` selects the provider (the README names Gemini, Claude and OpenAI) and you supply an API key. Configuration lives in a `.env` file; `.env.example` shows the keys. Supabase is optional: without it, position data is stored in local SQLite, and with it you get multi-device sync. The LLM section of `.env.example` defaults to Gemini with `GEMINI_MODEL=gemini-2.5-flash-lite`, and there is a separate low-cost channel for summaries and formatting.

```bash
DEFAULT_LLM_PROVIDER=gemini
GEMINI_API_KEY=
GEMINI_MODEL=gemini-2.5-flash-lite
```

If you want scheduled tasks to survive closing the terminal, the README documents a macOS launchd daemon. Without it, scheduled tasks only run while the TUI is open.

```bash
scripts/daemon_install.sh
wyckoff daemon --status
tail -f ~/.wyckoff/logs/daemon.log
```

When the daemon holds the lock, the TUI yields scheduling authority, so the two do not double-fire. To run a single unattended pass without the TUI, the README gives `wyckoff run "盘前风控检查"`. Reviewing the approval queue uses three subcommands, and the README is explicit that `approve ok` executes the exact parameters stored at enqueue time and does not retry on failure.

## Connecting an external MCP server, and why it is gated

The project ships `mcp_server.py` and a `wyckoff-mcp` entry point, and it can also consume third-party MCP servers. That direction is the interesting one, because connecting a server means allowing its command to be spawned on your machine.

The README's design response is a three-step gate. Adding a server does not enable it. Configuration can only be written by you, not by the model. And the project's own `mcp_server.py` is refused as an external server, because its tools are already built in and connecting it twice would produce two tools with the same name.

```bash
uv pip install -e '.[mcp]'
wyckoff mcp-add github --command npx \
  --args -y @modelcontextprotocol/server-github \
  --env GITHUB_TOKEN
wyckoff mcp-test github
wyckoff mcp-enable github
```

External tool names carry an `mcp__<server>__` prefix, so they do not shadow native tools. Write operations are classified by tool name and `annotations` heuristically, and the README states the fallback rule directly: if it cannot tell, it treats the call as a write and sends it to the approval queue. The daemon never auto-executes an external write while unattended. A server that fails to connect only disables itself; native tools keep working, and errors land in `~/.wyckoff/logs/mcp-<server>.log`.

## Where WyckoffAgent is the wrong tool

The data layer sets the first limit. The README says TickFlow's free mode needs no key but supports historical daily candles only; real-time quotes, minute candles and financial data require the full mode. If your method depends on intraday structure, this is not the system for it.

The desktop story has a second limit. The releases are marked unsigned, and the README says the public packages use an unsigned Windows build and a temporary macOS signature, with an explicit system warning. The desktop release notes describe routine PR and main CI as running Electron tests on three platforms without building installers; installers with a real Python runtime are built only on an explicit manual candidate build or a `desktop-release` skill invocation, and manual candidates are kept for at most one day. If you need a signed, long-lived installer, you are building it yourself.

The third limit is operational. The cloud service runs on paid infrastructure, with the cost model documented in docs/COST_MODEL.md. The project stays open source and welcomes forks, but the shared service is not a free tier you can lean on indefinitely.

There is also a structural caveat around the approval queue: the 12-hour expiry is a deliberate safety choice, and it means an unattended queue that nobody reviews simply lapses rather than executing late.

## How it differs from CZSC and from plain quant screeners

The README credits CZSC (缠中说禅) and its author zengbin93 for guidance on trading strategy. The two projects read the same market through different lenses. CZSC formalises Chan theory: fractal strokes, segments and centres, with the analysis expressed as a structural sequence. WyckoffAgent formalises Wyckoff: accumulation and distribution phases, springs and upthrusts, with the output expressed as a funnel of candidates, a confirmation gate and a permitted buy range.

The practical difference is what you get at the end. A Chan-based library typically hands you structural objects to build your own strategy on. WyckoffAgent hands you an agent conversation, a screener, a portfolio checkup and an approval queue, with the LLM writing the research report in three camps (逻辑破产, 储备营地, 起跳板). That is more opinionated and more coupled. If you want a structural primitive to embed in your own backtest, CZSC is the closer fit. If you want an end-to-end loop with human approval gates, WyckoffAgent is the one that ships that loop.

Against a generic quant screener, the difference is the confirmation discipline. A momentum screen ranks today's strength. WyckoffAgent's daily funnel chains to the next open and requires the open price to fall inside a single OMS-permitted range before execution, which is a narrower and slower trigger by design.

## Maintenance, licensing and what an upgrade actually costs

The repository is not archived, and the last push was on 2026-08-27. Releases in the repository show desktop-v0.1.1 and desktop-v0.1.0 on 2026-08-26 and 2026-08-27, and v0.9.10 as a PyPI package release on 2026-05-27. The `pyproject.toml` in the repository carries version 0.9.234, so the package version and the tagged release numbers are not the same series. Check the installed version rather than assuming.

The licence is AGPL-3.0-only, declared in `pyproject.toml` and present as a LICENSE file. AGPL is a strong copyleft licence with a network clause: if you run a modified version as a network service, the source obligations reach further than under plain GPL. Whether that affects your deployment depends on your situation and is a question for your own counsel, not for this article. If you plan to fork and host it, read the licence before you build a product on it.

Upgrade cost is mostly configuration drift. The `.env.example` file carries a large surface: Supabase keys, TickFlow retry settings, Tushare, seven LLM providers, the efficiency channel, Telegram delivery, RAG veto settings and a browser CDP URL. Any of those can change between versions. The retry comment in `.env.example` names a concrete failure, a single 504 on a paginated signal-feedback pull raising a RuntimeError, and adds `SIGNAL_FEEDBACK_MAX_RETRIES` and `SIGNAL_FEEDBACK_RETRY_BACKOFF_SECONDS` to handle it. Diff your `.env` against the example on each upgrade rather than assuming your old file still matches.

One migration note: Streamlit is gone. The README states the Streamlit MVP is no longer maintained, the main branch has removed the runtime code, and the old code remains on the `release/streamlit` branch. If you pinned to that era, you are on a dead branch.

## Conclusion

Adopt WyckoffAgent if you already read volume-price structure by hand and want that reading automated into a funnel, a portfolio checkup and an approval queue you can audit. Do not adopt it if you need intraday signals, a signed desktop installer, or a hosted service with an uptime commitment; the desktop builds are unsigned and the cloud service runs on paid infrastructure. Before you install, read docs/COST_MODEL.md for the cost boundary, confirm your Python is 3.11 or newer, and decide whether you are running against the shared cloud or your own Supabase project.

## FAQ

### What is WyckoffAgent and how does it work?

It is an open-source Wyckoff trading agent for A-share, Hong Kong and US stocks. It pulls daily quotes through TickFlow, runs a mainline funnel over roughly 5000 A-share names, chains the daily funnel to the next open through an OMS-permitted buy range, and exposes the whole loop through a CLI, a React web app, an Electron desktop app and MCP tools.

### How do I install WyckoffAgent?

The README recommends the CLI path: a one-line curl installer, or Homebrew via the YoungCan-Wang/wyckoff tap, or `uv pip install youngcan-wyckoff-analysis`. It requires Python 3.11 or newer, and the `wyckoff` command starts the agent conversation.

### Does WyckoffAgent need Supabase or an LLM API key?

Supabase is optional. The README states that without it, position data is stored in local SQLite, and with it you get multi-device cloud sync. An LLM key is needed for the report and conversation features; `.env.example` defaults to Gemini with `GEMINI_MODEL=gemini-2.5-flash-lite` and lists other providers that are skipped when unconfigured.

### What licence does WyckoffAgent use?

AGPL-3.0-only, declared in `pyproject.toml` and present as a LICENSE file. The AGPL network clause extends source obligations to modified versions offered as a network service, so read it before building a hosted product on a fork.

### What are the three laws of Wyckoff?

The repository documentation does not cover the three Wyckoff laws, so this article cannot answer it. The README covers what the agent does with volume-price structure, not the underlying theory.

## Sources

- [Official documentation](https://youngcan-wang.github.io/wyckoff-homepage/)
- [Official README](https://github.com/YoungCan-Wang/WyckoffTradingAgent#readme)
- [Project repository](https://github.com/YoungCan-Wang/WyckoffTradingAgent)
- [Release notes](https://github.com/YoungCan-Wang/WyckoffTradingAgent/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/youngcan-wang-wyckofftradingagent
