← ASkewMM_VWAP

ASkewMM_VWAP — Fixes

ENGINEERING COMPLETEAudited 2026-09-15· neutral-mm engine· gunbot-quant· spot

Every defect the audit found and how it was repaired — the same measurements as the engineering record, without the code.

3 issues found and repaired — 3 defects, 0 warnings.

# Issue Severity Surface
1 Both of the controls that keep a market maker's quotes above its own costs were inert DEFECT user inputs
2 It is called VWAP, it says VWAP, and it runs EMA DEFECT documentation
3 185 of its 186 sells said what price filled and never what the round trip made DEFECT console logs

Every fix was verified by re-running the full backtest across all 7 markets and comparing the result record against the pre-fix baseline. Where a fix is stated to change no behaviour, the two records are identical to the byte.


Both of the controls that keep a market maker's quotes above its own costs were inert

Severity DEFECT · Surface user inputs · Sites 1

This strategy works by posting a buy price below a reference and a sell price above it. The gap between those two quotes is where its money comes from, and it is also the only thing that covers the exchange's fee on both sides of a completed round trip.

Two settings exist to protect that gap. One is described in the GUI as the assumed fee, which "widens quotes to stay net-positive". The other is the maker rebate, which "allows tighter quotes". Neither was read by anything. The gap came from a volatility measure alone and had no relationship to what a round trip actually costs.

The labels were wrong too. The GUI describes the fee as a round-trip figure and the rebate as a percentage; the file's own header calls them a per-side fee and a rebate in basis points. The header is right — the shipped rebate values only make sense as basis points, because no exchange pays a rebate of 18% of the traded amount.

Why it matters. A maker that quotes a spread narrower than its own round-trip cost loses on every completed round trip by construction, no matter how good the signal is. The setting that exists to prevent exactly that did nothing, and an operator dragging either slider got no response from the strategy at all.

The floor is NOT inert on the shipped defaults — measured 3 years x 7 markets at 15m

Market buys return before return after
BTC 107 → 105 +9.59% +8.86%
ETH 153 → 153 +3.02% +3.20%
ADA 138 → 138 −38.10% −38.10%
DOGE 142 → 142 −30.81% −30.81%
LINK 123 → 123 −19.22% −19.22%
SOL 62 → 62 +33.84% +33.84%
XRP 154 → 154 −0.87% −0.87%

I expected this to be a no-op and said so before measuring it. It is not. ATR(50) on a quiet 15-minute bar falls under the 0.373% per-side cost line on BTC, so the strategy had been quoting inside its own round-trip cost on its own shipped defaults — the precise condition the setting exists to prevent, reached without anyone touching a slider. The effect is not uniformly favourable: BTC gives up 0.73 points and ETH gains 0.18, with the median across the seven unchanged. Widening a spread trades fill count for edge per fill and the sign of that trade depends on the market. This is a correctness repair, not a performance one.

The fix. Put a floor under the gap between the two quotes, set at what one side of a round trip costs after the rebate. The strategy can quote wider than that whenever its volatility measure says to; it can no longer quote narrower than the cost of the trade.

The two GUI labels are corrected to say per-side and basis points, so the numbers an operator types mean what the strategy does with them.

Effect on live behaviour. Yes, and it was measured. The floor binds on BTC and ETH and changes nothing on the other five markets. BTC loses 0.73 points of return and two buys; ETH gains 0.18 points. The median across seven markets is unchanged at −0.87%. The trades it removes are the ones that were being taken inside the strategy's own cost line.

Scope beyond this strategy. All 34 neutral-mm strategies in this pack carry both settings and not one of them reads either. Measured with a recording proxy over the config object, fee and rebate are untouched on every path in every file. The repair changes behaviour, so it goes in per strategy with its own measurement rather than being applied across the family in one sweep.


It is called VWAP, it says VWAP, and it runs EMA

Severity DEFECT · Surface documentation · Sites 1

The description at the top of the file said the strategy anchors to a rolling volume-weighted average price over 50 bars, with a medium inventory skew of 1.0 and a band of 0.75 times a 14-bar volatility measure.

The settings it actually ships are an exponential moving average over 382 bars, a skew of 3.32, and a band of 4.35 times a 50-bar volatility measure. Not one of the five numbers in that sentence is the number in the file — and the volume-weighted average the strategy is named after is not what it uses.

The same drift runs through the family. The "medium" variant advertises half the inventory skew of the "heavy" one and actually ships very slightly more, so the two are the same strategy while presenting as a deliberate pair.

Why it matters. These files are a menu. An operator picks one out of a list of 429 on the strength of its name and its one-line description, and cannot see the config block from the GUI at all. Someone who wants a VWAP-anchored maker will choose this file, and will not get one.

The fix. The description is regenerated from the settings the file actually ships, so it cannot drift again without those settings changing. It is replaced whole rather than patched, because substituting the right number into "medium skew" still leaves a word that was only meaningful as a comparison to the other variants. The old sentence is kept underneath and labelled, as the only remaining record of what the strategy was originally tuned to be.

The filename is deliberately left alone. Renaming it would break the configuration of anyone already running it, to fix a comment. Instead the header now says plainly that the name says VWAP, the file runs an exponential moving average, and which setting to change if the name was what you wanted.

Effect on live behaviour. None. Comment text only — no setting, price or gate is touched.

Scope beyond this strategy. 27 of the 34 neutral-mm strategies describe settings they do not ship, and 17 carry the false claim in the filename. ASkewMM_Heavy is the control that still matches, and its defaults are round numbers — EMA 50, ATR 14, mult 1.0, skew 2.0 — while every drifted file carries six-decimal values like 4.3533. An optimiser sweep re-tuned the defaults and nothing re-wrote the prose or the names.


185 of its 186 sells said what price filled and never what the round trip made

Severity DEFECT · Surface console logs · Sites 1

A sale was announced with the price that filled, the size, and how much inventory was left — and nothing at all about the money. Of 186 sales across three years, 185 went into the record with no explanation attached. Neither the audit nor an operator watching the live log could tell whether any of them was made above or below what the inventory had cost.

There is a fair argument that a market maker has no exit reason to report: nothing decided to sell, a resting quote was simply touched. But it still has a break-even on what it holds, and the platform publishes that figure on every cycle. The missing number was already there for the taking.

Why it matters. An exit that cannot be named cannot be counted, and the counts are how a strategy is understood. An operator reading the live log could see that a quote had been hit and not whether it had made money.

The fix. Name the fill for what it is — a resting quote that was hit — and print what it made against the average cost of the inventory, in the same shape the rest of the pack uses.

The exit ladder after the change — and the number it was hiding

before after
exits the ladder could name 1 of 186 865 of 865
mean realised gain per fill not recorded −0.19%
summed over all fills not recorded −165%
worst single fill not recorded −33.11%

Effect on live behaviour. None. No price, size or gate is touched — only the text of a log line.

Scope beyond this strategy. All 34 neutral-mm files write this same line. the audit tooling anchors the exit ladder on the fills the engine executed and then asks the strategy's own log why each one happened, so this shape puts an entire family's exits in the unexplained column.