Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,539Letters: 14Defects: 1,323counted 2 min ago
teppi

Server definition

Hash
sha256:6b63ee6cce95eea69d5779f1adad75f484f4729cab2f791118083b0cc501f67b
What it is
What a remote MCP server returned when asked what it offers: 16 tools

The blob, as servednamed by its sha256

{ "instructions": "BenAwf MCP: you are the DSL translator. BenAwf does not call an LLM for your tools.\n\n**Requirement:** Strategy Lab visual-editor tab must stay open on the target strategy so the browser emits lab presence and answers tool invokes. Copying MCP URL + API key into the agent (Connect MCP) does not open Lab by itself.\nIf you get 409 NO_ACTIVE_LAB, tell the user: keep that Lab tab open (not just MCP connected), open `lab_url` from the error if needed, then retry. After key rotate, update the bearer token in the MCP client.\nAlways pass `strategy_id` when known so the error includes a direct Lab link.\n\nMutate tools take translator-shaped JSON (condition / position / exit / cooldownMinutes) — not prose text.\nBrowser applies only. get_backtest returns numbers only (you analyze).\n\n**Cache semantics:** get_backtest caches by (@R#, window) — same @R# + same window already simmed returns\nthat cached @B# with identical stats (comment = \"Cached @B#\"). After any mutate pass the result's dsl_ref, and\npass `force: true` whenever rules changed on the same R#/draft or a cached @B# is suspect (comment = \"Fresh sim @B#\").\nThe host also remaps a stale prior R# to the live dirty canvas — never trust a cached @B# for a rules state you changed.\n\nDiscover DSL via resources: benawf://strategy-reference, benawf://rules-entry-mode, benawf://mcp-agent-workflow, benawf://product.\nUsers who are not signed in: use prompt get_started or resource benawf://onboarding — they explain how to create an account and connect an API key.\nNo load_skill / report_user_goal / ask_user / load_tools.\n\nOptional strategy_id on every tool routes to the matching Lab tab.", "tools": [ { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "condition": { "anyOf": [ { "additionalProperties": false, "properties": { "kind": { "const": "comparison", "type": "string" }, "left": { "anyOf": [ { "additionalProperties": false, "properties": { "field": { "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).", "enum": [ "open", "high", "low", "close" ], "type": "string" }, "kind": { "const": "price", "type": "string" }, "lookback": { "description": "How many bars back to look. 0 = latest bar, 1 = one bar ago, etc. Max 20.", "maximum": 20, "minimum": 0, "type": "integer" }, "timeframeMinutes": { "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.", "type": "integer" } }, "required": [ "kind", "field", "timeframeMinutes", "lookback" ], "type": "object" }, { "additionalProperties": false, "properties": { "kind": { "const": "constant", "type": "string" }, "value": { "type": "number" } }, "required": [ "kind", "value" ], "type": "object" }, { "additionalProperties": false, "properties": { "field": { "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.", "enum": [ "value", "signal", "histogram", "upper", "middle", "lower", "poc", "vah", "val", "equilibrium", "premium_pct" ], "type": "string" }, "kind": { "const": "indicator", "type": "string" }, "lookback": { "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/lookback" }, "name": { "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.", "type": "string" }, "params": { "additionalProperties": false, "description": "Optional indicator parameters (e.g. swing pivot wing, VOLUME_PROFILE lookbackBars). Empty object = defaults.", "properties": { "atrMult": { "anyOf": [ { "maximum": 5, "minimum": 0.5, "type": "number" }, { "type": "null" } ], "description": "ATR(14) multiplier for DISPLACEMENT: bar range must exceed atrMult × ATR to count as displacement. Default 1.5." }, "lookbackBars": { "anyOf": [ { "maximum": 100, "minimum": 10, "type": "integer" }, { "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)." }, "wing": { "anyOf": [ { "maximum": 10, "minimum": 1, "type": "integer" }, { "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." } }, "required": [ "wing", "atrMult", "lookbackBars" ], "type": "object" }, "timeframeMinutes": { "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes", "description": "Chart timeframe: 5, 15, 60, 240 (4h), or 1440 (daily) minutes." } }, "required": [ "kind", "name", "field", "timeframeMinutes", "lookback", "params" ], "type": "object" }, { "additionalProperties": false, "properties": { "field": { "description": "Zone price level: top or bottom edge, or mid (midpoint — the FVG 'consequent encroachment'). Default mid.", "enum": [ "top", "bottom", "mid" ], "type": "string" }, "kind": { "const": "zone", "type": "string" }, "lookback": { "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/lookback" }, "state": { "description": "Which zones to consider: open = untouched, tapped = wick entered but no close through, mitigated = closed beyond the far edge. Default open.", "enum": [ "open", "tapped", "mitigated" ], "type": "string" }, "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." }, "zoneType": { "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).", "enum": [ "fvg_bull", "fvg_bear", "ob_bull", "ob_bear" ], "type": "string" } }, "required": [ "kind", "zoneType", "state", "field", "timeframeMinutes", "lookback" ], "type": "object" }, { "additionalProperties": false, "properties": { "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." }, "fn": { "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).", "enum": [ "spread", "ratio", "abs_distance_pct" ], "type": "string" }, "kind": { "const": "derived", "type": "string" } }, "required": [ "kind", "fn", "a", "b" ], "type": "object" } ] }, "op": { "description": "Comparison operator. crosses_above/crosses_below require previous bar context.", "enum": [ "gt", "lt", "gte", "lte", "crosses_above", "crosses_below" ], "type": "string" }, "right": { "$ref": "#/properties/condition/anyOf/0/properties/left" } }, "required": [ "kind", "left", "op", "right" ], "type": "object" }, { "additionalProperties": false, "properties": { "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." }, "kind": { "const": "time_window", "type": "string" }, "startUtc": { "description": "Window start, inclusive (e.g. \"09:30\" for the New York killzone open).", "type": "string" }, "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" ], "type": "object" }, { "additionalProperties": false, "properties": { "days": { "description": "Allowed UTC weekdays (e.g. omit \"fri\" to skip Friday).", "items": { "enum": [ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ], "type": "string" }, "maxItems": 7, "minItems": 1, "type": "array" }, "kind": { "const": "day_of_week", "type": "string" }, "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" ], "type": "object" } ], "description": "Translator-shaped entry gate condition." }, "side": { "description": "entry.long or entry.short.", "enum": [ "long", "short" ], "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "side", "condition" ], "type": "object" }, "name": "add_entry_gate", "outputSchema": null }, { "description": "Remove one entry gate by id (from get_experiment). Args: id only. Refuses when it would leave both long and short with zero gates.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "id": { "description": "Gate id from get_experiment.rules.entry.", "maxLength": 32, "minLength": 1, "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "delete_entry_gate", "outputSchema": null }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "ref_a": { "description": "First @R# to compare (older / baseline).", "maxLength": 32, "minLength": 1, "type": "string" }, "ref_b": { "description": "Second @R# to compare (newer).", "maxLength": 32, "minLength": 1, "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "ref_a", "ref_b" ], "type": "object" }, "name": "diff_dsl", "outputSchema": null }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "config": { "additionalProperties": false, "description": "Window + capital. Omit to reuse the previous run. Do not send empty strings or zeros.", "properties": { "asset": { "description": "Single symbol to sim (e.g. BTC).", "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" ], "type": "string" }, "end_date": { "format": "date-time", "type": "string" }, "initial_balance": { "exclusiveMinimum": 0, "type": "number" }, "max_drawdown": { "maximum": 100, "minimum": 0.01, "type": "number" }, "start_date": { "format": "date-time", "type": "string" } }, "required": [ "asset", "start_date", "end_date", "initial_balance", "max_drawdown" ], "type": "object" }, "force": { "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.", "type": "boolean" }, "ref": { "description": "@R# to sim. After mutate use that result's dsl_ref, not the Live-rules header.", "maxLength": 32, "minLength": 1, "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "ref" ], "type": "object" }, "name": "get_backtest", "outputSchema": null }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "ref": { "description": "DSL iteration ref @R# (e.g. R2 or @R2).", "maxLength": 32, "minLength": 1, "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "ref" ], "type": "object" }, "name": "get_experiment", "outputSchema": null }, { "description": "Champion @R#, per-iteration verdicts, levers tried/untried/failed on champion, converged flag, and user canvas view vs recommended working @R#.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "type": "object" }, "name": "get_lineage", "outputSchema": null }, { "description": "OHLCV and cited indicators around that date (engine lookback each side).", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "date": { "format": "date-time", "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" }, "symbol": { "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" ], "type": "string" }, "time_frame": { "description": "OHLCV timeframe in minutes: 1, 5, 15, 30, 60, 240, 1440.", "enum": [ 1, 5, 15, 30, 60, 240, 1440 ], "type": "number" } }, "required": [ "symbol", "date", "time_frame" ], "type": "object" }, "name": "get_market_context_by_date", "outputSchema": null }, { "description": "Open Lab @B# rows with window, assets, trade count, PnL, win rate, drawdown, and tape_stripped.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "description": "@B# rows with window, PnL, trades, DD, tape_stripped.", "properties": { "iteration_ref": { "description": "Optional @R#. Omit to retrieve backtests across all iterations.", "maxLength": 32, "minLength": 1, "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "type": "object" }, "name": "list_backtests", "outputSchema": null }, { "description": "Open Lab @R# rows as the same dump as Live rules (parent, headline @B#, Long/Position/Exit).", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "type": "object" }, "name": "list_iterations", "outputSchema": null }, { "description": "Ids, @R# refs, and backtest headlines for strategies not currently open.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "limit": { "exclusiveMinimum": 0, "type": "integer" }, "offset": { "minimum": 0, "type": "integer" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "type": "object" }, "name": "list_strategies", "outputSchema": null }, { "description": "One page of fills (20 per page): trade_id, side, prices, PnL.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "description": "One page of tape fills (20/page).", "properties": { "page": { "minimum": 1, "type": "integer" }, "ref": { "description": "Backtest @B# ref (e.g. B3 or @B3).", "maxLength": 128, "minLength": 1, "type": "string" }, "sort": { "enum": [ "open_date", "pnl" ], "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "ref", "page", "sort" ], "type": "object" }, "name": "list_trades", "outputSchema": null }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "cooldownMinutes": { "anyOf": [ { "exclusiveMinimum": 0, "type": "number" }, { "type": "null" } ], "description": "Root cooldownMinutes, or null to clear." }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "cooldownMinutes" ], "type": "object" }, "name": "patch_cooldown", "outputSchema": null }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "condition": { "anyOf": [ { "additionalProperties": false, "properties": { "kind": { "const": "comparison", "type": "string" }, "left": { "anyOf": [ { "additionalProperties": false, "properties": { "field": { "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).", "enum": [ "open", "high", "low", "close" ], "type": "string" }, "kind": { "const": "price", "type": "string" }, "lookback": { "description": "How many bars back to look. 0 = latest bar, 1 = one bar ago, etc. Max 20.", "maximum": 20, "minimum": 0, "type": "integer" }, "timeframeMinutes": { "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.", "type": "integer" } }, "required": [ "kind", "field", "timeframeMinutes", "lookback" ], "type": "object" }, { "additionalProperties": false, "properties": { "kind": { "const": "constant", "type": "string" }, "value": { "type": "number" } }, "required": [ "kind", "value" ], "type": "object" }, { "additionalProperties": false, "properties": { "field": { "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.", "enum": [ "value", "signal", "histogram", "upper", "middle", "lower", "poc", "vah", "val", "equilibrium", "premium_pct" ], "type": "string" }, "kind": { "const": "indicator", "type": "string" }, "lookback": { "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/lookback" }, "name": { "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.", "type": "string" }, "params": { "additionalProperties": false, "description": "Optional indicator parameters (e.g. swing pivot wing, VOLUME_PROFILE lookbackBars). Empty object = defaults.", "properties": { "atrMult": { "anyOf": [ { "maximum": 5, "minimum": 0.5, "type": "number" }, { "type": "null" } ], "description": "ATR(14) multiplier for DISPLACEMENT: bar range must exceed atrMult × ATR to count as displacement. Default 1.5." }, "lookbackBars": { "anyOf": [ { "maximum": 100, "minimum": 10, "type": "integer" }, { "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)." }, "wing": { "anyOf": [ { "maximum": 10, "minimum": 1, "type": "integer" }, { "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." } }, "required": [ "wing", "atrMult", "lookbackBars" ], "type": "object" }, "timeframeMinutes": { "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/timeframeMinutes", "description": "Chart timeframe: 5, 15, 60, 240 (4h), or 1440 (daily) minutes." } }, "required": [ "kind", "name", "field", "timeframeMinutes", "lookback", "params" ], "type": "object" }, { "additionalProperties": false, "properties": { "field": { "description": "Zone price level: top or bottom edge, or mid (midpoint — the FVG 'consequent encroachment'). Default mid.", "enum": [ "top", "bottom", "mid" ], "type": "string" }, "kind": { "const": "zone", "type": "string" }, "lookback": { "$ref": "#/properties/condition/anyOf/0/properties/left/anyOf/0/properties/lookback" }, "state": { "description": "Which zones to consider: open = untouched, tapped = wick entered but no close through, mitigated = closed beyond the far edge. Default open.", "enum": [ "open", "tapped", "mitigated" ], "type": "string" }, "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." }, "zoneType": { "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).", "enum": [ "fvg_bull", "fvg_bear", "ob_bull", "ob_bear" ], "type": "string" } }, "required": [ "kind", "zoneType", "state", "field", "timeframeMinutes", "lookback" ], "type": "object" }, { "additionalProperties": false, "properties": { "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." }, "fn": { "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).", "enum": [ "spread", "ratio", "abs_distance_pct" ], "type": "string" }, "kind": { "const": "derived", "type": "string" } }, "required": [ "kind", "fn", "a", "b" ], "type": "object" } ] }, "op": { "description": "Comparison operator. crosses_above/crosses_below require previous bar context.", "enum": [ "gt", "lt", "gte", "lte", "crosses_above", "crosses_below" ], "type": "string" }, "right": { "$ref": "#/properties/condition/anyOf/0/properties/left" } }, "required": [ "kind", "left", "op", "right" ], "type": "object" }, { "additionalProperties": false, "properties": { "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." }, "kind": { "const": "time_window", "type": "string" }, "startUtc": { "description": "Window start, inclusive (e.g. \"09:30\" for the New York killzone open).", "type": "string" }, "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" ], "type": "object" }, { "additionalProperties": false, "properties": { "days": { "description": "Allowed UTC weekdays (e.g. omit \"fri\" to skip Friday).", "items": { "enum": [ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ], "type": "string" }, "maxItems": 7, "minItems": 1, "type": "array" }, "kind": { "const": "day_of_week", "type": "string" }, "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" ], "type": "object" } ], "description": "Translator-shaped replacement condition." }, "id": { "description": "Gate id from get_experiment.rules.entry.", "maxLength": 32, "minLength": 1, "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "id", "condition" ], "type": "object" }, "name": "patch_entry_gate", "outputSchema": null }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "exit": { "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.", "properties": { "breakevenAfterMinutes": { "anyOf": [ { "exclusiveMinimum": 0, "type": "number" }, { "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": [ { "exclusiveMinimum": 0, "type": "number" }, { "type": "null" } ], "description": "Hard TTL: force close at market after this many minutes regardless of PnL. Null disables." }, "partialExitsAt": { "anyOf": [ { "items": { "additionalProperties": false, "properties": { "exitAmountFraction": { "description": "Fraction of the remaining position to liquidate when this level is hit", "exclusiveMaximum": 1, "exclusiveMinimum": 0, "type": "number" }, "pricePercentage": { "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.", "exclusiveMaximum": 1, "exclusiveMinimum": -1, "type": "number" } }, "required": [ "pricePercentage", "exitAmountFraction" ], "type": "object" }, "type": "array" }, { "type": "null" } ], "description": "Ladder of partial exits. Null means no partial exits." }, "signalExit": { "anyOf": [ { "additionalProperties": false, "properties": { "long": { "items": { "anyOf": [ { "additionalProperties": false, "properties": { "kind": { "const": "comparison", "type": "string" }, "left": { "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source" }, "op": { "description": "Comparison operator. crosses_above/crosses_below require previous bar context.", "enum": [ "gt", "lt", "gte", "lte", "crosses_above", "crosses_below" ], "type": "string" }, "right": { "$ref": "#/properties/exit/properties/signalExit/anyOf/0/properties/long/items/anyOf/0/properties/left" } }, "required": [ "kind", "left", "op", "right" ], "type": "object" }, { "additionalProperties": false, "properties": { "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." }, "kind": { "const": "time_window", "type": "string" }, "startUtc": { "description": "Window start, inclusive (e.g. \"09:30\" for the New York killzone open).", "type": "string" }, "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" ], "type": "object" }, { "additionalProperties": false, "properties": { "days": { "description": "Allowed UTC weekdays (e.g. omit \"fri\" to skip Friday).", "items": { "enum": [ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ], "type": "string" }, "maxItems": 7, "minItems": 1, "type": "array" }, "kind": { "const": "day_of_week", "type": "string" }, "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" ], "type": "object" } ] }, "type": "array" }, "short": { "items": { "$ref": "#/properties/exit/properties/signalExit/anyOf/0/properties/long/items" }, "type": "array" } }, "required": [ "long", "short" ], "type": "object" }, { "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." }, "stopLossPercentage": { "anyOf": [ { "description": "Fixed stop/TP distance on the 0–100 scale (original shape).", "maximum": 100, "minimum": 0, "type": "number" }, { "additionalProperties": false, "properties": { "fallbackPercentage": { "description": "Fixed 0–100 distance used when source resolves null (indicator warmup).", "maximum": 100, "minimum": 0, "type": "number" }, "maxPercentage": { "anyOf": [ { "maximum": 100, "minimum": 0, "type": "number" }, { "type": "null" } ], "description": "Ceiling on the resolved 0–100 distance after op. Null disables." }, "minPercentage": { "anyOf": [ { "maximum": 100, "minimum": 0, "type": "number" }, { "type": "null" } ], "description": "Floor on the resolved 0–100 distance after op. Null disables." }, "op": { "description": "multiply = resolved(source) × value; add = resolved(source) + value.", "enum": [ "multiply", "add" ], "type": "string" }, "source": { "anyOf": [ { "additionalProperties": false, "properties": { "field": { "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).", "enum": [ "open", "high", "low", "close" ], "type": "string" }, "kind": { "const": "price", "type": "string" }, "lookback": { "description": "How many bars back to look. 0 = latest bar, 1 = one bar ago, etc. Max 20.", "maximum": 20, "minimum": 0, "type": "integer" }, "timeframeMinutes": { "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.", "type": "integer" } }, "required": [ "kind", "field", "timeframeMinutes", "lookback" ], "type": "object" }, { "additionalProperties": false, "properties": { "kind": { "const": "constant", "type": "string" }, "value": { "type": "number" } }, "required": [ "kind", "value" ], "type": "object" }, { "additionalProperties": false, "properties": { "field": { "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.", "enum": [ "value", "signal", "histogram", "upper", "middle", "lower", "poc", "vah", "val", "equilibrium", "premium_pct" ], "type": "string" }, "kind": { "const": "indicator", "type": "string" }, "lookback": { "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/0/properties/lookback" }, "name": { "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.", "type": "string" }, "params": { "additionalProperties": false, "description": "Optional indicator parameters (e.g. swing pivot wing, VOLUME_PROFILE lookbackBars). Empty object = defaults.", "properties": { "atrMult": { "anyOf": [ { "maximum": 5, "minimum": 0.5, "type": "number" }, { "type": "null" } ], "description": "ATR(14) multiplier for DISPLACEMENT: bar range must exceed atrMult × ATR to count as displacement. Default 1.5." }, "lookbackBars": { "anyOf": [ { "maximum": 100, "minimum": 10, "type": "integer" }, { "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)." }, "wing": { "anyOf": [ { "maximum": 10, "minimum": 1, "type": "integer" }, { "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." } }, "required": [ "wing", "atrMult", "lookbackBars" ], "type": "object" }, "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." } }, "required": [ "kind", "name", "field", "timeframeMinutes", "lookback", "params" ], "type": "object" }, { "additionalProperties": false, "properties": { "field": { "description": "Zone price level: top or bottom edge, or mid (midpoint — the FVG 'consequent encroachment'). Default mid.", "enum": [ "top", "bottom", "mid" ], "type": "string" }, "kind": { "const": "zone", "type": "string" }, "lookback": { "$ref": "#/properties/exit/properties/stopLossPercentage/anyOf/1/properties/source/anyOf/0/properties/lookback" }, "state": { "description": "Which zones to consider: open = untouched, tapped = wick entered but no close through, mitigated = closed beyond the far edge. Default open.", "enum": [ "open", "tapped", "mitigated" ], "type": "string" }, "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." }, "zoneType": { "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).", "enum": [ "fvg_bull", "fvg_bear", "ob_bull", "ob_bear" ], "type": "string" } }, "required": [ "kind", "zoneType", "state", "field", "timeframeMinutes", "lookback" ], "type": "object" }, { "additionalProperties": false, "properties": { "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." }, "fn": { "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).", "enum": [ "spread", "ratio", "abs_distance_pct" ], "type": "string" }, "kind": { "const": "derived", "type": "string" } }, "required": [ "kind", "fn", "a", "b" ], "type": "object" } ], "description": "Operand resolved at rule-fire time (latest fully closed bar). Any indicator, price field, or derived expression." }, "value": { "description": "Multiplier or addend applied after resolving source.", "type": "number" } }, "required": [ "source", "op", "value", "minPercentage", "maxPercentage", "fallbackPercentage" ], "type": "object" } ], "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." }, "trail": { "anyOf": [ { "items": { "type": "number" }, "maxItems": 2, "minItems": 2, "type": "array" }, { "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)." } }, "required": [ "stopLossPercentage", "takeProfitPercentage", "partialExitsAt", "trail", "breakevenAfterMinutes", "maxHoldMinutes", "signalExit" ], "type": "object" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "exit" ], "type": "object" }, "name": "patch_exit", "outputSchema": null }, { "description": "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.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "position": { "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).", "properties": { "balancePercent": { "description": "Percent of available balance to deploy (0–100 scale) when the rule fires. Use 0 when sizing via usdAmount.", "maximum": 100, "minimum": 0, "type": "number" }, "expiresInMinutes": { "anyOf": [ { "exclusiveMinimum": 0, "type": "number" }, { "type": "null" } ], "description": "Limit order TTL in minutes; null when not used." }, "limitPrice": { "anyOf": [ { "exclusiveMinimum": 0, "type": "number" }, { "type": "null" } ], "description": "Limit price when orderType is limit; null for market orders." }, "orderType": { "enum": [ "market", "limit" ], "type": "string" }, "usdAmount": { "description": "Fixed USD notional when the rule fires. Use 0 when sizing via balancePercent.", "minimum": 0, "type": "number" }, "usedTechnicalAnalysisIndicators": { "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.", "items": { "type": "string" }, "type": "array" } }, "required": [ "usdAmount", "balancePercent", "orderType", "limitPrice", "expiresInMinutes", "usedTechnicalAnalysisIndicators" ], "type": "object" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "position" ], "type": "object" }, "name": "patch_position", "outputSchema": null }, { "description": "Load an @R# onto the live canvas so mutate tools edit that iteration.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "ref": { "description": "@R# to load onto the canvas (usually champion).", "maxLength": 32, "minLength": 1, "type": "string" }, "strategy_id": { "description": "Strategy id. Prefer always: routes to that Lab tab, and NO_ACTIVE_LAB errors include a direct Lab URL to open.", "minLength": 1, "type": "string" } }, "required": [ "ref" ], "type": "object" }, "name": "select_iteration", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:6b63ee6cce95eea69d5779f1adad75f484f4729cab2f791118083b0cc501f67b | sha256sum