Market make¶
Status: Live | MCP tool: strategy_market_make_create
Two-sided spread capture. Approximate -- there is no live order book; the executor synthesizes a spread from realised volatility around a rolling mid (a "filled bid" below mid buys, a "filled ask" above mid sells, up to held inventory).
Params¶
| Param | Type | Default | Meaning |
|---|---|---|---|
wallet_address |
string | required | Agent's managed wallet address. |
target_token |
string | required | Mint to quote. |
usd_per_quote |
float | required | USD size per synthesized fill. |
interval_seconds |
int | 60 |
Tick cadence. |
source_token |
string | "USDC" |
Funding token. |
mid_period |
int | 20 |
Rolling mid-price window. |
spread_lookback |
int | 20 |
Volatility lookback for the synthesized spread. |
base_spread_pct |
float | 0.002 |
Base half-spread around the rolling mid. |
vol_spread_mult |
float | 1.0 |
Volatility multiplier widening the spread. |
max_levels |
int | 5 |
Max quote levels / inventory cap. |
slippage_bps |
int | 50 |
Max slippage per fill. |
risk (optional dict, all percent units, <= 0 disables that single guard;
omitted keys keep the model's safe defaults): max_position_pct,
max_portfolio_exposure_pct, max_single_loss_pct, max_drawdown_pct,
max_daily_loss_pct.
Example create call¶
result = await client.call_tool("strategy_market_make_create", {
"wallet_address": "<AGENT_PUBLIC_KEY>",
"target_token": "So11111111111111111111111111111111111111112",
"usd_per_quote": 25,
"interval_seconds": 60,
"base_spread_pct": 0.002,
"max_levels": 5,
})
A successful create returns strategy_id, strategy_type, status,
schedule, and managed_signing (whether the wallet has a Turnkey signer --
false means each tick returns an unsigned tx to sign).
Policy interaction¶
Every create call runs through the same gate stack as a hand-built trade
before it persists: rate limiting, identity/capability check, the per-wallet
policy_gate (action strategy_create), USD-notional sizing
against policy limits (derived from the USD budget param below), an idempotency check, and the platform
kill switch.
A wallet without a Turnkey signing key still gets the strategy -- each due
tick returns an unsigned transaction for the owner to sign instead of
executing autonomously.
Market-neutral: pauses in a trending (bull/bear) regime instead of adapting direction (a maker gets run over by a directional move) -- the regime is read directly inside the executor, so direction_mode / allow_short / regime_override are not exposed on this type.
Lifecycle¶
Every strategy type shares one lifecycle surface once created:
strategy_status(strategy_id, wallet_address)-- config, state, P&L, next tick.strategy_modify(strategy_id, wallet_address, config_updates=..., risk=..., ...)-- retune in place without losing execution history; fields that define WHAT the strategy trades (target_token/source_token/tracked_wallet/venue/ a compositedefinition) are immutable and refused -- cancel and create a new strategy to change those.strategy_pause/strategy_resume-- manual pause and re-enable.strategy_cancel(strategy_id, wallet_address)-- stop for good (terminal).strategy_list(wallet_address, detail="concise"|"full")-- every strategy the wallet owns.
Full param docs for all six lifecycle tools: MCP tool reference.
See also¶
- Trading catalog -- Strategy automations
- Strategy authoring -- publishing a strategy as a clonable template.
- MCP tool reference