BenAwf

BenAwf remote MCP for Strategy Lab. Streamable HTTP. Paper GA; live venue beta.

Should I use this

Quality & Safety

A
Description quality
90%
Schema completeness
94%
Naming quality
93%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (4)

  • LOWTool 'get_lineage' description lacks action verbin get_lineage
  • LOWTool 'list_trades' description lacks action verbin list_trades
  • LOWTool 'diff_dsl' description lacks action verbin diff_dsl
  • LOWTool 'get_market_context_by_date' description lacks action verbin get_market_context_by_date

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~10,615Tokens (tool definitions)
~6.7 KBTypical response size
Significant attention impact (8.29% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "mcp": {
      "url": "https://api.benawf.com/mcp"
    }
  }
}

Remote endpoints

https://api.benawf.com/mcpstreamable-http

What it can do

Tool inventory

Tools (16)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢list_iterations(strategy_id)

Open Lab @R# rows as the same dump as Live rules (parent, headline @B#, Long/Position/Exit).

Input Schema

{
  "type": "object",
  "properties": {
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_lineage(strategy_id)

Champion @R#, per-iteration verdicts, levers tried/untried/failed on champion, converged flag, and user canvas view vs recommended working @R#.

Input Schema

{
  "type": "object",
  "properties": {
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡select_iteration(ref, strategy_id)

Load an @R# onto the live canvas so mutate tools edit that iteration.

Input Schema

{
  "type": "object",
  "properties": {
    "ref": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "description": "@R# to load onto the canvas (usually champion)."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "ref"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡add_entry_gate(side, condition, strategy_id)

Add one AND entry gate. Args: side + condition JSON. You are the DSL translator. Invent the section JSON (condition/position/exit/cooldown). Browser applies only — BenAwf does not call an LLM. No prose text.

Input Schema

{
  "type": "object",
  "properties": {
    "side": {
      "type": "string",
      "enum": [
        "long",
        "short"
      ],
      "description": "entry.long or entry.short."
    },
    "condition": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "comparison"
            },
            "left": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "price"
                    },
                    "field": {
                      "type": "string",
                      "enum": [
                        "open",
                        "high",
                        "low",
                        "close"
                      ],
                      "description": "Bar field: open, high, low, or close (default close). Ignored at `lookback: 0` (live ticker). At `lookback >= 1` returns this OHLC field of bar N back — enables wick/rejection patterns (e.g. high pierced a level then close reclaimed)."
                    },
                    "timeframeMinutes": {
                      "type": "integer",
                      "description": "Chart timeframe (5, 15, 60, 240, or 1440 minutes) the lookback resolves against. `lookback: 0` returns the live ticker price (timeframe-independent); `lookback >= 1` returns the chosen `field` of bar N back on this timeframe."
                    },
                    "lookback": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 20,
                      "description": "How many bars back to look. 0 = latest bar, 1 = one bar ago, etc. Max 20."
                    }
                  },
                  "required": [
                    "kind",
                    "field",
                    "timeframeMinutes",
                    "lookback"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "constant"
                    },
                    "value": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "kind",
                    "value"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "indicator"
                    },
                    "name": {
                      "type": "string",
                      "description": "Indicator name. One of: SMA20, SMA50, EMA, RSI, ADX, MACD, BBANDS, ATR, ATR_PCT, VWAP, OBV, OBV_CHANGE, LAST_DAY_HIGH, LAST_DAY_LOW, LAST_WEEK_HIGH, LAST_WEEK_LOW, SWING_HIGH, SWING_LOW, BOS, CHOCH, DISPLACEMENT, VOLUME_PROFILE, DEALING_RANGE."
                    },
                    "field": {
                      "type": "string",
                      "enum": [
                        "value",
                        "signal",
                        "histogram",
                        "upper",
                        "middle",
                        "lower",
                        "poc",
                        "vah",
                        "val",
                        "equilibrium",
                        "premium_pct"
                      ],
                      "description": "Sub-field for composite indicators: MACD uses signal/histogram, BBANDS uses upper/middle/lower, VOLUME_PROFILE uses poc/vah/val, DEALING_RANGE uses equilibrium/premium_pct. Use value for scalar indicators."
                    },
                    "timeframeMinutes": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes",
                      "description": "Chart timeframe: 5, 15, 60, 240 (4h), or 1440 (daily) minutes."
                    },
                    "lookback": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/lookback"
                    },
                    "params": {
                      "type": "object",
                      "properties": {
                        "wing": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 10
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Pivot wing for SWING_HIGH/SWING_LOW/BOS/CHOCH/DEALING_RANGE: bars required on each side to confirm a pivot. Default 3. Smaller (1–2) = short-term structure, larger (4–10) = major swings only."
                        },
                        "atrMult": {
                          "anyOf": [
                            {
                              "type": "number",
                              "minimum": 0.5,
                              "maximum": 5
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "ATR(14) multiplier for DISPLACEMENT: bar range must exceed atrMult × ATR to count as displacement. Default 1.5."
                        },
                        "lookbackBars": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "minimum": 10,
                              "maximum": 100
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Rolling window length for VOLUME_PROFILE (bars ending at the current closed bar). Default 48. Must fit the entry-rules indicator window (≤100)."
                        }
                      },
                      "required": [
                        "wing",
                        "atrMult",
                        "lookbackBars"
                      ],
                      "additionalProperties": false,
                      "description": "Optional indicator parameters (e.g. swing pivot wing, VOLUME_PROFILE lookbackBars). Empty object = defaults."
                    }
                  },
                  "required": [
                    "kind",
                    "name",
                    "field",
                    "timeframeMinutes",
                    "lookback",
                    "params"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "zone"
                    },
                    "zoneType": {
                      "type": "string",
                      "enum": [
                        "fvg_bull",
                        "fvg_bear",
                        "ob_bull",
                        "ob_bear"
                      ],
                      "description": "fvg_bull/fvg_bear = 3-candle fair value gap (imbalance). ob_bull/ob_bear = last opposite-close candle before a displacement bar (order block)."
                    },
                    "state": {
                      "type": "string",
                      "enum": [
                        "open",
                        "tapped",
                        "mitigated"
                      ],
                      "description": "Which zones to consider: open = untouched, tapped = wick entered but no close through, mitigated = closed beyond the far edge. Default open."
                    },
                    "field": {
                      "type": "string",
                      "enum": [
                        "top",
                        "bottom",
                        "mid"
                      ],
                      "description": "Zone price level: top or bottom edge, or mid (midpoint — the FVG 'consequent encroachment'). Default mid."
                    },
                    "timeframeMinutes": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes",
                      "description": "Chart timeframe the zone detection runs on: 5, 15, 60, 240 (4h), or 1440 (daily) minutes."
                    },
                    "lookback": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/lookback"
                    }
                  },
                  "required": [
                    "kind",
                    "zoneType",
                    "state",
                    "field",
                    "timeframeMinutes",
                    "lookback"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "derived"
                    },
                    "fn": {
                      "type": "string",
                      "enum": [
                        "spread",
                        "ratio",
                        "abs_distance_pct"
                      ],
                      "description": "spread = a - b (same units as inputs). ratio = a / b (fails when b is 0). abs_distance_pct = |a - b| / |b| * 100 (percent points — same scale as ATR_PCT and SL/TP)."
                    },
                    "a": {
                      "anyOf": [
                        {
                          "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0"
                        },
                        {
                          "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/1"
                        },
                        {
                          "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/2"
                        },
                        {
                          "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/3"
                        }
                      ],
                      "description": "First input — a primitive operand (price, indicator, or constant). No nesting."
                    },
                    "b": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/4/properties/a",
                      "description": "Second input — a primitive operand (price, indicator, or constant). No nesting."
                    }
                  },
                  "required": [
                    "kind",
                    "fn",
                    "a",
                    "b"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "op": {
              "type": "string",
              "enum": [
                "gt",
                "lt",
                "gte",
                "lte",
                "crosses_above",
                "crosses_below"
              ],
              "description": "Comparison operator. crosses_above/crosses_below require previous bar context."
            },
            "right": {
              "$ref": "#/properties/condition/anyOf/0/properties/left"
            }
          },
          "required": [
            "kind",
            "left",
            "op",
            "right"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "time_window"
            },
            "startUtc": {
              "type": "string",
              "description": "Window start, inclusive (e.g. \"09:30\" for the New York killzone open)."
            },
            "endUtc": {
              "$ref": "#/properties/condition/anyOf/1/properties/startUtc",
              "description": "Window end, exclusive. Earlier than startUtc = overnight window (e.g. \"02:00\" with start \"22:00\"). Equal to startUtc = always in window."
            },
            "timeframeMinutes": {
              "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes",
              "description": "Chart timeframe whose latest closed bar provides the clock. Use 5 or 15 for killzone precision."
            }
          },
          "required": [
            "kind",
            "startUtc",
            "endUtc",
            "timeframeMinutes"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "day_of_week"
            },
            "days": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "sun",
                  "mon",
                  "tue",
                  "wed",
                  "thu",
                  "fri",
                  "sat"
                ]
              },
              "minItems": 1,
              "maxItems": 7,
              "description": "Allowed UTC weekdays (e.g. omit \"fri\" to skip Friday)."
            },
            "timeframeMinutes": {
              "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes",
              "description": "Chart timeframe whose latest closed bar provides the clock. Use 5 or 15 for precision."
            }
          },
          "required": [
            "kind",
            "days",
            "timeframeMinutes"
          ],
          "additionalProperties": false
        }
      ],
      "description": "Translator-shaped entry gate condition."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "side",
    "condition"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡patch_entry_gate(id, condition, strategy_id)

