Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
Fully vectorized — no iterrows(), no apply() with Python lambdas, no
loops over rows. The engine reads the signal column in bulk; a row-loop
silently produces wrong results.
The signal column holds only 1, -1 or 0 — not booleans, not floats.
Every tunable value comes from self.config.<param>.
No row loops — grep for iterrows, apply, for idx; must be zero
All params from config — no hardcoded numbers in the signal logic
Signal values — only 1, -1, 0
Column names — pandas_ta convention: EMA_{length}, RSI_{length},
ADX_{length}, MACD_{fast}_{slow}_{signal}, BBL_{length}_{std},
BBU_{length}_{std}, SUPERTd_{length}_{multiplier}. Verify against actual
output columns — a mismatch is a runtime KeyError
NaN handling — indicators emit NaN during warm-up; NaN comparisons yield
False, which correctly maps to signal = 0
signal populated for all rows — default 0, then overwritten by masks
iloc[-1], not iloc[0] — the current bar is what the engine acts on
Indicator lookback < max_records - 50 — headroom for warm-up
No look-ahead — .shift(1) wherever entry-bar logic needs it
Confirm created: true / updated: true. Add confirm_override=True when
replacing an existing template.
The controller_code string is wrapped as a Controller object by the MCP tool —
the endpoint rejects a bare source string.
A new .py may still be shadowed by the module cached in sys.modules — if the
upload succeeds but describe keeps showing the old fields, restart the API
container.
Numbers must be numbers, not strings."ema_fast": "5" reaches the
backtesting engine as a string and fails on arithmetic.
controller_name must match the controller module name (ema_cross_adx →
bots/controllers/directional_trading/ema_cross_adx.py). It is how the backend
resolves the config class.
config_name becomes the YAML filename and the config id.
Config classes set extra="forbid" — a typo'd field is a hard rejection, not a
warning. Discover the real field set with
manage_controllers(action="describe", controller_name="<name>").
confirm_override=True is required when overwriting an existing config.
Step 6 — Modifying an existing controller
Config only:
manage_controllers(action="describe", config_name="...") — read current values
Re-upsert with confirm_override=True and the updated config_data