For the past few months the same question has kept arriving in support:

“Can you show us how to add a simple signal to FootprintAction.cs using Codex?”

Fair question. Here is the honest answer to why it hasn’t been working, and what we have done about it.

Why your agent invents methods that don’t exist

Codex, Claude Code and Cursor are very good at C#. They know nothing at all about MZpack.

Our API has never been in their training data — it ships as a compiled assembly to licensed users, not as a public library. So when you ask for “a signal that detects absorption at POC”, the agent does what a language model does with a gap in its knowledge: it produces something plausible. EntrySignals.Add(...). An override of GetStopLossValue() on the strategy class. Method names that read exactly as though they ought to exist, and don’t.

You get a compile error. Or, worse, code that compiles cleanly and then silently never fires.

That is not the agent being stupid. It is a missing input.

What we have published

mzpack-strategy-corpus — free, public, no account, no key.

  • AGENTS.md — how an MZpack strategy is actually put together: the host class, the algo class, signals, the signals tree, entries, risk management, the signal probe, build and deploy.
  • docs/api-surface.md — the types and members of MZpack.NT8.Algo in one place.
  • docs/pitfalls.md — fourteen ways to write code that compiles and then does nothing, each one written from the symptom you will actually see first.
  • samples/ — sixteen worked examples, one technique each, taken from the product sources: delta divergence, stacked imbalance, absorption in a hammer, big trades, session levels, risk limits, custom entries and trails, second data series, custom plots, CSV export.
  • templates/ — three buildable scaffolds: a plain strategy, one with the Pattern Dashboard, one with a Control Panel.

AGENTS.md is picked up by Codex automatically. CLAUDE.md does the same for Claude Code. Cursor and the others read either one.

Getting it

Download the zip and unpack it wherever you keep your projects — mzpack-strategy-corpus.zip. No terminal, no account, nothing to install. That link always points at the current release.

Or clone it, if you use git:

git clone https://github.com/mikhail-zhelnov/mzpack-strategy-corpus

Releases are tagged against the MZpack API version, so the zip is what to take if you want the corpus that matches your installation. A clone follows the tip of main, where docs/pitfalls.md gains an entry every time somebody reports something — git pull and you have it. Between releases the repository’s Code → Download ZIP button gives you that same tip without git.

What it looks like in practice

Most people can skip the setup entirely: Directory.Build.props already assumes a standard NinjaTrader installation, and if that is what you have, the template builds as it stands. If NinjaTrader or MZpack live somewhere else, correct the three paths at the top of that one file — or set them once as Windows environment variables, which the README walks through.

Copy templates/StrategyTemplate into your own folder, rename the project, and ask for what you want:

add a signal that goes long on a bullish hammer with buy absorption in the wick, following AGENTS.md

Close NinjaTrader, then build:

msbuild YourStrategy.csproj

NinjaTrader has to be closed first: while it runs it holds the assemblies in bin\Custom, the build cannot put yours there, and it still reports success — a clean build and no strategy in the list. With NT8 closed the DLL is copied for you. Start it again and the strategy is in the list.

Never built a NinjaScript add-on before? Install Visual Studio 2026 Community — it is free — open the template’s .csproj and press Ctrl+Shift+B. The README covers the command-line routes and where to find MSBuild.

One example of what is in there

The most expensive bug in MZpack strategy code does not produce an error message.

Some of the indicator data — footprint absorptions, imbalance S/R zones, the bar value area, delta rate — is only calculated when the matching setting is switched on. A signal that reads absorptions without declaring that it needs them reads an empty collection on every single bar. No exception. No warning in the log. It looks precisely like a signal whose condition simply never happened to be met, and you can spend a weekend rewriting perfectly good logic before you find it.

This has caught us twice in our own product. It is entry number one in pitfalls.md, with the two-line fix.

No model can know that, because until now it was not written down anywhere.

What this does not do

It makes your agent write correct MZpack code. It does not make your strategy profitable.

Getting the API right was never the hard part of trading. It was just the part that stopped you finding out whether your idea was any good. That part now costs an afternoon instead of a month — which means the real question arrives much sooner: does this edge actually exist, and how would you know?

We are working on that one separately.

Help us make it better

The corpus is provided as is. It is free, and it is not a supported product — questions about building your own strategies are not covered by MZpack support.

But if you hit something that is not written down, open an issue. Every entry in pitfalls.md started as somebody’s lost afternoon, and once it is written down, it is the last time anyone loses one to it.

There is also #algo-dev on our Discord, and it is now open to every customer rather than only Strategies owners — join here. It is a room for talking to each other: showing what you built, comparing approaches, unsticking somebody who is one detail away from it working. Not a support queue, but frequently faster than one.

Keep the two apart and both stay useful: a conversation goes to Discord, a reproducible problem goes to an issue. The issue is what turns into an entry in pitfalls.md, and that entry is what reaches the next person before they lose the same afternoon.

Requires MZpack Strategies 2.4.17.

Download the zip · Browse the repository