Replace one entry gate by id. Args: id + condition JSON. You are the DSL translator. Invent the section JSON (condition/position/exit/cooldown). Browser applies only — BenAwf does not call an LLM. No prose text.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "description": "Gate id from get_experiment.rules.entry."
    },
    "condition": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "comparison"
            },
            "left": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "price"
                    },
                    "field": {
                      "type": "string",
                      "enum": [
                        "open",
                        "high",
                        "low",
                        "close"
                      ],
                      "description": "Bar field: open, high, low, or close (default close). Ignored at `lookback: 0` (live ticker). At `lookback >= 1` returns this OHLC field of bar N back — enables wick/rejection patterns (e.g. high pierced a level then close reclaimed)."
                    },
                    "timeframeMinutes": {
                      "type": "integer",
                      "description": "Chart timeframe (5, 15, 60, 240, or 1440 minutes) the lookback resolves against. `lookback: 0` returns the live ticker price (timeframe-independent); `lookback >= 1` returns the chosen `field` of bar N back on this timeframe."
                    },
                    "lookback": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 20,
                      "description": "How many bars back to look. 0 = latest bar, 1 = one bar ago, etc. Max 20."
                    }
                  },
                  "required": [
                    "kind",
                    "field",
                    "timeframeMinutes",
                    "lookback"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "constant"
                    },
                    "value": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "kind",
                    "value"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "indicator"
                    },
                    "name": {
                      "type": "string",
                      "description": "Indicator name. One of: SMA20, SMA50, EMA, RSI, ADX, MACD, BBANDS, ATR, ATR_PCT, VWAP, OBV, OBV_CHANGE, LAST_DAY_HIGH, LAST_DAY_LOW, LAST_WEEK_HIGH, LAST_WEEK_LOW, SWING_HIGH, SWING_LOW, BOS, CHOCH, DISPLACEMENT, VOLUME_PROFILE, DEALING_RANGE."
                    },
                    "field": {
                      "type": "string",
                      "enum": [
                        "value",
                        "signal",
                        "histogram",
                        "upper",
                        "middle",
                        "lower",
                        "poc",
                        "vah",
                        "val",
                        "equilibrium",
                        "premium_pct"
                      ],
                      "description": "Sub-field for composite indicators: MACD uses signal/histogram, BBANDS uses upper/middle/lower, VOLUME_PROFILE uses poc/vah/val, DEALING_RANGE uses equilibrium/premium_pct. Use value for scalar indicators."
                    },
                    "timeframeMinutes": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes",
                      "description": "Chart timeframe: 5, 15, 60, 240 (4h), or 1440 (daily) minutes."
                    },
                    "lookback": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/lookback"
                    },
                    "params": {
                      "type": "object",
                      "properties": {
                        "wing": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 10
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Pivot wing for SWING_HIGH/SWING_LOW/BOS/CHOCH/DEALING_RANGE: bars required on each side to confirm a pivot. Default 3. Smaller (1–2) = short-term structure, larger (4–10) = major swings only."
                        },
                        "atrMult": {
                          "anyOf": [
                            {
                              "type": "number",
                              "minimum": 0.5,
                              "maximum": 5
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "ATR(14) multiplier for DISPLACEMENT: bar range must exceed atrMult × ATR to count as displacement. Default 1.5."
                        },
                        "lookbackBars": {
                          "anyOf": [
                            {
                              "type": "integer",
                              "minimum": 10,
                              "maximum": 100
                            },
                            {
                              "type": "null"
                            }
                          ],
                          "description": "Rolling window length for VOLUME_PROFILE (bars ending at the current closed bar). Default 48. Must fit the entry-rules indicator window (≤100)."
                        }
                      },
                      "required": [
                        "wing",
                        "atrMult",
                        "lookbackBars"
                      ],
                      "additionalProperties": false,
                      "description": "Optional indicator parameters (e.g. swing pivot wing, VOLUME_PROFILE lookbackBars). Empty object = defaults."
                    }
                  },
                  "required": [
                    "kind",
                    "name",
                    "field",
                    "timeframeMinutes",
                    "lookback",
                    "params"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "zone"
                    },
                    "zoneType": {
                      "type": "string",
                      "enum": [
                        "fvg_bull",
                        "fvg_bear",
                        "ob_bull",
                        "ob_bear"
                      ],
                      "description": "fvg_bull/fvg_bear = 3-candle fair value gap (imbalance). ob_bull/ob_bear = last opposite-close candle before a displacement bar (order block)."
                    },
                    "state": {
                      "type": "string",
                      "enum": [
                        "open",
                        "tapped",
                        "mitigated"
                      ],
                      "description": "Which zones to consider: open = untouched, tapped = wick entered but no close through, mitigated = closed beyond the far edge. Default open."
                    },
                    "field": {
                      "type": "string",
                      "enum": [
                        "top",
                        "bottom",
                        "mid"
                      ],
                      "description": "Zone price level: top or bottom edge, or mid (midpoint — the FVG 'consequent encroachment'). Default mid."
                    },
                    "timeframeMinutes": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes",
                      "description": "Chart timeframe the zone detection runs on: 5, 15, 60, 240 (4h), or 1440 (daily) minutes."
                    },
                    "lookback": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/lookback"
                    }
                  },
                  "required": [
                    "kind",
                    "zoneType",
                    "state",
                    "field",
                    "timeframeMinutes",
                    "lookback"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "derived"
                    },
                    "fn": {
                      "type": "string",
                      "enum": [
                        "spread",
                        "ratio",
                        "abs_distance_pct"
                      ],
                      "description": "spread = a - b (same units as inputs). ratio = a / b (fails when b is 0). abs_distance_pct = |a - b| / |b| * 100 (percent points — same scale as ATR_PCT and SL/TP)."
                    },
                    "a": {
                      "anyOf": [
                        {
                          "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0"
                        },
                        {
                          "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/1"
                        },
                        {
                          "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/2"
                        },
                        {
                          "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/3"
                        }
                      ],
                      "description": "First input — a primitive operand (price, indicator, or constant). No nesting."
                    },
                    "b": {
                      "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/4/properties/a",
                      "description": "Second input — a primitive operand (price, indicator, or constant). No nesting."
                    }
                  },
                  "required": [
                    "kind",
                    "fn",
                    "a",
                    "b"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "op": {
              "type": "string",
              "enum": [
                "gt",
                "lt",
                "gte",
                "lte",
                "crosses_above",
                "crosses_below"
              ],
              "description": "Comparison operator. crosses_above/crosses_below require previous bar context."
            },
            "right": {
              "$ref": "#/properties/condition/anyOf/0/properties/left"
            }
          },
          "required": [
            "kind",
            "left",
            "op",
            "right"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "time_window"
            },
            "startUtc": {
              "type": "string",
              "description": "Window start, inclusive (e.g. \"09:30\" for the New York killzone open)."
            },
            "endUtc": {
              "$ref": "#/properties/condition/anyOf/1/properties/startUtc",
              "description": "Window end, exclusive. Earlier than startUtc = overnight window (e.g. \"02:00\" with start \"22:00\"). Equal to startUtc = always in window."
            },
            "timeframeMinutes": {
              "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes",
              "description": "Chart timeframe whose latest closed bar provides the clock. Use 5 or 15 for killzone precision."
            }
          },
          "required": [
            "kind",
            "startUtc",
            "endUtc",
            "timeframeMinutes"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "day_of_week"
            },
            "days": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "sun",
                  "mon",
                  "tue",
                  "wed",
                  "thu",
                  "fri",
                  "sat"
                ]
              },
              "minItems": 1,
              "maxItems": 7,
              "description": "Allowed UTC weekdays (e.g. omit \"fri\" to skip Friday)."
            },
            "timeframeMinutes": {
              "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes",
              "description": "Chart timeframe whose latest closed bar provides the clock. Use 5 or 15 for precision."
            }
          },
          "required": [
            "kind",
            "days",
            "timeframeMinutes"
          ],
          "additionalProperties": false
        }
      ],
      "description": "Translator-shaped replacement condition."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "id",
    "condition"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴delete_entry_gate(id, strategy_id)

