---
name: spyderweb47/Strategy Skill
source: https://app.decimal.ai/s/spyderweb47-strategy-skill@1/SKILL.md
source_sha256: a4c3940bcdb7
---

# Strategy Skill

## Purpose

Take a structured strategy configuration — entry/exit conditions, TP/SL,
drawdown limits, seed capital — and produce a **runnable JavaScript strategy
script** that returns `{trades, equity}`. After the script is backtested,
the same skill can analyze the results and suggest concrete improvements.

This skill is the counterpart to the Pattern Skill: instead of *finding*
historical patterns, it *trades* them (or any other hypothesis).

## When to use this skill

Vibe Trade should dispatch to the Strategy Skill when the user:

- Wants to **build a new strategy** from scratch — activate
  `chatbox.card.strategy_builder` to show the structured form in the chat
- Has submitted the **Strategy Builder form** — generate the JS from
  `context.strategy_config`
- Asks to **analyze backtest results** — use `context.analyze_results` plus
  the strategy config to produce an assessment + suggestions
- Wants to **iterate** on an existing strategy (tweak TP/SL, change the
  entry rule) — regenerate from the updated config

## Instructions

1. **If no `strategy_config` is in context**, show the structured form:
   - Emit `chatbox.card.strategy_builder` to inject the form into the chat
   - Respond with a brief prompt like "Fill in the fields and I'll generate
     a runnable strategy for you."

2. **If `strategy_config` is present and `mode = "generate"`** (default):
   - Generate a JS strategy script that:
     - Defines every indicator helper it uses (don't assume `sma()` exists)
     - Handles edge cases (bounds check, initial lookback period)
     - Tracks `maxAdverseExcursion` / `maxFavorableExcursion` per trade
     - Pushes to the `equity` array on every bar (not just on trade events)
     - Respects the max drawdown limit
   - Emit `script_editor.load` with the full script
   - Emit `bottom_panel.activate_tab` → `portfolio`

3. **If `mode = "analyze"`** (backtest results in `context.analyze_results`):
   - Produce a 2–3 sentence overall assessment (profitability + risk)
   - Call out specific strengths and weaknesses in the metrics
   - Return 3–5 concrete improvement suggestions as `data.suggestions`
   - Do NOT regenerate the script — only analysis in this mode

4. **Never** touch the script generation without a config. Free-form
   strategy chat (without a structured config) should be handled as a
   general chat fallback, not by this skill.

## Inputs

| Key | Type | Meaning |
|---|---|---|
| `context.mode` | `"generate"` \| `"analyze"` | Which operation to run (default: generate) |
| `context.strategy_config` | object | Full strategy config from the form |
| `context.analyze_results` | object | Backtest metrics (analyze mode only) |

`strategy_config` shape:

```js
{
  entryCondition: string,
  exitCondition: string,
  takeProfit: { type: "percentage" | "absolute", value: number },
  stopLoss: { type: "percentage" | "absolute", value: number },
  maxDrawdown: number,    // percent
  seedAmount: number,     // USD
  specialInstructions: string
}
```

## Outputs

**Generate mode:**
- `reply` — short confirmation ("Strategy script generated.")
- `script` — JavaScript strategy returning `{trades, equity}`
- `script_type` — `"strategy"`
- `data.config` — echoes the config (for persistence)
- `tool_calls` — load + activate portfolio tab

**Analyze mode:**
- `reply` — 2–3 sentence assessment
- `data.suggestions` — 3–5 improvement suggestions
- `tool_calls` — none (analyze is read-only)

## Tools used

| Tool | When | Payload |
|---|---|---|
| `chatbox.card.strategy_builder` | User wants to build a strategy but no config yet | — |
| `script_editor.load` | Strategy generated | The JS source |
| `script_editor.run` | User asks to backtest immediately | — |
| `bottom_panel.activate_tab` | After generating | `"portfolio"` |
| `bottom_panel.set_data` | Push analysis data into a tab | `{target, data}` |
| `chart.draw_markers` | Visualize entry/exit points on the chart | `Marker[]` |
| `notify.toast` | Status updates ("Backtest complete: 42 trades") | `{level, message}` |

## Examples

**Generate**
Config: Entry = `SMA(20) > SMA(50)`, Exit = `SMA(20) < SMA(50)`, TP = 5%,
SL = 2%, Max DD = 20%, Seed = $10,000.

→ Returns a strategy script with inline `sma()` helper, golden-cross entry
logic, per-trade PnL + MAE/MFE tracking, equity-curve pushes on every bar.
Loads into the editor; bottom panel switches to Portfolio.

**Analyze**
Metrics: 42 trades, 38% win rate, 1.1 profit factor, -18% max drawdown.

→ "Marginal profitability, asymmetric losses are hurting overall returns."
Suggestions: tighten stop to 1.5%, add an ATR volatility filter, require
`ADX > 25` for trend regime, etc.

## Underlying implementation

Wired through `core/agents/processors.py::_strategy_processor`, which calls
`core/agents/strategy_agent.py::StrategyAgent.generate_from_config` or
`.analyze_results` depending on `context.mode`. The agent owns
`STRATEGY_GENERATE_PROMPT` and `STRATEGY_ANALYSIS_PROMPT`.