Remove one entry gate by id (from get_experiment). Args: id only. Refuses when it would leave both long and short with zero gates.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "description": "Gate id shown in Live rules or get_experiment."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡patch_position(position, strategy_id)

Full replace of rules.position. Args: position JSON. You are the DSL translator. Invent the section JSON (condition/position/exit/cooldown). Browser applies only — BenAwf does not call an LLM. No prose text.

Input Schema

{
  "type": "object",
  "properties": {
    "position": {
      "type": "object",
      "properties": {
        "usdAmount": {
          "type": "number",
          "minimum": 0,
          "description": "Fixed USD notional when the rule fires. Use 0 when sizing via balancePercent."
        },
        "balancePercent": {
          "type": "number",
          "minimum": 0,
          "maximum": 100,
          "description": "Percent of available balance to deploy (0–100 scale) when the rule fires. Use 0 when sizing via usdAmount."
        },
        "orderType": {
          "type": "string",
          "enum": [
            "market",
            "limit"
          ]
        },
        "limitPrice": {
          "anyOf": [
            {
              "type": "number",
              "exclusiveMinimum": 0
            },
            {
              "type": "null"
            }
          ],
          "description": "Limit price when orderType is limit; null for market orders."
        },
        "expiresInMinutes": {
          "anyOf": [
            {
              "type": "number",
              "exclusiveMinimum": 0
            },
            {
              "type": "null"
            }
          ],
          "description": "Limit order TTL in minutes; null when not used."
        },
        "usedTechnicalAnalysisIndicators": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Indicators that justify this entry (one of: SMA20, SMA50, EMA, RSI, ADX, MACD, BBANDS, ATR, ATR_PCT, VWAP, OBV, OBV_CHANGE, LAST_DAY_HIGH, LAST_DAY_LOW, LAST_WEEK_HIGH, LAST_WEEK_LOW, SWING_HIGH, SWING_LOW, BOS, CHOCH, DISPLACEMENT, VOLUME_PROFILE, DEALING_RANGE) — use [] when none. Never list zone types (fvg_bull, fvg_bear, ob_bull, ob_bear); those belong on zone operands."
        }
      },
      "required": [
        "usdAmount",
        "balancePercent",
        "orderType",
        "limitPrice",
        "expiresInMinutes",
        "usedTechnicalAnalysisIndicators"
      ],
      "additionalProperties": false,
      "description": "Full replace of rules.position (not a merge). Every key required. usdAmount XOR balancePercent (unused = 0). orderType = market|limit. limitPrice + expiresInMinutes = number | null (null unless limit). usedTechnicalAnalysisIndicators = string[] ([] if none; never zone types)."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "position"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡patch_exit(exit, strategy_id)

Full replace of rules.exit. Args: exit JSON. You are the DSL translator. Invent the section JSON (condition/position/exit/cooldown). Browser applies only — BenAwf does not call an LLM. No prose text.

Input Schema

{
  "type": "object",
  "properties": {
    "exit": {
      "type": "object",
      "properties": {
        "stopLossPercentage": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 100,
              "description": "Fixed stop/TP distance on the 0–100 scale (original shape)."
            },
            {
              "type": "object",
              "properties": {
                "source": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "price"
                        },
                        "field": {
                          "type": "string",
                          "enum": [
                            "open",
                            "high",
                            "low",
                            "close"
                          ],
                          "description": "Bar field: open, high, low, or close (default close). Ignored at `lookback: 0` (live ticker). At `lookback >= 1` returns this OHLC field of bar N back — enables wick/rejection patterns (e.g. high pierced a level then close reclaimed)."
                        },
                        "timeframeMinutes": {
                          "type": "integer",
                          "description": "Chart timeframe (5, 15, 60, 240, or 1440 minutes) the lookback resolves against. `lookback: 0` returns the live ticker price (timeframe-independent); `lookback >= 1` returns the chosen `field` of bar N back on this timeframe."
                        },
                        "lookback": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 20,
                          "description": "How many bars back to look. 0 = latest bar, 1 = one bar ago, etc. Max 20."
                        }
                      },
                      "required": [
                        "kind",
                        "field",
                        "timeframeMinutes",
                        "lookback"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "constant"
                        },
                        "value": {
                          "type": "number"
                        }
                      },
                      "required": [
                        "kind",
                        "value"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "indicator"
                        },
                        "name": {
                          "type": "string",
                          "description": "Indicator name. One of: SMA20, SMA50, EMA, RSI, ADX, MACD, BBANDS, ATR, ATR_PCT, VWAP, OBV, OBV_CHANGE, LAST_DAY_HIGH, LAST_DAY_LOW, LAST_WEEK_HIGH, LAST_WEEK_LOW, SWING_HIGH, SWING_LOW, BOS, CHOCH, DISPLACEMENT, VOLUME_PROFILE, DEALING_RANGE."
                        },
                        "field": {
                          "type": "string",
                          "enum": [
                            "value",
                            "signal",
                            "histogram",
                            "upper",
                            "middle",
                            "lower",
                            "poc",
                            "vah",
                            "val",
                            "equilibrium",
                            "premium_pct"
                          ],
                          "description": "Sub-field for composite indicators: MACD uses signal/histogram, BBANDS uses upper/middle/lower, VOLUME_PROFILE uses poc/vah/val, DEALING_RANGE uses equilibrium/premium_pct. Use value for scalar indicators."
                        },
                        "timeframeMinutes": {
                          "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/0/properties/timeframeMinutes",
                          "description": "Chart timeframe: 5, 15, 60, 240 (4h), or 1440 (daily) minutes."
                        },
                        "lookback": {
                          "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/0/properties/lookback"
                        },
                        "params": {
                          "type": "object",
                          "properties": {
                            "wing": {
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 10
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "Pivot wing for SWING_HIGH/SWING_LOW/BOS/CHOCH/DEALING_RANGE: bars required on each side to confirm a pivot. Default 3. Smaller (1–2) = short-term structure, larger (4–10) = major swings only."
                            },
                            "atrMult": {
                              "anyOf": [
                                {
                                  "type": "number",
                                  "minimum": 0.5,
                                  "maximum": 5
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "ATR(14) multiplier for DISPLACEMENT: bar range must exceed atrMult × ATR to count as displacement. Default 1.5."
                            },
                            "lookbackBars": {
                              "anyOf": [
                                {
                                  "type": "integer",
                                  "minimum": 10,
                                  "maximum": 100
                                },
                                {
                                  "type": "null"
                                }
                              ],
                              "description": "Rolling window length for VOLUME_PROFILE (bars ending at the current closed bar). Default 48. Must fit the entry-rules indicator window (≤100)."
                            }
                          },
                          "required": [
                            "wing",
                            "atrMult",
                            "lookbackBars"
                          ],
                          "additionalProperties": false,
                          "description": "Optional indicator parameters (e.g. swing pivot wing, VOLUME_PROFILE lookbackBars). Empty object = defaults."
                        }
                      },
                      "required": [
                        "kind",
                        "name",
                        "field",
                        "timeframeMinutes",
                        "lookback",
                        "params"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "zone"
                        },
                        "zoneType": {
                          "type": "string",
                          "enum": [
                            "fvg_bull",
                            "fvg_bear",
                            "ob_bull",
                            "ob_bear"
                          ],
                          "description": "fvg_bull/fvg_bear = 3-candle fair value gap (imbalance). ob_bull/ob_bear = last opposite-close candle before a displacement bar (order block)."
                        },
                        "state": {
                          "type": "string",
                          "enum": [
                            "open",
                            "tapped",
                            "mitigated"
                          ],
                          "description": "Which zones to consider: open = untouched, tapped = wick entered but no close through, mitigated = closed beyond the far edge. Default open."
                        },
                        "field": {
                          "type": "string",
                          "enum": [
                            "top",
                            "bottom",
                            "mid"
                          ],
                          "description": "Zone price level: top or bottom edge, or mid (midpoint — the FVG 'consequent encroachment'). Default mid."
                        },
                        "timeframeMinutes": {
                          "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/0/properties/timeframeMinutes",
                          "description": "Chart timeframe the zone detection runs on: 5, 15, 60, 240 (4h), or 1440 (daily) minutes."
                        },
                        "lookback": {
                          "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/0/properties/lookback"
                        }
                      },
                      "required": [
                        "kind",
                        "zoneType",
                        "state",
                        "field",
                        "timeframeMinutes",
                        "lookback"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "derived"
                        },
                        "fn": {
                          "type": "string",
                          "enum": [
                            "spread",
                            "ratio",
                            "abs_distance_pct"
                          ],
                          "description": "spread = a - b (same units as inputs). ratio = a / b (fails when b is 0). abs_distance_pct = |a - b| / |b| * 100 (percent points — same scale as ATR_PCT and SL/TP)."
                        },
                        "a": {
                          "anyOf": [
                            {
                              "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/0"
                            },
                            {
                              "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/1"
                            },
                            {
                              "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/2"
                            },
                            {
                              "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/3"
                            }
                          ],
                          "description": "First input — a primitive operand (price, indicator, or constant). No nesting."
                        },
                        "b": {
                          "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/4/properties/a",
                          "description": "Second input — a primitive operand (price, indicator, or constant). No nesting."
                        }
                      },
                      "required": [
                        "kind",
                        "fn",
                        "a",
                        "b"
                      ],
                      "additionalProperties": false
                    }
                  ],
                  "description": "Operand resolved at rule-fire time (latest fully closed bar). Any indicator, price field, or derived expression."
                },
                "op": {
                  "type": "string",
                  "enum": [
                    "multiply",
                    "add"
                  ],
                  "description": "multiply = resolved(source) × value; add = resolved(source) + value."
                },
                "value": {
                  "type": "number",
                  "description": "Multiplier or addend applied after resolving source."
                },
                "minPercentage": {
                  "anyOf": [
                    {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Floor on the resolved 0–100 distance after op. Null disables."
                },
                "maxPercentage": {
                  "anyOf": [
                    {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 100
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Ceiling on the resolved 0–100 distance after op. Null disables."
                },
                "fallbackPercentage": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100,
                  "description": "Fixed 0–100 distance used when source resolves null (indicator warmup)."
                }
              },
              "required": [
                "source",
                "op",
                "value",
                "minPercentage",
                "maxPercentage",
                "fallbackPercentage"
              ],
              "additionalProperties": false
            }
          ],
          "description": "Stop-loss distance from entry on the 0–100 scale, or a dynamic expression resolved at fire time. 0 disables SL."
        },
        "takeProfitPercentage": {
          "anyOf": [
            {
              "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/0"
            },
            {
              "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1"
            }
          ],
          "description": "Take-profit distance from entry on the 0–100 scale, or a dynamic expression resolved at fire time."
        },
        "partialExitsAt": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "pricePercentage": {
                    "type": "number",
                    "exclusiveMinimum": -1,
                    "exclusiveMaximum": 1,
                    "description": "Signed decimal move from entry (-1 to 1). Percent as fraction: -0.005 = -0.5%, 0.03 = +3%. Not the 0–100 scale used by stopLossPercentage."
                  },
                  "exitAmountFraction": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "exclusiveMaximum": 1,
                    "description": "Fraction of the remaining position to liquidate when this level is hit"
                  }
                },
                "required": [
                  "pricePercentage",
                  "exitAmountFraction"
                ],
                "additionalProperties": false
              }
            },
            {
              "type": "null"
            }
          ],
          "description": "Ladder of partial exits. Null means no partial exits."
        },
        "trail": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "number"
              },
              "minItems": 2,
              "maxItems": 2
            },
            {
              "type": "null"
            }
          ],
          "description": "Trail config: [fire, extend]. Null disables. extend > 0 chains (re-arm after each bump); extend = 0 locks SL at the fire price once then clears. fire = fraction of current TP distance (0–1 exclusive); extend = TP multiplier add-on (0 = fire-price lock one-shot)."
        },
        "breakevenAfterMinutes": {
          "anyOf": [
            {
              "type": "number",
              "exclusiveMinimum": 0
            },
            {
              "type": "null"
            }
          ],
          "description": "Soft TTL: minutes after open at which the engine intervenes. If the trade is in profit, it closes at market to lock in the gain. If underwater, SL moves to break-even. Null disables."
        },
        "maxHoldMinutes": {
          "anyOf": [
            {
              "type": "number",
              "exclusiveMinimum": 0
            },
            {
              "type": "null"
            }
          ],
          "description": "Hard TTL: force close at market after this many minutes regardless of PnL. Null disables."
        },
        "signalExit": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "long": {
                  "type": "array",
                  "items": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "comparison"
                          },
                          "left": {
                            "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source"
                          },
                          "op": {
                            "type": "string",
                            "enum": [
                              "gt",
                              "lt",
                              "gte",
                              "lte",
                              "crosses_above",
                              "crosses_below"
                            ],
                            "description": "Comparison operator. crosses_above/crosses_below require previous bar context."
                          },
                          "right": {
                            "$ref": "#/properties/exit/properties/signalExit/anyOf/0/properties/long/items/anyOf/0/properties/left"
                          }
                        },
                        "required": [
                          "kind",
                          "left",
                          "op",
                          "right"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "time_window"
                          },
                          "startUtc": {
                            "type": "string",
                            "description": "Window start, inclusive (e.g. \"09:30\" for the New York killzone open)."
                          },
                          "endUtc": {
                            "$ref": "#/properties/exit/properties/signalExit/anyOf/0/properties/long/items/anyOf/1/properties/startUtc",
                            "description": "Window end, exclusive. Earlier than startUtc = overnight window (e.g. \"02:00\" with start \"22:00\"). Equal to startUtc = always in window."
                          },
                          "timeframeMinutes": {
                            "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/0/properties/timeframeMinutes",
                            "description": "Chart timeframe whose latest closed bar provides the clock. Use 5 or 15 for killzone precision."
                          }
                        },
                        "required": [
                          "kind",
                          "startUtc",
                          "endUtc",
                          "timeframeMinutes"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "kind": {
                            "type": "string",
                            "const": "day_of_week"
                          },
                          "days": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "enum": [
                                "sun",
                                "mon",
                                "tue",
                                "wed",
                                "thu",
                                "fri",
                                "sat"
                              ]
                            },
                            "minItems": 1,
                            "maxItems": 7,
                            "description": "Allowed UTC weekdays (e.g. omit \"fri\" to skip Friday)."
                          },
                          "timeframeMinutes": {
                            "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/0/properties/timeframeMinutes",
                            "description": "Chart timeframe whose latest closed bar provides the clock. Use 5 or 15 for precision."
                          }
                        },
                        "required": [
                          "kind",
                          "days",
                          "timeframeMinutes"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  }
                },
                "short": {
                  "type": "array",
                  "items": {
                    "$ref": "#/properties/exit/properties/signalExit/anyOf/0/properties/long/items"
                  }
                }
              },
              "required": [
                "long",
                "short"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "Optional indicator-based exit: closes the position at market when these conditions fire (evaluated on the same cadence as entries). Same condition shape as entry blocks. Use for mean-reversion targets (e.g. close crosses VWAP) or thesis-invalidation exits instead of relying only on fixed TP. Null disables."
        }
      },
      "required": [
        "stopLossPercentage",
        "takeProfitPercentage",
        "partialExitsAt",
        "trail",
        "breakevenAfterMinutes",
        "maxHoldMinutes",
        "signalExit"
      ],
      "additionalProperties": false,
      "description": "Full replace of rules.exit (not a merge). Every key required — null disables: stopLossPercentage + takeProfitPercentage = 0–100 number OR {source,op,value,fallbackPercentage,minPercentage,maxPercentage}; partialExitsAt = [{pricePercentage, exitAmountFraction}] | null (pricePercentage is a decimal fraction: 0.03 = +3%, NOT the 0–100 SL/TP scale); trail = [fire, extend] | null (fire in (0,1), extend >= 0; NOT {fire,extend}); breakevenAfterMinutes + maxHoldMinutes = number | null; signalExit = {long, short} condition arrays | null. Cooldown lives on the rules root (op=patch_cooldown), not here."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "exit"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡patch_cooldown(cooldownMinutes, strategy_id)

Set root cooldownMinutes. Args: cooldownMinutes number|null. You are the DSL translator. Invent the section JSON (condition/position/exit/cooldown). Browser applies only — BenAwf does not call an LLM. No prose text.

Input Schema

{
  "type": "object",
  "properties": {
    "cooldownMinutes": {
      "anyOf": [
        {
          "type": "number",
          "exclusiveMinimum": 0
        },
        {
          "type": "null"
        }
      ],
      "description": "Root cooldownMinutes, or null to clear."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "cooldownMinutes"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_strategies(limit, offset, strategy_id)

Ids, @R# refs, and backtest headlines for strategies not currently open.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "exclusiveMinimum": 0
    },
    "offset": {
      "type": "integer",
      "minimum": 0
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_backtests(iteration_ref, strategy_id)

Open Lab @B# rows with window, assets, trade count, PnL, win rate, drawdown, and tape_stripped.

Input Schema

{
  "type": "object",
  "properties": {
    "iteration_ref": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "description": "Optional @R#. Omit to retrieve backtests across all iterations."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "additionalProperties": false,
  "description": "@B# rows with window, PnL, trades, DD, tape_stripped.",
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_backtest(ref, force, config, strategy_id)

Cache-or-run one sim for an @R# + window, then return Score, trade count, PnL, drawdown, and bounded stats for one run. Numbers only — no BenAwf assessment LLM; you analyze. Same @R# + window → cached @B# (identical stats; follow the comment). After any mutate pass that result's dsl_ref. If you changed rules behind the same R#/draft, or suspect a stale cached @B#, pass force:true to force a fresh sim — never extrapolate from a cached B# of a different rules state.

Input Schema

{
  "type": "object",
  "properties": {
    "ref": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "description": "@R# to sim. After mutate use that result's dsl_ref, not the Live-rules header."
    },
    "force": {
      "type": "boolean",
      "description": "Skip the cache and force a fresh sim for this @R# + window. Use after any rule change on the same R#/draft, or whenever a cached B# is suspect."
    },
    "config": {
      "type": "object",
      "properties": {
        "asset": {
          "type": "string",
          "enum": [
            "BTC",
            "ETH",
            "SOL",
            "XRP",
            "BNB",
            "LTC",
            "LINK",
            "DOGE",
            "PEPE",
            "SHIB",
            "SPY",
            "QQQ",
            "IWM",
            "DIA",
            "VOO",
            "XLF",
            "XLE",
            "XLK",
            "XLV",
            "XLP",
            "XLY",
            "XLU",
            "XLI",
            "XLB",
            "XLRE",
            "XLC",
            "SMH",
            "ARKK",
            "GLD",
            "SLV",
            "TLT",
            "HYG",
            "EEM",
            "AAPL",
            "MSFT",
            "GOOGL",
            "AMZN",
            "NVDA",
            "META",
            "TSLA",
            "AVGO",
            "ORCL",
            "ADBE",
            "CRM",
            "AMD",
            "QCOM",
            "TXN",
            "INTC",
            "INTU",
            "IBM",
            "NOW",
            "AMAT",
            "MU",
            "ARM",
            "MRVL",
            "PANW",
            "CRWD",
            "DDOG",
            "NET",
            "SNOW",
            "PLTR",
            "SMCI",
            "DELL",
            "APP",
            "SHOP",
            "UBER",
            "ABNB",
            "NFLX",
            "COIN",
            "HOOD",
            "PYPL",
            "JPM",
            "BAC",
            "WFC",
            "C",
            "GS",
            "MS",
            "V",
            "MA",
            "AXP",
            "SCHW",
            "BLK",
            "SPGI",
            "CME",
            "COF",
            "UNH",
            "JNJ",
            "LLY",
            "PFE",
            "MRK",
            "ABBV",
            "TMO",
            "ABT",
            "AMGN",
            "ISRG",
            "MDT",
            "BMY",
            "GILD",
            "CVS",
            "WMT",
            "COST",
            "HD",
            "MCD",
            "NKE",
            "SBUX",
            "TGT",
            "LOW",
            "PG",
            "KO",
            "PEP",
            "PM",
            "MO",
            "CL",
            "EL",
            "DIS",
            "BKNG",
            "MAR",
            "CAT",
            "DE",
            "BA",
            "GE",
            "HON",
            "UPS",
            "RTX",
            "LMT",
            "XOM",
            "CVX",
            "COP",
            "SLB",
            "NEE",
            "DUK",
            "SO",
            "F",
            "T",
            "VZ",
            "CMCSA",
            "TMUS",
            "XAUUSD",
            "XAGUSD"
          ],
          "description": "Single symbol to sim (e.g. BTC)."
        },
        "start_date": {
          "type": "string",
          "format": "date-time"
        },
        "end_date": {
          "type": "string",
          "format": "date-time"
        },
        "initial_balance": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "max_drawdown": {
          "type": "number",
          "minimum": 0.01,
          "maximum": 100
        }
      },
      "required": [
        "asset",
        "start_date",
        "end_date",
        "initial_balance",
        "max_drawdown"
      ],
      "additionalProperties": false,
      "description": "Window + capital. Omit to reuse the previous run's window. Do not send empty strings or zeros."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "ref"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_trades(ref, page, sort, strategy_id)

One page of fills (20 per page): trade_id, side, prices, PnL.

Input Schema

{
  "type": "object",
  "properties": {
    "ref": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "Backtest @B# ref (e.g. B3 or @B3)."
    },
    "page": {
      "type": "integer",
      "minimum": 1
    },
    "sort": {
      "type": "string",
      "enum": [
        "open_date",
        "pnl"
      ]
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "ref",
    "page",
    "sort"
  ],
  "additionalProperties": false,
  "description": "One page of tape fills (20/page).",
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_experiment(ref, strategy_id)

Prose summary plus rules JSON (entry gates with ids, position, exit, cooldownMinutes) and that iteration's @B# refs. Read before inventing translator-shaped mutate args.

Input Schema

{
  "type": "object",
  "properties": {
    "ref": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "description": "DSL iteration ref @R# (e.g. R2 or @R2)."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "ref"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪diff_dsl(ref_a, ref_b, strategy_id)

Structured rules diff between two @R# iterations (entry gates per side, position, exit, cooldown). Use before adopting an older iteration's levers onto a newer one.

Input Schema

{
  "type": "object",
  "properties": {
    "ref_a": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "description": "First @R# to compare (older / baseline)."
    },
    "ref_b": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32,
      "description": "Second @R# to compare (newer)."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "ref_a",
    "ref_b"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_market_context_by_date(symbol, date, time_frame, strategy_id)

OHLCV and cited indicators around that date (engine lookback each side).

Input Schema

{
  "type": "object",
  "properties": {
    "symbol": {
      "type": "string",
      "enum": [
        "BTC",
        "ETH",
        "SOL",
        "XRP",
        "BNB",
        "LTC",
        "LINK",
        "DOGE",
        "PEPE",
        "SHIB",
        "SPY",
        "QQQ",
        "IWM",
        "DIA",
        "VOO",
        "XLF",
        "XLE",
        "XLK",
        "XLV",
        "XLP",
        "XLY",
        "XLU",
        "XLI",
        "XLB",
        "XLRE",
        "XLC",
        "SMH",
        "ARKK",
        "GLD",
        "SLV",
        "TLT",
        "HYG",
        "EEM",
        "AAPL",
        "MSFT",
        "GOOGL",
        "AMZN",
        "NVDA",
        "META",
        "TSLA",
        "AVGO",
        "ORCL",
        "ADBE",
        "CRM",
        "AMD",
        "QCOM",
        "TXN",
        "INTC",
        "INTU",
        "IBM",
        "NOW",
        "AMAT",
        "MU",
        "ARM",
        "MRVL",
        "PANW",
        "CRWD",
        "DDOG",
        "NET",
        "SNOW",
        "PLTR",
        "SMCI",
        "DELL",
        "APP",
        "SHOP",
        "UBER",
        "ABNB",
        "NFLX",
        "COIN",
        "HOOD",
        "PYPL",
        "JPM",
        "BAC",
        "WFC",
        "C",
        "GS",
        "MS",
        "V",
        "MA",
        "AXP",
        "SCHW",
        "BLK",
        "SPGI",
        "CME",
        "COF",
        "UNH",
        "JNJ",
        "LLY",
        "PFE",
        "MRK",
        "ABBV",
        "TMO",
        "ABT",
        "AMGN",
        "ISRG",
        "MDT",
        "BMY",
        "GILD",
        "CVS",
        "WMT",
        "COST",
        "HD",
        "MCD",
        "NKE",
        "SBUX",
        "TGT",
        "LOW",
        "PG",
        "KO",
        "PEP",
        "PM",
        "MO",
        "CL",
        "EL",
        "DIS",
        "BKNG",
        "MAR",
        "CAT",
        "DE",
        "BA",
        "GE",
        "HON",
        "UPS",
        "RTX",
        "LMT",
        "XOM",
        "CVX",
        "COP",
        "SLB",
        "NEE",
        "DUK",
        "SO",
        "F",
        "T",
        "VZ",
        "CMCSA",
        "TMUS",
        "XAUUSD",
        "XAGUSD"
      ]
    },
    "date": {
      "type": "string",
      "format": "date-time"
    },
    "time_frame": {
      "type": "number",
      "enum": [
        1,
        5,
        15,
        30,
        60,
        240,
        1440
      ],
      "description": "OHLCV timeframe in minutes: 1, 5, 15, 30, 60, 240, 1440."
    },
    "strategy_id": {
      "type": "string",
      "minLength": 1,
      "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open."
    }
  },
  "required": [
    "symbol",
    "date",
    "time_frame"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Recommended Prompts

list_items
List all [items] available in BenAwf
Expected tools: list_iterations
explore_workflow
List available [items], then get details for each one using BenAwf
Expected tools: list_iterationsget_lineage
fetch_info
Fetch [information type] using BenAwf
Expected tools: get_lineage
retrieve_data
Get details about [item] from BenAwf
Expected tools: get_lineage
browse_collection
Show me the [collection] from BenAwf
Expected tools: list_iterations

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded16 tools
verifiedversion not recorded16 tools
verifiedversion not recorded16 tools
verifiedversion not recorded16 tools
verifiedversion not recorded16 tools
verifiedversion not recorded16 tools